> From what I have been able to find out so far the PROMs load block 0 of
> the boot device and depending on the information in there continue to
> load blocks in one of the following manners:
> 0) load a number of blocks starting from a start block
> 1) similar to 0 but using a a zero terminated list of (nr_of_blocks,
> start_block) ranges. This list has to fit into block 0 which limits this
> list to 61 entries.
> Another point is, if booting via multiple sequences of blocks really
> work, we don't have size restrictions on the bootloader where Ultrix and
> *BSD are limited to 7.5 KB, probably for historical reasons. Looks like
> time for some further experiments...
Ok, I wrote a small and simple utility to assemble such a list of ranges
and create a bootsector from that. Then I created a kernel image with
"objdump -O binary /usr/src/linux/vmlinux /Image" and invoked "bootprep
/Image /dev/sdb" and guess what, it worked!
I have been able to boot a whole kernel without any bootloader!
This is obviously only a short term solution, but it shows that we can
build a "second stage" bootloader of nearly arbitrary size with all the
features we want, i.e. deal with different partition tables, different
filesystems and different object formats and so on.
For those of you who want to play around with this, bootprep.c can be
downloaded from ftp.linux.sgi.com/pub/linux/mips/test/. It takes two
arguments, the first is the file to be booted which has to be in binary
format and the second is the file to which the bootsector is to be
written. The load address and the start address of the binary are
hardcoded in the source.