summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaximilian Stein <maximilian.stein@tu-dresden.de>2018-01-29 12:21:32 +0100
committerChristian Menard <christian.menard@tu-dresden.de>2018-01-30 09:52:13 +0000
commit3e52d9fb3328258139f3523175d28ae8f11af702 (patch)
tree41340b7487e2aae28167a68cd0e1b9a44b43e3fb
parent89f2871168bcd2a69f3edc2e9f12f3bc66101128 (diff)
downloadgem5-3e52d9fb3328258139f3523175d28ae8f11af702.tar.xz
arch-x86: Granularity bit and segment limit
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>
-rw-r--r--src/arch/x86/system.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/arch/x86/system.cc b/src/arch/x86/system.cc
index ecde8366a..69e013f9b 100644
--- a/src/arch/x86/system.cc
+++ b/src/arch/x86/system.cc
@@ -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;