summaryrefslogtreecommitdiff
path: root/i386/i386/gdt.c
diff options
context:
space:
mode:
Diffstat (limited to 'i386/i386/gdt.c')
-rw-r--r--i386/i386/gdt.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/i386/i386/gdt.c b/i386/i386/gdt.c
index bc36031b..fb18360e 100644
--- a/i386/i386/gdt.c
+++ b/i386/i386/gdt.c
@@ -33,6 +33,7 @@
#include <mach/machine/vm_types.h>
#include <mach/xen.h>
+#include <kern/assert.h>
#include <intel/pmap.h>
#include "vm_param.h"
@@ -49,6 +50,14 @@ void
gdt_init(void)
{
/* Initialize the kernel code and data segment descriptors. */
+#ifdef __x86_64__
+ assert(LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS == 0);
+ fill_gdt_descriptor(KERNEL_CS, 0, 0, ACC_PL_K|ACC_CODE_R, SZ_64);
+ fill_gdt_descriptor(KERNEL_DS, 0, 0, ACC_PL_K|ACC_DATA_W, SZ_64);
+#ifndef MACH_PV_DESCRIPTORS
+ fill_gdt_descriptor(LINEAR_DS, 0, 0, ACC_PL_K|ACC_DATA_W, SZ_64);
+#endif /* MACH_PV_DESCRIPTORS */
+#else
fill_gdt_descriptor(KERNEL_CS,
LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS,
LINEAR_MAX_KERNEL_ADDRESS - (LINEAR_MIN_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) - 1,
@@ -63,6 +72,7 @@ gdt_init(void)
0xffffffff,
ACC_PL_K|ACC_DATA_W, SZ_32);
#endif /* MACH_PV_DESCRIPTORS */
+#endif
#ifdef MACH_PV_DESCRIPTORS
unsigned long frame = kv_to_mfn(gdt);