gem5
v24.0.0.0
Loading...
Searching...
No Matches
arch
x86
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
44
namespace
gem5
45
{
46
47
using namespace
X86ISA;
48
49
void
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)
61
base
=
int_reg::T0
;
62
//In -this- special case, we don't use an index.
63
if
(
index
==
int_reg::Rsp
)
64
index
=
int_reg::T0
;
65
}
else
{
66
if
(machInst.
addrSize
== 2) {
67
unsigned
rm
= machInst.
modRM
.rm;
68
if
(
rm
<= 3) {
69
scale
= 1;
70
if
(
rm
< 2) {
71
base
=
int_reg::Rbx
;
72
}
else
{
73
base
=
int_reg::Rbp
;
74
}
75
index
=
intRegClass
[(
rm
% 2) ?
int_reg::Rdi
:
int_reg::Rsi
];
76
}
else
{
77
scale
= 0;
78
switch
(
rm
) {
79
case
4:
80
base
=
int_reg::Rsi
;
81
break
;
82
case
5:
83
base
=
int_reg::Rdi
;
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
:
88
int_reg::Rbp
;
89
break
;
90
case
7:
91
base
=
int_reg::Rbx
;
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
101
base
=
int_reg::T0
;
102
}
103
}
104
}
105
//Figure out what segment to use.
106
if
(
base
!=
int_reg::Rbp
&&
base
!=
int_reg::Rsp
) {
107
seg
=
segment_idx::Ds
;
108
}
else
{
109
seg
=
segment_idx::Ss
;
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
117
void
EmulEnv::setSeg
(
const
ExtMachInst
& machInst)
118
{
119
seg
=
segment_idx::Ds
;
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
emulenv.hh
logging.hh
gem5::X86ISA::int_reg::Rbx
constexpr RegId Rbx
Definition
int.hh:135
gem5::X86ISA::int_reg::Rsi
constexpr RegId Rsi
Definition
int.hh:138
gem5::X86ISA::int_reg::Rsp
constexpr RegId Rsp
Definition
int.hh:136
gem5::X86ISA::int_reg::Rdi
constexpr RegId Rdi
Definition
int.hh:139
gem5::X86ISA::int_reg::Rbp
constexpr RegId Rbp
Definition
int.hh:137
gem5::X86ISA::int_reg::T0
constexpr RegId T0
Definition
int.hh:148
gem5::X86ISA::segment_idx::Ds
@ Ds
Definition
segment.hh:53
gem5::X86ISA::segment_idx::Ss
@ Ss
Definition
segment.hh:52
gem5::X86ISA::rm
Bitfield< 2, 0 > rm
Definition
types.hh:93
gem5::X86ISA::intRegClass
constexpr RegClass intRegClass
Definition
int.hh:123
gem5
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition
binary32.hh:36
gem5::RegIndex
uint16_t RegIndex
Definition
types.hh:176
gem5::X86ISA::EmulEnv::base
RegId base
Definition
emulenv.hh:57
gem5::X86ISA::EmulEnv::index
RegId index
Definition
emulenv.hh:56
gem5::X86ISA::EmulEnv::doModRM
void doModRM(const ExtMachInst &machInst)
Definition
emulenv.cc:49
gem5::X86ISA::EmulEnv::scale
uint8_t scale
Definition
emulenv.hh:55
gem5::X86ISA::EmulEnv::seg
int seg
Definition
emulenv.hh:54
gem5::X86ISA::EmulEnv::setSeg
void setSeg(const ExtMachInst &machInst)
Definition
emulenv.cc:117
gem5::X86ISA::ExtMachInst
Definition
types.hh:213
gem5::X86ISA::ExtMachInst::rex
Rex rex
Definition
types.hh:218
gem5::X86ISA::ExtMachInst::sib
Sib sib
Definition
types.hh:230
gem5::X86ISA::ExtMachInst::modRM
ModRM modRM
Definition
types.hh:229
gem5::X86ISA::ExtMachInst::addrSize
uint8_t addrSize
Definition
types.hh:238
gem5::X86ISA::ExtMachInst::legacy
LegacyPrefixVector legacy
Definition
types.hh:217
Generated on Tue Jun 18 2024 16:24:00 for gem5 by
doxygen
1.11.0