arch-x86: Granularity bit and segment limit
authorMaximilian Stein <maximilian.stein@tu-dresden.de>
Mon, 29 Jan 2018 11:21:32 +0000 (12:21 +0100)
committerChristian Menard <christian.menard@tu-dresden.de>
Tue, 30 Jan 2018 09:52:13 +0000 (09:52 +0000)
If set, the granularity bit indicates that the segment limit of segment
descriptors shall be interpreted as number of 4K blocks rather than
bytes.

The high part (bit 48 to 51) of segment descriptor limits is only 4 bits
wide while the low part (bit 0 to 15) spans 16 bits.

Change-Id: Ie386224ca815275fdb31498fe68310ed9c62cc87
Reviewed-on: https://gem5-review.googlesource.com/7601
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/arch/x86/system.cc

index ecde8366a700b89c05f02853ae824a42af7acdd0..69e013f9bfa4a28ef3196c596b487e36f334e3db 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2007 The Hewlett-Packard Development Company
+ * Copyright (c) 2018 TU Dresden
  * All rights reserved.
  *
  * The license below extends only to copyright in the software and shall
@@ -35,6 +36,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Gabe Black
+ *          Maximilian Stein
  */
 
 #include "arch/x86/system.hh"
@@ -67,6 +69,8 @@ X86ISA::installSegDesc(ThreadContext *tc, SegmentRegIndex seg,
                                   seg == SEGMENT_REG_TSL ||
                                   seg == SYS_SEGMENT_REG_TR;
     uint64_t limit = desc.limitLow | (desc.limitHigh << 16);
+    if (desc.g)
+        limit = (limit << 12) | mask(12);
 
     SegAttr attr = 0;
 
@@ -155,8 +159,8 @@ X86System::initState()
     initDesc.d = 0;               // operand size
     initDesc.g = 1;               // granularity
     initDesc.s = 1;               // system segment
-    initDesc.limitHigh = 0xFFFF;
-    initDesc.limitLow = 0xF;
+    initDesc.limitHigh = 0xF;
+    initDesc.limitLow = 0xFFFF;
     initDesc.baseHigh = 0x0;
     initDesc.baseLow = 0x0;