summaryrefslogtreecommitdiff
path: root/src/arch/x86/isa/insts
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-02-25 10:18:51 -0800
committerGabe Black <gblack@eecs.umich.edu>2009-02-25 10:18:51 -0800
commitf35a37ca9eb7ff25c0da5ec14b83f77f5321222c (patch)
tree2fbf7fe87edaa8a420701dd8699091adcd9e23d8 /src/arch/x86/isa/insts
parent1bfab291f1899a3e241977425339c799dc96fa9d (diff)
downloadgem5-f35a37ca9eb7ff25c0da5ec14b83f77f5321222c.tar.xz
X86: Update CS later so stack accesses have the right permission checks.
Diffstat (limited to 'src/arch/x86/isa/insts')
-rw-r--r--src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py b/src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py
index 1f14eb95c..8d66cc445 100644
--- a/src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py
+++ b/src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py
@@ -118,20 +118,13 @@ protToVirtFallThrough:
andi t6, t2, 0xF8, dataSize=8
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
br label("globalCSDescriptor"), flags=(CEZF,)
- ld t6, tsl, [1, t0, t6], dataSize=8
+ ld t8, tsl, [1, t0, t6], dataSize=8
br label("processCSDescriptor")
globalCSDescriptor:
- ld t6, tsg, [1, t0, t6], dataSize=8
+ ld t8, tsg, [1, t0, t6], dataSize=8
processCSDescriptor:
chks t2, t6, dataSize=8
- # This actually updates state which is wrong. It should wait until we know
- # we're not going to fault. Unfortunately, that's hard to do.
- wrdl cs, t6, t2
- wrsel cs, t2
-
- #CPL = temp_CPL
-
###
### Get the new stack pointer and stack segment off the old stack if necessary,
@@ -175,24 +168,24 @@ doPopStackStuff:
# POP.v temp_RSP
ld t6, ss, [1, t0, rsp], "3 * env.dataSize", dataSize=ssz
# POP.v temp_SS
- ld t2, ss, [1, t0, rsp], "4 * env.dataSize", dataSize=ssz
+ ld t9, ss, [1, t0, rsp], "4 * env.dataSize", dataSize=ssz
# SS = READ_DESCRIPTOR (temp_SS, ss_chk)
- andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
+ andi t0, t9, 0xFC, flags=(EZF,), dataSize=2
br label("processSSDescriptor"), flags=(CEZF,)
- andi t7, t2, 0xF8, dataSize=8
- andi t0, t2, 0x4, flags=(EZF,), dataSize=2
+ andi t7, t9, 0xF8, dataSize=8
+ andi t0, t9, 0x4, flags=(EZF,), dataSize=2
br label("globalSSDescriptor"), flags=(CEZF,)
ld t7, tsl, [1, t0, t7], dataSize=8
br label("processSSDescriptor")
globalSSDescriptor:
ld t7, tsg, [1, t0, t7], dataSize=8
processSSDescriptor:
- chks t2, t7, dataSize=8
+ chks t9, t7, dataSize=8
# This actually updates state which is wrong. It should wait until we know
# we're not going to fault. Unfortunately, that's hard to do.
- wrdl ss, t7, t2
- wrsel ss, t2
+ wrdl ss, t7, t9
+ wrsel ss, t9
###
### From this point downwards, we can't fault. We can update user visible state.
@@ -204,6 +197,12 @@ processSSDescriptor:
fallThroughPopStackStuff:
+ # Update CS
+ wrdl cs, t8, t2
+ wrsel cs, t2
+
+ #CPL = temp_CPL
+
#IF (changing CPL)
#{
srli t7, t4, 4