57 uint32_t eax, ecx, edx, ebx, esi, edi, esp, ebp, eip, cs, ss, ds, es, fs,
84 SSEVector const &operator[](
size_t index)
const {
85 return _sse[index << 1];
87 SSEVector &operator[](
size_t index) {
return _sse[index << 1]; }
99 uint64_t xfeatures_mask;
117 inline void clear() {
118 std::memset(&gp, 0,
sizeof(gp));
119 std::memset(&x87, 0,
sizeof(x87));
120 std::memset(&xsave_header, 0,
sizeof(xsave_header));
121 std::memset(&avx, 0,
sizeof(avx));
122 std::memset(&dr, 0,
sizeof(dr));
123 std::memset(&xcr0, 0,
sizeof(xcr0));
125 std::memset(&linux_gp, 0,
sizeof(linux_gp));
133 inline uint32_t pc()
const {
return gp.eip; }
134 inline void setPC(uint32_t pc) { gp.eip = pc; }
136 inline uint32_t xpc()
const {
return gp.eip; }
138 inline uint32_t sp()
const {
return gp.esp; }
139 inline void setSP(uint32_t sp) { gp.esp = sp; }
141 inline uint32_t retval()
const {
return gp.eax; }
144#define _REGVALUE(REG) \
145 GPRegisterValue { sizeof(gp.REG), gp.REG }
154 inline void getGPState(GPRegisterValueVector ®s)
const {
156 regs.push_back(_REGVALUE(eax));
157 regs.push_back(_REGVALUE(ebx));
158 regs.push_back(_REGVALUE(ecx));
159 regs.push_back(_REGVALUE(edx));
160 regs.push_back(_REGVALUE(esi));
161 regs.push_back(_REGVALUE(edi));
162 regs.push_back(_REGVALUE(ebp));
163 regs.push_back(_REGVALUE(esp));
164 regs.push_back(_REGVALUE(eip));
165 regs.push_back(_REGVALUE(eflags));
166 regs.push_back(_REGVALUE(cs));
167 regs.push_back(_REGVALUE(ss));
168 regs.push_back(_REGVALUE(ds));
169 regs.push_back(_REGVALUE(es));
170 regs.push_back(_REGVALUE(fs));
171 regs.push_back(_REGVALUE(gs));
174 inline void setGPState(std::vector<uint64_t>
const ®s) {
175 gp.eax =
static_cast<uint32_t
>(regs[0]);
176 gp.ebx =
static_cast<uint32_t
>(regs[1]);
177 gp.ecx =
static_cast<uint32_t
>(regs[2]);
178 gp.edx =
static_cast<uint32_t
>(regs[3]);
179 gp.esi =
static_cast<uint32_t
>(regs[4]);
180 gp.edi =
static_cast<uint32_t
>(regs[5]);
181 gp.ebp =
static_cast<uint32_t
>(regs[6]);
182 gp.esp =
static_cast<uint32_t
>(regs[7]);
183 gp.eip =
static_cast<uint32_t
>(regs[8]);
184 gp.eflags =
static_cast<uint32_t
>(regs[9]);
185 gp.cs =
static_cast<uint32_t
>(regs[10]);
186 gp.ss =
static_cast<uint32_t
>(regs[11]);
187 gp.ds =
static_cast<uint32_t
>(regs[12]);
188 gp.es =
static_cast<uint32_t
>(regs[13]);
189 gp.fs =
static_cast<uint32_t
>(regs[14]);
190 gp.gs =
static_cast<uint32_t
>(regs[15]);
194 inline void getStopGPState(GPRegisterStopMap ®s,
bool forLLDB)
const {
195 auto set = [&](uint32_t lldbReg, uint32_t gdbReg,
197 regs[forLLDB ? lldbReg : gdbReg] = value;
200 set(reg_lldb_eax, reg_gdb_eax, _REGVALUE(eax));
201 set(reg_lldb_ebx, reg_gdb_ebx, _REGVALUE(ebx));
202 set(reg_lldb_ecx, reg_gdb_ecx, _REGVALUE(ecx));
203 set(reg_lldb_edx, reg_gdb_edx, _REGVALUE(edx));
204 set(reg_lldb_esi, reg_gdb_esi, _REGVALUE(esi));
205 set(reg_lldb_edi, reg_gdb_edi, _REGVALUE(edi));
206 set(reg_lldb_ebp, reg_gdb_ebp, _REGVALUE(ebp));
207 set(reg_lldb_esp, reg_gdb_esp, _REGVALUE(esp));
208 set(reg_lldb_eip, reg_gdb_eip, _REGVALUE(eip));
209 set(reg_lldb_cs, reg_gdb_cs, _REGVALUE(cs));
210 set(reg_lldb_ss, reg_gdb_ss, _REGVALUE(ss));
211 set(reg_lldb_ds, reg_gdb_ds, _REGVALUE(ds));
212 set(reg_lldb_es, reg_gdb_es, _REGVALUE(es));
213 set(reg_lldb_fs, reg_gdb_fs, _REGVALUE(fs));
214 set(reg_lldb_gs, reg_gdb_gs, _REGVALUE(gs));
215 set(reg_lldb_eflags, reg_gdb_eflags, _REGVALUE(eflags));
220 inline bool getLLDBRegisterPtr(
int regno,
void **ptr,
size_t *length)
const {
221#define _GETREG2(T, REG, FLD) \
222 case reg_lldb_##REG: \
223 *ptr = &const_cast<CPUState *>(this)->T.FLD, *length = sizeof(T.FLD); \
225#define _GETREG8L(T, REG, FREG) \
226 case reg_lldb_##REG: \
227 *ptr = reinterpret_cast<uint8_t *>(&const_cast<CPUState *>(this)->T.FREG), \
228 *length = sizeof(uint8_t); \
230#define _GETREG8H(T, REG, FREG) \
231 case reg_lldb_##REG: \
233 reinterpret_cast<uint8_t *>(&const_cast<CPUState *>(this)->T.FREG) + \
235 *length = sizeof(uint8_t); \
237#define _GETREG16(T, REG, FREG) \
238 case reg_lldb_##REG: \
240 reinterpret_cast<uint16_t *>(&const_cast<CPUState *>(this)->T.FREG), \
241 *length = sizeof(uint16_t); \
243#define _GETREG(T, REG) _GETREG2(T, REG, REG)
263 _GETREG16(gp, ax, eax);
264 _GETREG16(gp, bx, ebx);
265 _GETREG16(gp, cx, ecx);
266 _GETREG16(gp, dx, edx);
267 _GETREG16(gp, si, esi);
268 _GETREG16(gp, di, edi);
269 _GETREG16(gp, sp, esp);
270 _GETREG16(gp, bp, ebp);
272 _GETREG8L(gp, al, eax);
273 _GETREG8L(gp, bl, ebx);
274 _GETREG8L(gp, cl, ecx);
275 _GETREG8L(gp, dl, edx);
277 _GETREG8H(gp, ah, eax);
278 _GETREG8H(gp, bh, ebx);
279 _GETREG8H(gp, ch, ecx);
280 _GETREG8H(gp, dh, edx);
282 _GETREG2(x87, st0, regs[0].data);
283 _GETREG2(x87, st1, regs[1].data);
284 _GETREG2(x87, st2, regs[2].data);
285 _GETREG2(x87, st3, regs[3].data);
286 _GETREG2(x87, st4, regs[4].data);
287 _GETREG2(x87, st5, regs[5].data);
288 _GETREG2(x87, st6, regs[6].data);
289 _GETREG2(x87, st7, regs[7].data);
290 _GETREG2(x87, fstat, fstw);
291 _GETREG2(x87, fctrl, fctw);
300 _GETREG(avx, mxcsrmask);
301 _GETREG2(avx, ymm0, regs[0]);
302 _GETREG2(avx, ymm1, regs[1]);
303 _GETREG2(avx, ymm2, regs[2]);
304 _GETREG2(avx, ymm3, regs[3]);
305 _GETREG2(avx, ymm4, regs[4]);
306 _GETREG2(avx, ymm5, regs[5]);
307 _GETREG2(avx, ymm6, regs[6]);
308 _GETREG2(avx, ymm7, regs[7]);
322 inline bool getGDBRegisterPtr(
int regno,
void **ptr,
size_t *length)
const {
323#define _GETREG2(T, REG, FLD) \
324 case reg_gdb_##REG: \
325 *ptr = &const_cast<CPUState *>(this)->T.FLD, *length = sizeof(T.FLD); \
327#define _GETREG(T, REG) _GETREG2(T, REG, REG)
347 _GETREG2(x87, st0, regs[0].data);
348 _GETREG2(x87, st1, regs[1].data);
349 _GETREG2(x87, st2, regs[2].data);
350 _GETREG2(x87, st3, regs[3].data);
351 _GETREG2(x87, st4, regs[4].data);
352 _GETREG2(x87, st5, regs[5].data);
353 _GETREG2(x87, st6, regs[6].data);
354 _GETREG2(x87, st7, regs[7].data);
355 _GETREG2(x87, fstat, fstw);
356 _GETREG2(x87, fctrl, fctw);
365 _GETREG2(sse, ymm0, regs[0]);
366 _GETREG2(sse, ymm1, regs[1]);
367 _GETREG2(sse, ymm2, regs[2]);
368 _GETREG2(sse, ymm3, regs[3]);
369 _GETREG2(sse, ymm4, regs[4]);
370 _GETREG2(sse, ymm5, regs[5]);
371 _GETREG2(sse, ymm6, regs[6]);
372 _GETREG2(sse, ymm7, regs[7]);
377 _GETREG(linux_gp, orig_eax);