diff options
author | Huang, Ying <ying.huang@intel.com> | 2007-10-24 10:18:49 +0800 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2007-10-30 00:22:22 +0100 |
commit | aa69432a68fb0aec49551fd69fe920a6df572573 (patch) | |
tree | 65e354e8025a594bd8197885cbc9c9f557c730d6 /Documentation/i386/boot.txt | |
parent | 076e21a0142ac33d53bc0cca58c6170d4ad14f5d (diff) | |
download | linux-aa69432a68fb0aec49551fd69fe920a6df572573.tar.gz linux-aa69432a68fb0aec49551fd69fe920a6df572573.tar.bz2 linux-aa69432a68fb0aec49551fd69fe920a6df572573.zip |
x86 boot: document for 32 bit boot protocol
This patch documents the 32-bit boot protocol of x86. It has been used
by Kexec and LinuxBIOS. This patch is based on the proposal of Peter
Anvin.
Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'Documentation/i386/boot.txt')
-rw-r--r-- | Documentation/i386/boot.txt | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Documentation/i386/boot.txt b/Documentation/i386/boot.txt index 2f75e750e4f5..fc49b79bc1ab 100644 --- a/Documentation/i386/boot.txt +++ b/Documentation/i386/boot.txt @@ -785,3 +785,41 @@ IMPORTANT: All the hooks are required to preserve %esp, %ebp, %esi and After completing your hook, you should jump to the address that was in this field before your boot loader overwrote it (relocated, if appropriate.) + + +**** 32-bit BOOT PROTOCOL + +For machine with some new BIOS other than legacy BIOS, such as EFI, +LinuxBIOS, etc, and kexec, the 16-bit real mode setup code in kernel +based on legacy BIOS can not be used, so a 32-bit boot protocol needs +to be defined. + +In 32-bit boot protocol, the first step in loading a Linux kernel +should be to setup the boot parameters (struct boot_params, +traditionally known as "zero page"). The memory for struct boot_params +should be allocated and initialized to all zero. Then the setup header +from offset 0x01f1 of kernel image on should be loaded into struct +boot_params and examined. The end of setup header can be calculated as +follow: + + 0x0202 + byte value at offset 0x0201 + +In addition to read/modify/write the setup header of the struct +boot_params as that of 16-bit boot protocol, the boot loader should +also fill the additional fields of the struct boot_params as that +described in zero-page.txt. + +After setupping the struct boot_params, the boot loader can load the +32/64-bit kernel in the same way as that of 16-bit boot protocol. + +In 32-bit boot protocol, the kernel is started by jumping to the +32-bit kernel entry point, which is the start address of loaded +32/64-bit kernel. + +At entry, the CPU must be in 32-bit protected mode with paging +disabled; a GDT must be loaded with the descriptors for selectors +__BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat +segment; __BOOS_CS must have execute/read permission, and __BOOT_DS +must have read/write permission; CS must be __BOOT_CS and DS, ES, SS +must be __BOOT_DS; interrupt must be disabled; %esi must hold the base +address of the struct boot_params; %ebp, %edi and %ebx must be zero. |