aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/boot/x86_64.S
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-05-18 15:11:20 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-05-18 15:11:20 +0000
commitfb7d812c3861307d3a101933060b2518f3dc7f78 (patch)
tree036ef28e107551dd48eb72c5efa5aebbb5d36abe /xen/arch/x86/boot/x86_64.S
parent30b9127ed984e4e826bc9aabe363bb1c04a25962 (diff)
downloadxen-fb7d812c3861307d3a101933060b2518f3dc7f78.tar.gz
xen-fb7d812c3861307d3a101933060b2518f3dc7f78.tar.bz2
xen-fb7d812c3861307d3a101933060b2518f3dc7f78.zip
bitkeeper revision 1.1449 (428b5b18LCgVTMb_50LKESAAA5057Q)
Fix x86/64 bootstrap. Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/boot/x86_64.S')
-rw-r--r--xen/arch/x86/boot/x86_64.S45
1 files changed, 24 insertions, 21 deletions
diff --git a/xen/arch/x86/boot/x86_64.S b/xen/arch/x86/boot/x86_64.S
index 56b2dcb5e5..5ebb24d647 100644
--- a/xen/arch/x86/boot/x86_64.S
+++ b/xen/arch/x86/boot/x86_64.S
@@ -46,13 +46,13 @@ print_err:
mov $7,%al
stosb # Write an attribute to the VGA framebuffer
jmp 1b
-
+
__start:
cld
cli
/* Set up a few descriptors: on entry only CS is guaranteed good. */
- lgdt %cs:0x100400
+ lgdt %cs:0x100306 # nopaging_gdt_descr
mov $(__HYPERVISOR_DS32),%ecx
mov %ecx,%ds
mov %ecx,%es
@@ -65,7 +65,7 @@ __start:
jne not_multiboot
/* Save the Multiboot info structure for later use. */
- mov %ebx,0x100300
+ mov %ebx,0x100300 # multiboot_ptr
/* We begin by interrogating the CPU for the presence of long mode. */
mov $0x80000000,%eax
@@ -87,7 +87,7 @@ skip_boot_checks:
mov %ecx,%cr4
/* Load pagetable base register. */
- mov $0x101000,%eax /* idle_pg_table */
+ mov $0x102000,%eax /* idle_pg_table */
mov %eax,%cr3
/* Set up EFER (Extended Feature Enable Register). */
@@ -168,9 +168,8 @@ __high_start:
loop 1b
/* Pass off the Multiboot info structure to C land. */
- mov 0x100300,%edi
- lea start(%rip),%rax
- sub $0x100000,%rax
+ mov multiboot_ptr(%rip),%edi
+ lea start-0x100000(%rip),%rax
add %rax,%rdi
call __start_xen
ud2 /* Force a panic (invalid opcode). */
@@ -184,26 +183,30 @@ ignore_int:
call printf
1: jmp 1b
- .code32
- .org 0x300
-
/*** DESCRIPTOR TABLES ***/
.globl idt
-.globl gdt
+.globl gdt
+
+ .org 0x300
+ .code32
+
+multiboot_ptr: /* 0x300 */
+ .long 0
- .org 0x400
- .word LAST_RESERVED_GDT_BYTE
- .long 0x101000 - FIRST_RESERVED_GDT_BYTE
-
.word 0
+nopaging_gdt_descr: /* 0x306 */
+ .word LAST_RESERVED_GDT_BYTE
+ .quad gdt_table - FIRST_RESERVED_GDT_BYTE - __PAGE_OFFSET
+
+ .word 0,0,0
gdt_descr:
.word LAST_RESERVED_GDT_BYTE
-gdt:
+gdt:
.quad gdt_table - FIRST_RESERVED_GDT_BYTE
- .word 0
+ .word 0,0,0
idt_descr:
.word 256*16-1
idt:
@@ -214,7 +217,7 @@ ENTRY(stack_start)
high_start:
.quad __high_start
-
+
.org 0x1000
ENTRY(gdt_table)
.quad 0x0000000000000000 /* unused */
@@ -231,14 +234,14 @@ ENTRY(gdt_table)
.org 0x2000
ENTRY(idle_pg_table)
ENTRY(idle_pg_table_4)
- .quad 0x0000000000102007 # PML4[0]
+ .quad idle_pg_table_l3 - __PAGE_OFFSET + 7 # PML4[0]
.fill 261,8,0
- .quad 0x0000000000102007 # PML4[262]
+ .quad idle_pg_table_l3 - __PAGE_OFFSET + 7 # PML4[262]
/* Initial PDP -- level-3 page table */
.org 0x3000
ENTRY(idle_pg_table_l3)
- .quad 0x0000000000103007
+ .quad idle_pg_table_l2 - __PAGE_OFFSET + 7
/* Initial PDE -- level-2 page table. */
.org 0x4000