

NOTE that GRUB's own install functions can alter all of the significant
variables here...  look in the install.html file for details.

This file describes embedded variables in GRUB's stage1 and stage2 and
how they are meant to be used and manipulated.

The primary reason for them being in well-defined locations is to allow
changes/installation/etc. without needing to recompile the modules, just
patch the binary directly.


"stage1" :

NOTE: these are all defined in "stage1/stage1.S".

   --  at offset 0x1BC :  "major version"

	This is the major version byte (should be a 1).

   --  at offset 0x1BD :  "minor version"

	This is the minor version byte (should be a 0).

   --  at offset 0x1B8 :  "stage2 start address"

	This is the data for the "ljmp" command to the starting address
	of the component loaded by the stage1.  The format is two 2-byte
	words: the first is the IP, and the second is the CS segment
	register (remember, we're in x86 real-mode...  16-bit instruction
	pointer and segment registers shifted left by 4 bits).

	A "stage1.5" should be loaded at address 0x2000, and a "stage2"
	should be loaded at address 0x8000.  Both use a CS of 0.

   --  at offset 0x1B0 :  "firstlist"

	This is the ending address of the blocklist data area.

	The trick here is that it is actually read backward, and the first
	8-byte blocklist is not read here, but after the pointer is
	decremented 8 bytes, then after reading it, it decrements again,
	reads, decrements, reads, etc. until it is finished.  The
	terminating condition is when the number of sectors to be read
	in the next blocklist is 0.

	The format of a blocklist can be seen from the example in the
	code just before the "firstlist" label.  (note that it is
	always from the beginning of the disk, and *NOT* relative to
	the partition boundaries)

   --  at offset 0x1B0 :  "loading drive"

	This is the BIOS drive number to load the blocklists from.
	If the number is 0xFF, then load from the booting drive.


"stage1.5" and "stage2"  (same structure) :

NOTE: these are all defined at the beginning of "shared_src/asm.S".

   --  at offset 0x6 :  "major version"

	This is the major version byte (should be a 1).

   --  at offset 0x7 :  "minor version"

	This is the minor version byte (should be a 0).

   --  at offset 0x8 :  "install_partition"

	This is an unsigned long representing the partition on the currently
	booted disk which GRUB should expect to find it's data files and
	treat as the default root partition.

	The format of is exactly the same as the "partition" part (the "disk"
	part is ignored) of the data passed to an OS by a Multiboot-compliant
	bootloader in the "boot_device" data element, with one exception.

	The exception is that if the first level of disk partitioning is
	left as 0xFF (decimal 255, which is marked as no partitioning being
	used), but the second level does have a partition number, it looks
	for the first BSD-style PC partition, and finds the numbered BSD
	sub-partition in it.  The default "install_partition" 0xFF00FF,
	would then find the first BSD-style PC partition, and use the "a"
	partition in it, and 0xFF01FF would use the "b" partition, etc.

	If an explicit first-level partition is given, then no search is
	performed, and it will expect that the BSD-style PC partition is
	in the appropriate location, else a "no such partition" error will
	be returned.

   IMPORTANT NOTE:  If a "stage1.5" is being used, it will pass it's own
	"install_partition" to any "stage2" it loads, therefore overwriting
	the one present in the "stage2".

   --  at offset 0xC :  "version_string"

	This is the "stage1.5" or "stage2" version string.  It isn't
	meant to be changed, simply easy to find.

   --  after the terminating zero of "version_string" :  "config_file"

	This is the location, using the GRUB filesystem syntax, of the
	config file.  It will, by default, look in the "install_partition"
	of the disk GRUB was loaded from, though one can use any valid
	GRUB filesystem string, up to and including making it look on
	other disks.

   IMPORTANT NOTE:  The bootloader itself doesn't search for the end of
	"version_string", it simply knows where "config_file" is, so the
	beginning of the string cannot be moved after compile-time.  This
	should be OK, since the "version_string" is meant to be static.

   IMPORTANT NOTE #2:  The code of stage2 starts again at offset 0x70,
	so "config_file" string obviously can't go past there.  Also,
	remember to terminate the string with a 0.
