diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2009-02-25 10:18:51 -0800 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2009-02-25 10:18:51 -0800 |
commit | f35a37ca9eb7ff25c0da5ec14b83f77f5321222c (patch) | |
tree | 2fbf7fe87edaa8a420701dd8699091adcd9e23d8 /src/arch | |
parent | 1bfab291f1899a3e241977425339c799dc96fa9d (diff) | |
download | gem5-f35a37ca9eb7ff25c0da5ec14b83f77f5321222c.tar.xz |
X86: Update CS later so stack accesses have the right permission checks.
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/isa/insts/general_purpose/control_transfer/interrupts_and_exceptions.py | 31 |
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 |