# $NetBSD: README.ipl,v 1.1 2014/02/24 07:23:43 skrll Exp $
Coding note:
In order to make this relocatable, you must follow following
restrictions:
1. Do not place any objects in text segment
1.1. For compiler,
(1) do not declare or define any objects to be placed in
text segment, that is, do not use ``const'' keyword
(but declaring a pointer to const is probably OK),
(2) make sure string literals, if any, are placed in data
segment (use traditional compiler),
(3) avoid initialization of automatic objects (non-static
function-local variables) of aggregate types (arrays,
structs and unions), which may implicitly emits
constant data.
In summary, do not use ANSI extension. Use traditional C. :-)
1.2. For linker, do not actually place objects in text segment.
2. Do not use function pointers.
On-disk layout:
We have 6.5KB for the primary boot.
disk address
start size
000000 0000FC LIF header
0000FC 000104 unused
000200 000194 disklabel (404 bytes for 16-partition label)
000394 00006C unused
000400 000400 ipl part 2 (1KB)
000800 000100 optional LIF directory
000900 000100 unused
000A00 000600 ipl part 3 (1.5KB)
001000 001000 ipl part 1 (4KB)
002000 (file system starts here)
On-memory layout on IPL startup:
The firmware loads ipl part 1 on the memory, and executes it.
address offset
start size
000000 001000 ipl part 1
001000 000A00 (not loaded yet)
(bss section etc)
x 001000 temporary disk buffer
x+1000 stack
Then the IPL will load the rest of itself:
ipl part 1 loads parts 2 and 3, then continues execution.
address offset
start size
000000 001000 ipl part 1
001000 000400 ipl part 2
001400 000600 ipl part 3
001A00 xxxxxx (bss section etc)