From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
"H. Peter Anvin" <hpa@zytor.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH v7 20/27] x86, boot: update comments about entries for 64bit image
Date: Mon, 17 Dec 2012 23:15:52 -0800 [thread overview]
Message-ID: <1355814959-10573-21-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1355814959-10573-1-git-send-email-yinghai@kernel.org>
Now 64bit entry is fixed on 0x200, can not be changed anymore.
Update the comments to reflect that.
Also put info about it in boot.txt
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
Documentation/x86/boot.txt | 38 ++++++++++++++++++++++++++++++++++++
arch/x86/boot/compressed/head_64.S | 22 ++++++++++++---------
2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/Documentation/x86/boot.txt b/Documentation/x86/boot.txt
index 18ca9fb..24cc542 100644
--- a/Documentation/x86/boot.txt
+++ b/Documentation/x86/boot.txt
@@ -1042,6 +1042,44 @@ 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.
+**** 64-bit BOOT PROTOCOL
+
+For machine with 64bit cpus and 64bit kernel, we could use 64bit bootloader
+We need a 64-bit boot protocol.
+
+In 64-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 under or above 4G 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 setting up the struct boot_params, the boot loader can load the
+64-bit kernel in the same way as that of 16-bit boot protocol, but
+kernel could be above 4G.
+
+In 64-bit boot protocol, the kernel is started by jumping to the
+64-bit kernel entry point, which is the start address of loaded
+64-bit kernel plus 0x200.
+
+At entry, the CPU must be in 64-bit mode with paging enabled.
+The range with setup_header.init_size from start address of loaded
+kernel and zero page and command line buffer get ident mapping;
+a GDT must be loaded with the descriptors for selectors
+__BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat
+segment; __BOOT_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; %rsi must hold the base
+address of the struct boot_params.
+
**** EFI HANDOVER PROTOCOL
This protocol allows boot loaders to defer initialisation to the EFI
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 5c80b94..aaafd4e 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -37,6 +37,12 @@
__HEAD
.code32
ENTRY(startup_32)
+ /*
+ * 32bit entry is 0, could not be changed!
+ * If we come here directly from a bootloader,
+ * kernel(text+data+bss+brk) ramdisk, zero_page, command line
+ * all need to be under 4G limit.
+ */
cld
/*
* Test KEEP_SEGMENTS flag to see if the bootloader is asking
@@ -182,20 +188,18 @@ ENTRY(startup_32)
lret
ENDPROC(startup_32)
- /*
- * Be careful here startup_64 needs to be at a predictable
- * address so I can export it in an ELF header. Bootloaders
- * should look at the ELF header to find this address, as
- * it may change in the future.
- */
.code64
.org 0x200
ENTRY(startup_64)
/*
+ * 64bit entry is 0x200, could not be changed!
* We come here either from startup_32 or directly from a
- * 64bit bootloader. If we come here from a bootloader we depend on
- * an identity mapped page table being provied that maps our
- * entire text+data+bss and hopefully all of memory.
+ * 64bit bootloader.
+ * If we come here from a bootloader, kernel(text+data+bss+brk),
+ * ramdisk, zero_page, command line could be above 4G.
+ * We depend on an identity mapped page table being provided
+ * that maps our entire kernel(text+data+bss+brk), zero page
+ * and command line.
*/
#ifdef CONFIG_EFI_STUB
/*
--
1.7.10.4
next prev parent reply other threads:[~2012-12-18 7:19 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-18 7:15 [PATCH v7 00/27] x86, boot, 64bit: Add support for loading ramdisk and bzImage above 4G Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 01/27] x86, mm: Fix page table early allocation offset checking Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 02/27] x86, mm: make pgd next calculation consistent with pud/pmd Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 03/27] x86, realmode: set real_mode permissions early Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 04/27] x86, realmode: use init_level4_pgt to set trapmoline_pgt directly Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 05/27] x86, realmode: Separate real_mode reserve and setup Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 06/27] x86, 64bit: early #PF handler set page table Yinghai Lu
2012-12-18 20:43 ` Yinghai Lu
2012-12-18 20:49 ` H. Peter Anvin
2012-12-18 20:55 ` Yinghai Lu
2012-12-18 21:07 ` H. Peter Anvin
2012-12-20 16:56 ` Yinghai Lu
2012-12-25 0:16 ` H. Peter Anvin
2012-12-25 4:04 ` Yinghai Lu
2012-12-25 11:20 ` Borislav Petkov
2012-12-25 20:51 ` Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 07/27] x86, 64bit: Print init kernel lowmap correctly Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 08/27] x86: Merge early_reserve_initrd for 32bit and 64bit Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 09/27] x86: add get_ramdisk_image/size() Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 10/27] x86, boot: add get_cmd_line_ptr() Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 11/27] x86, boot: move checking of cmd_line_ptr out of common path Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 12/27] x86, boot: pass cmd_line_ptr with unsigned long Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 13/27] x86, boot: move verify_cpu.S and no_longmode after 0x200 Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 14/27] x86, boot: Move lldt/ltr out of 64bit code section Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 15/27] x86, kexec: remove 1024G limitation for kexec buffer on 64bit Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 16/27] x86, kexec: set ident mapping for kernel that is above max_pfn Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 17/27] x86, kexec: Merge ident_mapping_init and init_level4_page Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 18/27] x86, kexec: only set ident mapping for ram Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 19/27] x86, boot: add fields to support load bzImage and ramdisk above 4G Yinghai Lu
2012-12-18 7:15 ` Yinghai Lu [this message]
2012-12-18 7:15 ` [PATCH v7 21/27] x86, boot: Not need to check setup_header version Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 22/27] mm: Add alloc_bootmem_low_pages_nopanic() Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 23/27] x86: Don't panic if can not alloc buffer for swiotlb Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 24/27] x86: Add swiotlb force off support Yinghai Lu
2012-12-22 2:37 ` Konrad Rzeszutek Wilk
2012-12-22 2:42 ` Eric W. Biederman
2012-12-22 3:10 ` Konrad Rzeszutek Wilk
2012-12-22 3:23 ` Eric W. Biederman
2012-12-22 3:25 ` H. Peter Anvin
2012-12-22 5:11 ` Yinghai Lu
2012-12-24 23:34 ` H. Peter Anvin
2012-12-24 23:55 ` Yinghai Lu
2012-12-22 13:21 ` Konrad Rzeszutek Wilk
2012-12-22 5:10 ` Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 25/27] x86, kdump: remove crashkernel range find limit for 64bit Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 26/27] x86: add Crash kernel low reservation Yinghai Lu
2012-12-19 17:22 ` Borislav Petkov
2012-12-19 17:36 ` Yinghai Lu
2012-12-18 7:15 ` [PATCH v7 27/27] x86: Merge early kernel reserve for 32bit and 64bit Yinghai Lu
2012-12-18 22:43 ` [PATCH v7 00/27] x86, boot, 64bit: Add support for loading ramdisk and bzImage above 4G Borislav Petkov
2012-12-18 23:08 ` Yinghai Lu
2012-12-18 23:22 ` Borislav Petkov
2012-12-22 2:42 ` Konrad Rzeszutek Wilk
2012-12-22 3:01 ` H. Peter Anvin
2012-12-22 13:24 ` Konrad Rzeszutek Wilk
2012-12-23 7:29 ` Yinghai Lu
2012-12-23 14:33 ` H. Peter Anvin
2012-12-23 18:00 ` Yinghai Lu
2012-12-23 18:45 ` Borislav Petkov
2012-12-24 4:54 ` H. Peter Anvin
2012-12-24 10:04 ` Borislav Petkov
2012-12-24 18:44 ` Yinghai Lu
2012-12-24 4:55 ` H. Peter Anvin
2012-12-24 23:56 ` H. Peter Anvin
2012-12-25 20:57 ` Yinghai Lu
2012-12-25 1:06 ` H. Peter Anvin
2012-12-25 11:52 ` Borislav Petkov
2012-12-25 15:51 ` H. Peter Anvin
2013-01-08 21:08 ` Borislav Petkov
2013-01-08 21:15 ` H. Peter Anvin
2013-01-08 21:19 ` Borislav Petkov
2013-01-08 23:17 ` H. Peter Anvin
2013-01-08 23:25 ` Borislav Petkov
2012-12-22 5:20 ` Yinghai Lu
2012-12-22 13:32 ` Konrad Rzeszutek Wilk
2012-12-22 10:38 ` Yinghai Lu
2012-12-22 13:25 ` Konrad Rzeszutek Wilk
2012-12-22 13:47 ` Konrad Rzeszutek Wilk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1355814959-10573-21-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.