From: Magnus Damm <magnus@valinux.co.jp>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: fastboot@lists.osdl.org, linux-kernel@vger.kernel.org, ak@suse.de
Subject: Re: [PATCH][RFC] x86_64: Reload CS when startup_64 is used.
Date: Tue, 22 Aug 2006 09:58:26 +0900 [thread overview]
Message-ID: <1156208306.21411.85.camel@localhost> (raw)
In-Reply-To: <m13bbpu7i5.fsf@ebiederm.dsl.xmission.com>
On Mon, 2006-08-21 at 15:02 -0600, Eric W. Biederman wrote:
> Magnus Damm <magnus@valinux.co.jp> writes:
>
> > 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.
>
> What extra reload of cs does Xen introduce?
None, but Xen is using CS values that are very different from Linux:
xen/include/public/arch-x86_64.h:
#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */
#define FLAT_RING3_CS64 0xe033 /* GDT index 261 */
#define FLAT_RING3_DS32 0xe02b /* GDT index 262 */
#define FLAT_RING3_DS64 0x0000 /* NULL selector */
#define FLAT_RING3_SS32 0xe02b /* GDT index 262 */
#define FLAT_RING3_SS64 0xe02b /* GDT index 262 */
The main problem is that startup_64 depends on that CS is set to
__KERNEL_CS when it shouldn't. On top of that the purgatory code in
kexec-tools doesn't setup CS when using a 64-bit entry point. The
following (mangled) patch solves that for me:
--- 0001/purgatory/arch/x86_64/entry64.S
+++ work/purgatory/arch/x86_64/entry64.S 2006-08-18
15:34:23.000000000 +0900
@@ -37,8 +37,9 @@ entry64:
movl %eax, %fs
movl %eax, %gs
- /* In 64bit mode the code segment is meaningless */
-
+ ljmp *new_cs_addr(%rip)
+new_cs_exit:
+
/* Load the registers */
movq rax(%rip), %rax
movq rbx(%rip), %rbx
@@ -93,8 +94,11 @@ gdt: /* 0x00 unusable segment
.word 0, 0, 0
/* 0x10 4GB flat code segment */
- .word 0xFFFF, 0x0000, 0x9A00, 0x00CF
+ .word 0xFFFF, 0x0000, 0x9A00, 0x00AF
/* 0x18 4GB flat data segment */
.word 0xFFFF, 0x0000, 0x9200, 0x00CF
gdt_end:
+new_cs_addr:
+ .long new_cs_exit
+ .word 0x10 /* CODE_CS */
> I'm not really comfortable with a half virtualized case.
That I don't understand, care to explain more?
Thanks,
/ magnus
next prev parent reply other threads:[~2006-08-22 0:58 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-21 9:54 [PATCH][RFC] x86_64: Reload CS when startup_64 is used Magnus Damm
2006-08-21 10:19 ` 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 [this message]
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=1156208306.21411.85.camel@localhost \
--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