X86: Truncate addresses to 32 bits except in 64 bit mode, not long mode.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 28 May 2012 02:01:04 +0000 (19:01 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 28 May 2012 02:01:04 +0000 (19:01 -0700)
A small change was added a while ago to keep addresses from overflowing 32
bits when larger addresses shouldn't be accessible to software. That change
truncated when not in long mode, but really it should have truncated when not
in 64 bit mode. The difference is whether compatibility mode is included, a
mode that's supposed to act like a legacy 32 bit mode.

src/arch/x86/tlb.cc

index 8dad84dc4e695c4563c823c78c59a12c1c07ab62..eb6e9c530baa2edfef86f52dd013fd9769697b44 100644 (file)
@@ -289,7 +289,7 @@ TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,
                     return new GeneralProtection(0);
             }
         }
-        if (m5Reg.mode != LongMode ||
+        if (m5Reg.submode != SixtyFourBitMode ||
                 (flags & (AddrSizeFlagBit << FlagShift)))
             vaddr &= mask(32);
         // If paging is enabled, do the translation.