X86: Make microcode use presegmentation RIPs and the rest of m5 use post segmentation...
authorGabe Black <gblack@eecs.umich.edu>
Tue, 13 Nov 2007 09:31:43 +0000 (01:31 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 13 Nov 2007 09:31:43 +0000 (01:31 -0800)
--HG--
extra : convert_revision : d8cda7c8b9a2afb8a9d601b6d61529a96c5f87fe

src/arch/x86/isa/microops/regop.isa
src/arch/x86/isa/operands.isa
src/arch/x86/process.cc

index 58b267e0d11d91e53404b4af1ea42d361b9011e9..4ac3a9d98556082daeff4e116eaa5c0c0ca09cd7 100644 (file)
@@ -835,7 +835,7 @@ let {{
         '''
 
     class Wrip(WrRegOp, CondRegOp):
-        code = 'RIP = psrc1 + sop2'
+        code = 'RIP = psrc1 + sop2 + CSBase'
         else_code="RIP = RIP;"
 
     class Br(WrRegOp, CondRegOp):
@@ -846,7 +846,7 @@ let {{
         code = 'ccFlagBits = psrc1 ^ op2'
 
     class Rdip(RdRegOp):
-        code = 'DestReg = RIP'
+        code = 'DestReg = RIP - CSBase'
 
     class Ruflags(RdRegOp):
         code = 'DestReg = ccFlagBits'
index 542638eddf9e6f70a49775eca8999e9c1c3f4811..f50e71727b19a344f5aec010a5ae11fe9353b10c 100644 (file)
@@ -126,5 +126,6 @@ def operands {{
         'ControlSrc1':   ('ControlReg', 'uqw', 'MISCREG_CR(src1)', (None, None, ['IsSerializeAfter','IsSerializing','IsNonSpeculative']), 72),
         'EferOp':        ('ControlReg', 'uqw', 'MISCREG_EFER', (None, None, ['IsSerializeAfter','IsSerializing','IsNonSpeculative']), 73),
         'CR4Op':         ('ControlReg', 'uqw', 'MISCREG_CR4', (None, None, ['IsSerializeAfter','IsSerializing','IsNonSpeculative']), 74),
+        'CSBase':        ('ControlReg', 'udw', 'MISCREG_CS_BASE', (None, None, ['IsSerializeAfter','IsSerializing','IsNonSpeculative']), 80),
         'Mem':           ('Mem', 'uqw', None, ('IsMemRef', 'IsLoad', 'IsStore'), 100)
 }};
index c6246c76bd0bd65e59ce9deb2768d3a9dcead82d..633b2f13611a2f3ecd495dbffd86b5783d472cf7 100644 (file)
@@ -461,6 +461,8 @@ X86LiveProcess::argsInit(int intSize, int pageSize)
     threadContexts[0]->setIntReg(StackPointerReg, stack_min);
 
     Addr prog_entry = objFile->entryPoint();
+    // There doesn't need to be any segment base added in since we're dealing
+    // with the flat segmentation model.
     threadContexts[0]->setPC(prog_entry);
     threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));