aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/i386
diff options
context:
space:
mode:
authorHuang, Ying <ying.huang@intel.com>2007-10-23 22:18:49 -0400
committerThomas Gleixner <tglx@linutronix.de>2007-10-29 19:22:22 -0400
commitaa69432a68fb0aec49551fd69fe920a6df572573 (patch)
tree65e354e8025a594bd8197885cbc9c9f557c730d6 /Documentation/i386
parent076e21a0142ac33d53bc0cca58c6170d4ad14f5d (diff)
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')
-rw-r--r--Documentation/i386/boot.txt38
-rw-r--r--Documentation/i386/zero-page.txt122
2 files changed, 65 insertions, 95 deletions
diff --git a/Documentation/i386/boot.txt b/Documentation/i386/boot.txt
index 2f75e750e4f..fc49b79bc1a 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
785 After completing your hook, you should jump to the address 785 After completing your hook, you should jump to the address
786 that was in this field before your boot loader overwrote it 786 that was in this field before your boot loader overwrote it
787 (relocated, if appropriate.) 787 (relocated, if appropriate.)
788
789
790**** 32-bit BOOT PROTOCOL
791
792For machine with some new BIOS other than legacy BIOS, such as EFI,
793LinuxBIOS, etc, and kexec, the 16-bit real mode setup code in kernel
794based on legacy BIOS can not be used, so a 32-bit boot protocol needs
795to be defined.
796
797In 32-bit boot protocol, the first step in loading a Linux kernel
798should be to setup the boot parameters (struct boot_params,
799traditionally known as "zero page"). The memory for struct boot_params
800should be allocated and initialized to all zero. Then the setup header
801from offset 0x01f1 of kernel image on should be loaded into struct
802boot_params and examined. The end of setup header can be calculated as
803follow:
804
805 0x0202 + byte value at offset 0x0201
806
807In addition to read/modify/write the setup header of the struct
808boot_params as that of 16-bit boot protocol, the boot loader should
809also fill the additional fields of the struct boot_params as that
810described in zero-page.txt.
811
812After setupping the struct boot_params, the boot loader can load the
81332/64-bit kernel in the same way as that of 16-bit boot protocol.
814
815In 32-bit boot protocol, the kernel is started by jumping to the
81632-bit kernel entry point, which is the start address of loaded
81732/64-bit kernel.
818
819At entry, the CPU must be in 32-bit protected mode with paging
820disabled; a GDT must be loaded with the descriptors for selectors
821__BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat
822segment; __BOOS_CS must have execute/read permission, and __BOOT_DS
823must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
824must be __BOOT_DS; interrupt must be disabled; %esi must hold the base
825address of the struct boot_params; %ebp, %edi and %ebx must be zero.
diff --git a/Documentation/i386/zero-page.txt b/Documentation/i386/zero-page.txt
index 6c0817c4568..169ad423a3d 100644
--- a/Documentation/i386/zero-page.txt
+++ b/Documentation/i386/zero-page.txt
@@ -1,99 +1,31 @@
1--------------------------------------------------------------------------- 1The additional fields in struct boot_params as a part of 32-bit boot
2!!!!!!!!!!!!!!!WARNING!!!!!!!! 2protocol of kernel. These should be filled by bootloader or 16-bit
3The zero page is a kernel internal data structure, not a stable ABI. It might change 3real-mode setup code of the kernel. References/settings to it mainly
4without warning and the kernel has no way to detect old version of it. 4are in:
5If you're writing some external code like a boot loader you should only use
6the stable versioned real mode boot protocol described in boot.txt. Otherwise the kernel
7might break you at any time.
8!!!!!!!!!!!!!WARNING!!!!!!!!!!!
9----------------------------------------------------------------------------
10 5
11Summary of boot_params layout (kernel point of view) 6 include/asm-x86/bootparam.h
12 ( collected by Hans Lermen and Martin Mares )
13
14The contents of boot_params are used to pass parameters from the
1516-bit realmode code of the kernel to the 32-bit part. References/settings
16to it mainly are in:
17 7
18 arch/i386/boot/setup.S
19 arch/i386/boot/video.S
20 arch/i386/kernel/head.S
21 arch/i386/kernel/setup.c
22
23 8
24Offset Type Description 9Offset Proto Name Meaning
25------ ---- ----------- 10/Size
26 0 32 bytes struct screen_info, SCREEN_INFO
27 ATTENTION, overlaps the following !!!
28 2 unsigned short EXT_MEM_K, extended memory size in Kb (from int 0x15)
29 0x20 unsigned short CL_MAGIC, commandline magic number (=0xA33F)
30 0x22 unsigned short CL_OFFSET, commandline offset
31 Address of commandline is calculated:
32 0x90000 + contents of CL_OFFSET
33 (only taken, when CL_MAGIC = 0xA33F)
34 0x40 20 bytes struct apm_bios_info, APM_BIOS_INFO
35 0x60 16 bytes Intel SpeedStep (IST) BIOS support information
36 0x80 16 bytes hd0-disk-parameter from intvector 0x41
37 0x90 16 bytes hd1-disk-parameter from intvector 0x46
38 11
39 0xa0 16 bytes System description table truncated to 16 bytes. 12000/040 ALL screen_info Text mode or frame buffer information
40 ( struct sys_desc_table_struct ) 13 (struct screen_info)
41 0xb0 - 0x13f Free. Add more parameters here if you really need them. 14040/014 ALL apm_bios_info APM BIOS information (struct apm_bios_info)
42 0x140- 0x1be EDID_INFO Video mode setup 15060/010 ALL ist_info Intel SpeedStep (IST) BIOS support information
43 16 (struct ist_info)
440x1c4 unsigned long EFI system table pointer 17080/010 ALL hd0_info hd0 disk parameter, OBSOLETE!!
450x1c8 unsigned long EFI memory descriptor size 18090/010 ALL hd1_info hd1 disk parameter, OBSOLETE!!
460x1cc unsigned long EFI memory descriptor version 190A0/010 ALL sys_desc_table System description table (struct sys_desc_table)
470x1d0 unsigned long EFI memory descriptor map pointer 20140/080 ALL edid_info Video mode setup (struct edid_info)
480x1d4 unsigned long EFI memory descriptor map size 211C0/020 ALL efi_info EFI 32 information (struct efi_info)
490x1e0 unsigned long ALT_MEM_K, alternative mem check, in Kb 221E0/004 ALL alk_mem_k Alternative mem check, in KB
500x1e4 unsigned long Scratch field for the kernel setup code 231E4/004 ALL scratch Scratch field for the kernel setup code
510x1e8 char number of entries in E820MAP (below) 241E8/001 ALL e820_entries Number of entries in e820_map (below)
520x1e9 unsigned char number of entries in EDDBUF (below) 251E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
530x1ea unsigned char number of entries in EDD_MBR_SIG_BUFFER (below) 261EA/001 ALL edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
540x1f1 char size of setup.S, number of sectors 27 (below)
550x1f2 unsigned short MOUNT_ROOT_RDONLY (if !=0) 28290/040 ALL edd_mbr_sig_buffer EDD MBR signatures
560x1f4 unsigned short size of compressed kernel-part in the 292D0/A00 ALL e820_map E820 memory map table
57 (b)zImage-file (in 16 byte units, rounded up) 30 (array of struct e820entry)
580x1f6 unsigned short swap_dev (unused AFAIK) 31D00/1EC ALL eddbuf EDD data (array of struct edd_info)
590x1f8 unsigned short RAMDISK_FLAGS
600x1fa unsigned short VGA-Mode (old one)
610x1fc unsigned short ORIG_ROOT_DEV (high=Major, low=minor)
620x1ff char AUX_DEVICE_INFO
63
640x200 short jump to start of setup code aka "reserved" field.
650x202 4 bytes Signature for SETUP-header, ="HdrS"
660x206 unsigned short Version number of header format
67 Current version is 0x0201...
680x208 8 bytes (used by setup.S for communication with boot loaders,
69 look there)
700x210 char LOADER_TYPE, = 0, old one
71 else it is set by the loader:
72 0xTV: T=0 for LILO
73 1 for Loadlin
74 2 for bootsect-loader
75 3 for SYSLINUX
76 4 for ETHERBOOT
77 5 for ELILO
78 7 for GRuB
79 8 for U-BOOT
80 9 for Xen
81 V = version
820x211 char loadflags:
83 bit0 = 1: kernel is loaded high (bzImage)
84 bit7 = 1: Heap and pointer (see below) set by boot
85 loader.
860x212 unsigned short (setup.S)
870x214 unsigned long KERNEL_START, where the loader started the kernel
880x218 unsigned long INITRD_START, address of loaded ramdisk image
890x21c unsigned long INITRD_SIZE, size in bytes of ramdisk image
900x220 4 bytes (setup.S)
910x224 unsigned short setup.S heap end pointer
920x226 unsigned short zero_pad
930x228 unsigned long cmd_line_ptr
940x22c unsigned long ramdisk_max
950x230 16 bytes trampoline
960x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
970x2d0 - 0xd00 E820MAP
980xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector
990xd00 - 0xeeb EDDBUF (edd.S) for edd data