Skip to content

Commit

Permalink
[PATCH] x86-64: x86_64 - Fix FS/GS registers for VT execution
Browse files Browse the repository at this point in the history
Initialize FS and GS to __KERNEL_DS as well.  The actual value of them is not
important, but it is important to reload them in protected mode.  At this time,
they still retain the real mode values from initial boot.  VT disallows
execution of code under such conditions, which means hardware virtualization
can not be used to boot the kernel on Intel platforms, making the boot time
painfully slow.

This requires moving the GS load before the load of GS_BASE, so just move
all the segments loads there to keep them together in the code.

Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Andi Kleen <ak@suse.de>
  • Loading branch information
Zachary Amsden authored and Andi Kleen committed Feb 13, 2007
1 parent 9a11ff6 commit ffb6017
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions arch/x86_64/kernel/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,20 @@ startup_64:
*/
lgdt cpu_gdt_descr

/* set up data segments. actually 0 would do too */
movl $__KERNEL_DS,%eax
movl %eax,%ds
movl %eax,%ss
movl %eax,%es

/*
* We don't really need to load %fs or %gs, but load them anyway
* to kill any stale realmode selectors. This allows execution
* under VT hardware.
*/
movl %eax,%fs
movl %eax,%gs

/*
* Setup up a dummy PDA. this is just for some early bootup code
* that does in_interrupt()
Expand All @@ -173,12 +187,6 @@ startup_64:
shrq $32,%rdx
wrmsr

/* set up data segments. actually 0 would do too */
movl $__KERNEL_DS,%eax
movl %eax,%ds
movl %eax,%ss
movl %eax,%es

/* esi is pointer to real mode structure with interesting info.
pass it to C */
movl %esi, %edi
Expand Down

0 comments on commit ffb6017

Please sign in to comment.