X86: Move the GDT down to where it can be accessed in 32 bit mode.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 28 May 2012 02:01:08 +0000 (19:01 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 28 May 2012 02:01:08 +0000 (19:01 -0700)
The GDT can be accessed by user level software running in compatibility mode
by moving segment selectors into segment registers. The GDT needs to be set up
at an address accessible in this mode.

src/arch/x86/process.cc

index 088a0661c24c970dc9b40c9e4c735b61036b3add..cce8e3a3d7d4b438f52771330f45d15a1559babf 100644 (file)
@@ -132,7 +132,7 @@ I386LiveProcess::I386LiveProcess(LiveProcessParams *params,
         int _numSyscallDescs) :
     X86LiveProcess(params, objFile, _syscallDescs, _numSyscallDescs)
 {
-    _gdtStart = ULL(0x100000000);
+    _gdtStart = ULL(0xffffd000);
     _gdtSize = VMPageSize;
 
     vsyscallPage.base = 0xffffe000ULL;
@@ -140,7 +140,7 @@ I386LiveProcess::I386LiveProcess(LiveProcessParams *params,
     vsyscallPage.vsyscallOffset = 0x400;
     vsyscallPage.vsysexitOffset = 0x410;
 
-    stack_base = vsyscallPage.base;
+    stack_base = _gdtStart;
 
     // Set pointer for next thread stack.  Reserve 8M for main stack.
     next_thread_stack_base = stack_base - (8 * 1024 * 1024);