Port-sparc64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Custom boot loader stub
On Fri, 17 Oct 2025 12:32:36 +0300
Valery Ushakov <uwe%stderr.spb.ru@localhost> wrote:
> Yes, as I said, see how sparc boot code does that: "romp",
> common/prompdev.c, and ofwboot/promlib.c - its ofw subclass. Start
> here:
>
> https://github.com/NetBSD/src/blob/d37c7118/sys/arch/sparc/stand/common/srt0.S#L152
Well, I managed to figure out how to use Open Firmware client interface.
I can print various diagnostic messages on boot:
{0} ok boot /pci@0/pci@0/pci@1/pci@0/pci@1/pci@0/usb@0,2/storage@3/disk@0
Boot device: /pci@0/pci@0/pci@1/pci@0/pci@1/pci@0/usb@0,2/storage@3/disk@0 File and args:
Running SPARC-V9 bootblk
ihandle_stdin 0xFEB51F90
ihandle_stdout 0xFEB51D88
The only issue I'm having is reading from stdin always returns -2.
I looked at Illumos src/psm/promif/ieee1275/common/prom_getchar.c
and it is very similar to my function:
int64_t ofw_read_stdin(char *strbuf, uint32_t strbuf_len)
{
ofw_cell_cdt ci_arg[7];
/* If stdin ihandle is not initialised, return -1 */
if (ihandle_stdin == (ihandle_cdt)-1) { return -1; }
ci_arg[0] = (ofw_cell_cdt)"read"; /* Service */
ci_arg[1] = (ofw_cell_cdt)3; /* Number of arguments */
ci_arg[2] = (ofw_cell_cdt)1; /* Number of return values */
ci_arg[3] = (ofw_cell_cdt)ihandle_stdin; /* Arg1: stdin ihandle */
ci_arg[4] = (ofw_cell_cdt)strbuf; /* Arg2: strbuf address */
ci_arg[5] = (ofw_cell_cdt)strbuf_len; /* Arg3: str length */
ci_arg[6] = (ofw_cell_cdt)-1; /* Ret1: return value */
/* Call into cif handler */
ofw_cif_handler(ci_arg);
return (int64_t)ci_arg[6];
}
But when I try to read 1 char from stdin:
i64 = ofw_read_stdin(strbuf, 1);
The return value is -2 and no char is read from stdin. The hex values for
stdin and stdout ihandles seem to be correct and match the ones from:
{0} ok show-props /chosen
Similar code works for stdout, so not sure if I'm missing something.
The bootblk seems to work up to 10 KiB in size, any bigger and I get
ERROR: Last Trap: Fast Data Access MMU Miss
Which I guess is expected. When I have some spare time, I will try
loading the 2nd stage bootloader and may be using "chain" function
to execute that.
Home |
Main Index |
Thread Index |
Old Index