public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol
@ 2007-09-19  3:10 Huang, Ying
  2007-09-19  5:30 ` H. Peter Anvin
  2007-09-19  9:34 ` Alan Cox
  0 siblings, 2 replies; 5+ messages in thread
From: Huang, Ying @ 2007-09-19  3:10 UTC (permalink / raw)
  To: H. Peter Anvin, Andi Kleen, Eric W. Biederman, akpm, Yinghai Lu,
	Chandramouli Narayanan
  Cc: linux-kernel

This patch defines a 32-bit boot protocol and adds corresponding
document. It is based on the proposal of Peter Anvin.


Known issues:

- The hd0_info and hd1_info are deleted from the zero page. Additional
  work should be done for this? Or this is unnecessary (because no new
  fields will be added to zero page)?

- The fields in zero page are fairly complex (such as struct
  edd_info). Is it necessary to document every field inside the first
  level fields, until the primary data type? Or is it sufficient to
  provide the C struct name only?


ChangeLog:

-- v2 --

- Revise zero page description according to the source code and move
  them to zero-page.txt.


Signed-off-by: Huang Ying <ying.huang@intel.com>

---

 boot.txt      |   70 +++++++++++++++++++++++++++++++
 zero-page.txt |  127 ++++++++++++----------------------------------------------
 2 files changed, 97 insertions(+), 100 deletions(-)

Index: linux-2.6.23-rc6/Documentation/i386/boot.txt
===================================================================
--- linux-2.6.23-rc6.orig/Documentation/i386/boot.txt	2007-09-11 10:50:29.000000000 +0800
+++ linux-2.6.23-rc6/Documentation/i386/boot.txt	2007-09-19 10:00:18.000000000 +0800
@@ -2,7 +2,7 @@
 		     ----------------------------
 
 		    H. Peter Anvin <hpa@zytor.com>
-			Last update 2007-05-23
+			Last update 2007-09-18
 
 On the i386 platform, the Linux kernel uses a rather complicated boot
 convention.  This has evolved partially due to historical aspects, as
@@ -42,6 +42,9 @@
 Protocol 2.06:	(Kernel 2.6.22) Added a field that contains the size of
 		the boot command line
 
+Protocol 2.07:	(kernel 2.6.23) Added a field of 64-bit physical
+		pointer to single linked list of struct	setup_data.
+		Added 32-bit boot protocol.
 
 **** MEMORY LAYOUT
 
@@ -168,6 +171,9 @@
 0234/1	2.05+	relocatable_kernel Whether kernel is relocatable or not
 0235/3	N/A	pad2		Unused
 0238/4	2.06+	cmdline_size	Maximum size of the kernel command line
+023c/4	N/A	pad3		Unused
+0240/8	2.07+	setup_data	64-bit physical pointer to linked list
+				of struct setup_data
 
 (1) For backwards compatibility, if the setup_sects field contains 0, the
     real value is 4.
@@ -480,6 +486,36 @@
   cmdline_size characters. With protocol version 2.05 and earlier, the
   maximum size was 255.
 
+Field name:	setup_data
+Type:		write (obligatory)
+Offset/size:	0x240/8
+Protocol:	2.07+
+
+  The 64-bit physical pointer to NULL terminated single linked list of
+  struct setup_data. This is used to define a more extensible boot
+  parameters passing mechanism. The definition of struct setup_data is
+  as follow:
+
+  struct setup_data {
+	  u64 next;
+	  u32 type;
+	  u32 len;
+	  u8  data[0];
+  } __attribute__((packed));
+
+  Where, the next is a 64-bit physical pointer to the next node of
+  linked list, the next field of the last node is 0; the type is used
+  to identify the contents of data; the len is the length of data
+  field; the data holds the real payload.
+
+  With this field, to add a new boot parameter written by bootloader,
+  it is not needed to add a new field to real mode header, just add a
+  new setup_data type is sufficient. But to add a new boot parameter
+  read by bootloader, it is still needed to add a new field.
+
+  TODO: Where is the safe place to place the linked list of struct
+  	setup_data?
+
 
 **** THE KERNEL COMMAND LINE
 
@@ -753,3 +789,35 @@
 	After completing your hook, you should jump to the address
 	that was in this field before your boot loader overwrote it
 	(relocated, if appropriate.)
+
+
+**** SETUP DATA TYPES
+
+
+**** 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 need
+to be defined.
+
+In 32-bit boot protocol, the first step in loading a Linux kernel
+should still be to load the real-mode code and then examine the kernel
+header at offset 0x01f1. But, it is not necessary to load all
+real-mode code, just first 4K bytes traditionally known as "zero page"
+is needed.
+
+In addition to read/modify/write kernel header of the zero page as
+that of 16-bit boot protocol, the boot loader should also fill the
+additional fields of the zero page as that described in zero-page.txt.
+
+After loading and setuping the zero page, 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; the CS and DS must be 4G flat segments; %esi holds the base
+address of the "zero page"; %esp, %ebp, %edi should be zero.
Index: linux-2.6.23-rc6/Documentation/i386/zero-page.txt
===================================================================
--- linux-2.6.23-rc6.orig/Documentation/i386/zero-page.txt	2007-09-11 10:50:29.000000000 +0800
+++ linux-2.6.23-rc6/Documentation/i386/zero-page.txt	2007-09-19 10:00:18.000000000 +0800
@@ -1,99 +1,28 @@
----------------------------------------------------------------------------
-!!!!!!!!!!!!!!!WARNING!!!!!!!!
-The zero page is a kernel internal data structure, not a stable ABI.  It might change
-without warning and the kernel has no way to detect old version of it.
-If you're writing some external code like a boot loader you should only use
-the stable versioned real mode boot protocol described in boot.txt. Otherwise the kernel
-might break you at any time.
-!!!!!!!!!!!!!WARNING!!!!!!!!!!!
-----------------------------------------------------------------------------
-
-Summary of boot_params layout (kernel point of view)
-     ( collected by Hans Lermen and Martin Mares )
- 
-The contents of boot_params are used to pass parameters from the
-16-bit realmode code of the kernel to the 32-bit part. References/settings
-to it mainly are in:
-
-  arch/i386/boot/setup.S
-  arch/i386/boot/video.S
-  arch/i386/kernel/head.S
-  arch/i386/kernel/setup.c
- 
-
-Offset	Type		Description
-------  ----		-----------
-    0	32 bytes	struct screen_info, SCREEN_INFO
-			ATTENTION, overlaps the following !!!
-    2	unsigned short	EXT_MEM_K, extended memory size in Kb (from int 0x15)
- 0x20	unsigned short	CL_MAGIC, commandline magic number (=0xA33F)
- 0x22	unsigned short	CL_OFFSET, commandline offset
-			Address of commandline is calculated:
-			  0x90000 + contents of CL_OFFSET
-			(only taken, when CL_MAGIC = 0xA33F)
- 0x40	20 bytes	struct apm_bios_info, APM_BIOS_INFO
- 0x60	16 bytes	Intel SpeedStep (IST) BIOS support information
- 0x80	16 bytes	hd0-disk-parameter from intvector 0x41
- 0x90	16 bytes	hd1-disk-parameter from intvector 0x46
-
- 0xa0	16 bytes	System description table truncated to 16 bytes.
-			( struct sys_desc_table_struct )
- 0xb0 - 0x13f		Free. Add more parameters here if you really need them.
- 0x140- 0x1be		EDID_INFO Video mode setup
-
-0x1c4	unsigned long	EFI system table pointer
-0x1c8	unsigned long	EFI memory descriptor size
-0x1cc	unsigned long	EFI memory descriptor version
-0x1d0	unsigned long	EFI memory descriptor map pointer
-0x1d4	unsigned long	EFI memory descriptor map size
-0x1e0	unsigned long	ALT_MEM_K, alternative mem check, in Kb
-0x1e4	unsigned long	Scratch field for the kernel setup code
-0x1e8	char		number of entries in E820MAP (below)
-0x1e9	unsigned char	number of entries in EDDBUF (below)
-0x1ea	unsigned char	number of entries in EDD_MBR_SIG_BUFFER (below)
-0x1f1	char		size of setup.S, number of sectors
-0x1f2	unsigned short	MOUNT_ROOT_RDONLY (if !=0)
-0x1f4	unsigned short	size of compressed kernel-part in the
-			(b)zImage-file (in 16 byte units, rounded up)
-0x1f6	unsigned short	swap_dev (unused AFAIK)
-0x1f8	unsigned short	RAMDISK_FLAGS
-0x1fa	unsigned short	VGA-Mode (old one)
-0x1fc	unsigned short	ORIG_ROOT_DEV (high=Major, low=minor)
-0x1ff	char		AUX_DEVICE_INFO
-
-0x200	short jump to start of setup code aka "reserved" field.
-0x202	4 bytes		Signature for SETUP-header, ="HdrS"
-0x206	unsigned short	Version number of header format
-			Current version is 0x0201...
-0x208	8 bytes		(used by setup.S for communication with boot loaders,
-			 look there)
-0x210	char		LOADER_TYPE, = 0, old one
-			else it is set by the loader:
-			0xTV: T=0 for LILO
-				1 for Loadlin
-				2 for bootsect-loader
-				3 for SYSLINUX
-				4 for ETHERBOOT
-				5 for ELILO
-				7 for GRuB
-				8 for U-BOOT
-				9 for Xen
-				V = version
-0x211	char		loadflags:
-			bit0 = 1: kernel is loaded high (bzImage)
-			bit7 = 1: Heap and pointer (see below) set by boot
-				  loader.
-0x212	unsigned short	(setup.S)
-0x214	unsigned long	KERNEL_START, where the loader started the kernel
-0x218	unsigned long	INITRD_START, address of loaded ramdisk image
-0x21c	unsigned long	INITRD_SIZE, size in bytes of ramdisk image
-0x220	4 bytes		(setup.S)
-0x224	unsigned short	setup.S heap end pointer
-0x226   unsigned short	zero_pad
-0x228   unsigned long	cmd_line_ptr
-0x22c   unsigned long	ramdisk_max
-0x230   16 bytes 	trampoline
-0x290 - 0x2cf		EDD_MBR_SIG_BUFFER (edd.S)
-0x2d0 - 0xd00		E820MAP
-0xd00 - 0xeff		EDDBUF (edd.S) for disk signature read sector
-0xd00 - 0xeeb		EDDBUF (edd.S) for edd data
+The additional fields in zero page as a part of 32-bit boot protocol
+of kernel. These should be filled by bootloader or 16-bit real-mode
+code of the kernel. References/settings to it mainly are in:
+
+  include/asm-i386/bootparam.h
+
+
+Offset	Proto	Name		Meaning
+/Size
+
+000/040	2.07+	screen_info	Text mode or frame buffer information
+				(struct screen_info)
+040/014	2.07+	apm_bios_info	APM BIOS information (struct apm_bios_info)
+060/010	2.07+	ist_info	Intel SpeedStep (IST) BIOS support information
+				(struct ist_info)
+0A0/010	2.07+	sys_desc_table	System description table (struct sys_desc_table)
+140/080	2.07+	edid_info	Video mode setup (struct edid_info)
+1C0/020	2.07+	efi_info	EFI 32 information (struct efi_info)
+1E0/004	2.07+	alk_mem_k	Alternative mem check, in KB
+1E4/004	2.07+	scratch		Scratch field for the kernel setup code
+1E8/001	2.07+	e820_entries	Number of entries in e820_map (below)
+1E9/001	2.07+	eddbuf_entries	Number of entries in eddbuf (below)
+1EA/001	2.07+	edd_mbr_sig_buf_entries	Number of entries in edd_mbr_sig_buffer
+				(below)
+290/040	2.07+	edd_mbr_sig_buffer EDD MBR signatures
+2D0/A00	2.07+	e820_map	E820 memory map table
+				(array of struct e820entry)
+D00/1EC	2.07+	eddbuf		EDD data (array of struct edd_info)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol
  2007-09-19  3:10 [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol Huang, Ying
@ 2007-09-19  5:30 ` H. Peter Anvin
  2007-09-19  5:35   ` Huang, Ying
  2007-09-19  9:34 ` Alan Cox
  1 sibling, 1 reply; 5+ messages in thread
From: H. Peter Anvin @ 2007-09-19  5:30 UTC (permalink / raw)
  To: Huang, Ying
  Cc: Andi Kleen, Eric W. Biederman, akpm, Yinghai Lu,
	Chandramouli Narayanan, linux-kernel

Huang, Ying wrote:
> Known issues:
> 
> - The hd0_info and hd1_info are deleted from the zero page. Additional
>   work should be done for this? Or this is unnecessary (because no new
>   fields will be added to zero page)?
> 

For backwards compatibility, they should be marked as there for the
short-medium term so we don't reuse them for whatever reason.

	-hpa

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol
  2007-09-19  5:30 ` H. Peter Anvin
@ 2007-09-19  5:35   ` Huang, Ying
  0 siblings, 0 replies; 5+ messages in thread
From: Huang, Ying @ 2007-09-19  5:35 UTC (permalink / raw)
  To: H. Peter Anvin
  Cc: Andi Kleen, Eric W. Biederman, akpm, Yinghai Lu,
	Chandramouli Narayanan, linux-kernel

On Tue, 2007-09-18 at 22:30 -0700, H. Peter Anvin wrote:
> Huang, Ying wrote:
> > Known issues:
> > 
> > - The hd0_info and hd1_info are deleted from the zero page. Additional
> >   work should be done for this? Or this is unnecessary (because no new
> >   fields will be added to zero page)?
> > 
> 
> For backwards compatibility, they should be marked as there for the
> short-medium term so we don't reuse them for whatever reason.

OK, I will add them back.

Best Regards,
Huang Ying

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol
  2007-09-19  3:10 [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol Huang, Ying
  2007-09-19  5:30 ` H. Peter Anvin
@ 2007-09-19  9:34 ` Alan Cox
  2007-09-19 16:05   ` H. Peter Anvin
  1 sibling, 1 reply; 5+ messages in thread
From: Alan Cox @ 2007-09-19  9:34 UTC (permalink / raw)
  To: Huang, Ying
  Cc: H. Peter Anvin, Andi Kleen, Eric W. Biederman, akpm, Yinghai Lu,
	Chandramouli Narayanan, linux-kernel

On Wed, 19 Sep 2007 11:10:28 +0800
"Huang, Ying" <ying.huang@intel.com> wrote:

> This patch defines a 32-bit boot protocol and adds corresponding
> document. It is based on the proposal of Peter Anvin.
> 
> 
> Known issues:
> 
> - The hd0_info and hd1_info are deleted from the zero page. Additional
>   work should be done for this? Or this is unnecessary (because no new
>   fields will be added to zero page)?

They aren't actually that useful as for pretty much any 386 or later PC
we can recover the disk geometry via the BIOS tables, or via EDD. Right
now we don't save some neccessary fields if using EDD 1.1 but they could
be saved into the same place EDD 3.0 puts them.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol
  2007-09-19  9:34 ` Alan Cox
@ 2007-09-19 16:05   ` H. Peter Anvin
  0 siblings, 0 replies; 5+ messages in thread
From: H. Peter Anvin @ 2007-09-19 16:05 UTC (permalink / raw)
  To: Alan Cox
  Cc: Huang, Ying, Andi Kleen, Eric W. Biederman, akpm, Yinghai Lu,
	Chandramouli Narayanan, linux-kernel

Alan Cox wrote:
> On Wed, 19 Sep 2007 11:10:28 +0800
> "Huang, Ying" <ying.huang@intel.com> wrote:
> 
>> This patch defines a 32-bit boot protocol and adds corresponding
>> document. It is based on the proposal of Peter Anvin.
>>
>>
>> Known issues:
>>
>> - The hd0_info and hd1_info are deleted from the zero page. Additional
>>   work should be done for this? Or this is unnecessary (because no new
>>   fields will be added to zero page)?
> 
> They aren't actually that useful as for pretty much any 386 or later PC
> we can recover the disk geometry via the BIOS tables, or via EDD. Right
> now we don't save some neccessary fields if using EDD 1.1 but they could
> be saved into the same place EDD 3.0 puts them.
> 

Yeah, I just don't want to remove them from the structure to keep the
locations from getting recycled for a while.

	-hpa

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-09-19 16:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-19  3:10 [PATCH -mm -v2 2/2] i386/x86_64 boot: document for 32 bit boot protocol Huang, Ying
2007-09-19  5:30 ` H. Peter Anvin
2007-09-19  5:35   ` Huang, Ying
2007-09-19  9:34 ` Alan Cox
2007-09-19 16:05   ` H. Peter Anvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox