#	$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)
