gem5 v24.0.0.0
Loading...
Searching...
No Matches
emulenv.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "arch/x86/emulenv.hh"
39
40#include <cassert>
41
42#include "base/logging.hh"
43
44namespace gem5
45{
46
47using namespace X86ISA;
48
49void EmulEnv::doModRM(const ExtMachInst & machInst)
50{
51 assert(machInst.modRM.mod != 3);
52 //Use the SIB byte for addressing if the modrm byte calls for it.
53 if (machInst.modRM.rm == 4 && machInst.addrSize != 2) {
54 scale = 1 << machInst.sib.scale;
55 index = intRegClass[machInst.sib.index | (machInst.rex.x << 3)];
56 base = intRegClass[machInst.sib.base | (machInst.rex.b << 3)];
57 //In this special case, we don't use a base. The displacement also
58 //changes, but that's managed by the decoder.
59 if (machInst.sib.base == (RegIndex)int_reg::Rbp &&
60 machInst.modRM.mod == 0)
62 //In -this- special case, we don't use an index.
63 if (index == int_reg::Rsp)
65 } else {
66 if (machInst.addrSize == 2) {
67 unsigned rm = machInst.modRM.rm;
68 if (rm <= 3) {
69 scale = 1;
70 if (rm < 2) {
72 } else {
74 }
76 } else {
77 scale = 0;
78 switch (rm) {
79 case 4:
81 break;
82 case 5:
84 break;
85 case 6:
86 // There is a special case when mod is 0 and rm is 6.
87 base = machInst.modRM.mod == 0 ? int_reg::T0 :
89 break;
90 case 7:
92 break;
93 }
94 }
95 } else {
96 scale = 0;
97 base = intRegClass[machInst.modRM.rm | (machInst.rex.b << 3)];
98 if (machInst.modRM.mod == 0 && machInst.modRM.rm == 5) {
99 //Since we need to use a different encoding of this
100 //instruction anyway, just ignore the base in those cases
102 }
103 }
104 }
105 //Figure out what segment to use.
106 if (base != int_reg::Rbp && base != int_reg::Rsp) {
108 } else {
110 }
111 //Handle any segment override that might have been in the instruction
112 int segFromInst = machInst.legacy.seg;
113 if (segFromInst)
114 seg = segFromInst - 1;
115}
116
117void EmulEnv::setSeg(const ExtMachInst & machInst)
118{
120 //Handle any segment override that might have been in the instruction
121 int segFromInst = machInst.legacy.seg;
122 if (segFromInst)
123 seg = segFromInst - 1;
124}
125
126} // namespace gem5
constexpr RegId Rbx
Definition int.hh:135
constexpr RegId Rsi
Definition int.hh:138
constexpr RegId Rsp
Definition int.hh:136
constexpr RegId Rdi
Definition int.hh:139
constexpr RegId Rbp
Definition int.hh:137
constexpr RegId T0
Definition int.hh:148
Bitfield< 2, 0 > rm
Definition types.hh:93
constexpr RegClass intRegClass
Definition int.hh:123
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint16_t RegIndex
Definition types.hh:176
void doModRM(const ExtMachInst &machInst)
Definition emulenv.cc:49
void setSeg(const ExtMachInst &machInst)
Definition emulenv.cc:117
LegacyPrefixVector legacy
Definition types.hh:217

Generated on Tue Jun 18 2024 16:24:00 for gem5 by doxygen 1.11.0