changeset e831b4360cfe in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=e831b4360cfe
description:
        X86: Set up a space for a GDT in SE so we can set up TLS or LDT 
segments.

diffstat:

2 files changed, 27 insertions(+)
src/arch/x86/process.cc |   18 ++++++++++++++++++
src/arch/x86/process.hh |    9 +++++++++

diffs (61 lines):

diff -r 969fb3187eba -r e831b4360cfe src/arch/x86/process.cc
--- a/src/arch/x86/process.cc   Fri Feb 27 09:23:00 2009 -0800
+++ b/src/arch/x86/process.cc   Fri Feb 27 09:23:17 2009 -0800
@@ -251,6 +251,20 @@
 
     argsInit(sizeof(uint32_t), VMPageSize);
 
+    /* 
+     * Set up a GDT for this process. The whole GDT wouldn't really be for
+     * this process, but the only parts we care about are.
+     */
+    _gdtStart = stack_base;
+    _gdtSize = VMPageSize;
+    pTable->allocate(_gdtStart, _gdtSize);
+    uint64_t zero = 0;
+    assert(_gdtSize % sizeof(zero) == 0);
+    for (Addr gdtCurrent = _gdtStart;
+            gdtCurrent < _gdtStart + _gdtSize; gdtCurrent += sizeof(zero)) {
+        initVirtMem->write(gdtCurrent, zero);
+    }
+
     for (int i = 0; i < contextIds.size(); i++) {
         ThreadContext * tc = system->getThreadContext(contextIds[i]);
 
@@ -281,6 +295,10 @@
 
         tc->setMiscRegNoEffect(MISCREG_CS_ATTR, csAttr);
 
+        tc->setMiscRegNoEffect(MISCREG_TSG_BASE, _gdtStart);
+        tc->setMiscRegNoEffect(MISCREG_TSG_EFF_BASE, _gdtStart);
+        tc->setMiscRegNoEffect(MISCREG_TSG_LIMIT, _gdtStart + _gdtSize - 1);
+
         //Set up the registers that describe the operating mode.
         CR0 cr0 = 0;
         cr0.pg = 1; // Turn on paging.
diff -r 969fb3187eba -r e831b4360cfe src/arch/x86/process.hh
--- a/src/arch/x86/process.hh   Fri Feb 27 09:23:00 2009 -0800
+++ b/src/arch/x86/process.hh   Fri Feb 27 09:23:17 2009 -0800
@@ -70,6 +70,9 @@
     class X86LiveProcess : public LiveProcess
     {
       protected:
+        Addr _gdtStart;
+        Addr _gdtSize;
+
         SyscallDesc *syscallDescs;
         const int numSyscallDescs;
 
@@ -80,6 +83,12 @@
         void argsInit(int pageSize);
 
       public:
+        Addr gdtStart()
+        { return _gdtStart; }
+        
+        Addr gdtSize()
+        { return _gdtSize; }
+
         SyscallDesc* getDesc(int callnum);
 
         void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to