From: Magnus Damm <magnus@valinux.co.jp>
To: fastboot@lists.osdl.org, linux-kernel@vger.kernel.org
Cc: Magnus Damm <magnus@valinux.co.jp>, ebiederm@xmission.com, ak@suse.de
Subject: [PATCH][RFC] x86_64: Reload CS when startup_64 is used.
Date: Mon, 21 Aug 2006 18:54:16 +0900 (JST) [thread overview]
Message-ID: <20060821095328.3132.40575.sendpatchset@cherry.local> (raw)
x86_64: Reload CS when startup_64 is used.
The current x86_64 startup code never reloads CS during the early boot process
if the 64-bit function startup_64 is used as entry point. The 32-bit entry
point startup_32 does the right thing and reloads CS, and this is what most
people are using if they use bzImage.
This patch fixes the case when the Linux kernel is booted into using kexec
under Xen. The Xen hypervisor is using large CS values which makes the x86_64
kernel fail - but only if vmlinux is booted, bzImage works well because it
is using the 32-bit entry point.
The main question is if we require that the boot loader should setup CS
to some certain offset to be able to boot the kernel. The sane solution IMO
should be that the kernel requires that the loaded descriptors are correct,
but that the exact offset within the GDT the boot loader is using should not
matter. This is the way the i386 boot works if I understand things correctly.
Signed-off-by: Magnus Damm <magnus@valinux.co.jp>
---
Applies on top of 2.6.18-rc4
head.S | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
--- 0001/arch/x86_64/kernel/head.S
+++ work/arch/x86_64/kernel/head.S 2006-08-21 18:22:57.000000000 +0900
@@ -165,6 +165,25 @@ startup_64:
*/
lgdt cpu_gdt_descr
+ /* Reload CS with a value that is within our GDT. We need to do this
+ * if we were loaded by a 64 bit bootloader that happened to use a
+ * CS that is larger than the GDT limit. This is true if we came here
+ * from kexec running under Xen.
+ */
+ movq %rsp, %rdx
+ movq $__KERNEL_DS, %rax
+ pushq %rax /* SS */
+ pushq %rdx /* RSP */
+ movq $__KERNEL_CS, %rax
+ movq $cs_reloaded, %rdx
+ pushq %rax /* CS */
+ pushq %rdx /* RIP */
+ lretq
+
+cs_reloaded:
+ /* Setup the boot time stack again */
+ movq init_rsp(%rip),%rsp
+
/*
* Setup up a dummy PDA. this is just for some early bootup code
* that does in_interrupt()
next reply other threads:[~2006-08-21 9:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-21 9:54 Magnus Damm [this message]
2006-08-21 10:19 ` [PATCH][RFC] x86_64: Reload CS when startup_64 is used Andi Kleen
2006-08-21 13:29 ` [Fastboot] " Magnus Damm
2006-08-21 14:16 ` Andi Kleen
2006-08-22 0:47 ` Magnus Damm
2006-08-21 14:17 ` Vivek Goyal
2006-08-21 14:24 ` Andi Kleen
2006-08-21 14:46 ` Vivek Goyal
2006-08-21 15:04 ` Andi Kleen
2006-08-21 20:02 ` Eric W. Biederman
2006-08-21 20:10 ` Andi Kleen
2006-08-21 21:00 ` Eric W. Biederman
2006-08-21 21:02 ` Eric W. Biederman
2006-08-22 0:58 ` Magnus Damm
2006-08-22 3:41 ` Eric W. Biederman
2006-08-22 4:10 ` Magnus Damm
2006-08-22 8:03 ` Andi Kleen
2006-08-22 8:37 ` [PATCH] " Eric W. Biederman
2006-08-22 8:53 ` [Fastboot] " Magnus Damm
2006-08-22 9:25 ` Eric W. Biederman
2006-08-23 3:10 ` Magnus Damm
2006-08-22 9:01 ` Andi Kleen
2006-08-22 9:20 ` Eric W. Biederman
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=20060821095328.3132.40575.sendpatchset@cherry.local \
--to=magnus@valinux.co.jp \
--cc=ak@suse.de \
--cc=ebiederm@xmission.com \
--cc=fastboot@lists.osdl.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox