50 uint64_t rax, rcx, rdx, rbx, rsi, rdi, rsp, rbp, r8, r9, r10, r11, r12,
107 SSEVector const &operator[](
size_t index)
const {
108 return _sse[index << 2];
110 SSEVector &operator[](
size_t index) {
return _sse[index << 2]; }
123 AVXVector const &operator[](
size_t index)
const {
124 return _avx[index << 1];
126 AVXVector &operator[](
size_t index) {
return _avx[index << 1]; }
138 uint64_t xfeatures_mask;
158 inline void clear() {
159 std::memset(&gp, 0,
sizeof(gp));
160 std::memset(&x87, 0,
sizeof(x87));
161 std::memset(&xsave_header, 0,
sizeof(xsave_header));
162 std::memset(&eavx, 0,
sizeof(eavx));
163 std::memset(&dr, 0,
sizeof(dr));
164 std::memset(&xcr0, 0,
sizeof(xcr0));
166 std::memset(&linux_gp, 0,
sizeof(linux_gp));
174 inline uint64_t pc()
const {
return gp.rip; }
175 inline void setPC(uint64_t pc) { gp.rip = pc; }
177 inline uint64_t sp()
const {
return gp.rsp; }
178 inline void setSP(uint64_t sp) { gp.rsp = sp; }
180 inline uint64_t retval()
const {
return gp.rax; }
183#define _REGVALUE(REG) \
184 GPRegisterValue { sizeof(gp.REG), gp.REG }
195 inline void getGPState(GPRegisterValueVector ®s)
const {
197 regs.push_back(_REGVALUE(rax));
198 regs.push_back(_REGVALUE(rbx));
199 regs.push_back(_REGVALUE(rcx));
200 regs.push_back(_REGVALUE(rdx));
201 regs.push_back(_REGVALUE(rsi));
202 regs.push_back(_REGVALUE(rdi));
203 regs.push_back(_REGVALUE(rbp));
204 regs.push_back(_REGVALUE(rsp));
205 regs.push_back(_REGVALUE(r8));
206 regs.push_back(_REGVALUE(r9));
207 regs.push_back(_REGVALUE(r10));
208 regs.push_back(_REGVALUE(r11));
209 regs.push_back(_REGVALUE(r12));
210 regs.push_back(_REGVALUE(r13));
211 regs.push_back(_REGVALUE(r14));
212 regs.push_back(_REGVALUE(r15));
213 regs.push_back(_REGVALUE(rip));
214 regs.push_back(_REGVALUE(eflags));
215 regs.push_back(_REGVALUE(cs));
216 regs.push_back(_REGVALUE(ss));
217 regs.push_back(_REGVALUE(ds));
218 regs.push_back(_REGVALUE(es));
219 regs.push_back(_REGVALUE(fs));
220 regs.push_back(_REGVALUE(gs));
223 inline void setGPState(std::vector<uint64_t>
const ®s) {
241 gp.eflags = regs[17];
251 inline void getStopGPState(GPRegisterStopMap ®s,
bool forLLDB)
const {
252 auto set = [&](uint32_t lldbReg, uint32_t gdbReg,
254 regs[forLLDB ? lldbReg : gdbReg] = value;
257 set(reg_lldb_rax, reg_gdb_rax, _REGVALUE(rax));
258 set(reg_lldb_rcx, reg_gdb_rcx, _REGVALUE(rcx));
259 set(reg_lldb_rdx, reg_gdb_rdx, _REGVALUE(rdx));
260 set(reg_lldb_rbx, reg_gdb_rbx, _REGVALUE(rbx));
261 set(reg_lldb_rsi, reg_gdb_rsi, _REGVALUE(rsi));
262 set(reg_lldb_rdi, reg_gdb_rdi, _REGVALUE(rdi));
263 set(reg_lldb_rsp, reg_gdb_rsp, _REGVALUE(rsp));
264 set(reg_lldb_rbp, reg_gdb_rbp, _REGVALUE(rbp));
265 set(reg_lldb_r8, reg_gdb_r8, _REGVALUE(r8));
266 set(reg_lldb_r9, reg_gdb_r9, _REGVALUE(r9));
267 set(reg_lldb_r10, reg_gdb_r10, _REGVALUE(r10));
268 set(reg_lldb_r11, reg_gdb_r11, _REGVALUE(r11));
269 set(reg_lldb_r12, reg_gdb_r12, _REGVALUE(r12));
270 set(reg_lldb_r13, reg_gdb_r13, _REGVALUE(r13));
271 set(reg_lldb_r14, reg_gdb_r14, _REGVALUE(r14));
272 set(reg_lldb_r15, reg_gdb_r15, _REGVALUE(r15));
273 set(reg_lldb_rip, reg_gdb_rip, _REGVALUE(rip));
274 set(reg_lldb_eflags, reg_gdb_eflags, _REGVALUE(eflags));
275 set(reg_lldb_cs, reg_gdb_cs, _REGVALUE(cs));
276 set(reg_lldb_ss, reg_gdb_ss, _REGVALUE(ss));
277 set(reg_lldb_ds, reg_gdb_ds, _REGVALUE(ds));
278 set(reg_lldb_es, reg_gdb_es, _REGVALUE(es));
279 set(reg_lldb_fs, reg_gdb_fs, _REGVALUE(fs));
280 set(reg_lldb_gs, reg_gdb_gs, _REGVALUE(gs));
285 inline bool getLLDBRegisterPtr(
int regno,
void **ptr,
size_t *length)
const {
286#define _GETREG2(T, REG, FLD) \
287 case reg_lldb_##REG: \
288 *ptr = &const_cast<CPUState64 *>(this)->T.FLD, *length = sizeof(T.FLD); \
290#define _GETREG8L(T, REG, FREG) \
291 case reg_lldb_##REG: \
293 reinterpret_cast<uint8_t *>(&const_cast<CPUState64 *>(this)->T.FREG), \
294 *length = sizeof(uint8_t); \
296#define _GETREG8H(T, REG, FREG) \
297 case reg_lldb_##REG: \
299 reinterpret_cast<uint8_t *>(&const_cast<CPUState64 *>(this)->T.FREG) + \
301 *length = sizeof(uint8_t); \
303#define _GETREG16(T, REG, FREG) \
304 case reg_lldb_##REG: \
306 reinterpret_cast<uint16_t *>(&const_cast<CPUState64 *>(this)->T.FREG), \
307 *length = sizeof(uint16_t); \
309#define _GETREG32(T, REG, FREG) \
310 case reg_lldb_##REG: \
312 reinterpret_cast<uint32_t *>(&const_cast<CPUState64 *>(this)->T.FREG), \
313 *length = sizeof(uint32_t); \
315#define _GETREG(T, REG) _GETREG2(T, REG, REG)
343 _GETREG2(x87, st0, regs[0].data);
344 _GETREG2(x87, st1, regs[1].data);
345 _GETREG2(x87, st2, regs[2].data);
346 _GETREG2(x87, st3, regs[3].data);
347 _GETREG2(x87, st4, regs[4].data);
348 _GETREG2(x87, st5, regs[5].data);
349 _GETREG2(x87, st6, regs[6].data);
350 _GETREG2(x87, st7, regs[7].data);
351 _GETREG2(x87, fstat, fstw);
352 _GETREG2(x87, fctrl, fctw);
354 _GETREG2(x87, fiseg, fiseg);
355 _GETREG2(x87, fioff, fioff);
356 _GETREG2(x87, foseg, foseg);
357 _GETREG2(x87, fooff, fooff);
360 _GETREG32(gp, eax, rax);
361 _GETREG32(gp, ebx, rbx);
362 _GETREG32(gp, ecx, rcx);
363 _GETREG32(gp, edx, rdx);
364 _GETREG32(gp, esi, rsi);
365 _GETREG32(gp, edi, rdi);
366 _GETREG32(gp, esp, rsp);
367 _GETREG32(gp, ebp, rbp);
368 _GETREG32(gp, r8d, r8);
369 _GETREG32(gp, r9d, r9);
370 _GETREG32(gp, r10d, r10);
371 _GETREG32(gp, r11d, r11);
372 _GETREG32(gp, r12d, r12);
373 _GETREG32(gp, r13d, r13);
374 _GETREG32(gp, r14d, r14);
375 _GETREG32(gp, r15d, r15);
377 _GETREG16(gp, ax, rax);
378 _GETREG16(gp, bx, rbx);
379 _GETREG16(gp, cx, rcx);
380 _GETREG16(gp, dx, rdx);
381 _GETREG16(gp, si, rsi);
382 _GETREG16(gp, di, rdi);
383 _GETREG16(gp, sp, rsp);
384 _GETREG16(gp, bp, rbp);
385 _GETREG16(gp, r8w, r8);
386 _GETREG16(gp, r9w, r9);
387 _GETREG16(gp, r10w, r10);
388 _GETREG16(gp, r11w, r11);
389 _GETREG16(gp, r12w, r12);
390 _GETREG16(gp, r13w, r13);
391 _GETREG16(gp, r14w, r14);
392 _GETREG16(gp, r15w, r15);
394 _GETREG8L(gp, al, rax);
395 _GETREG8L(gp, bl, rbx);
396 _GETREG8L(gp, cl, rcx);
397 _GETREG8L(gp, dl, rdx);
398 _GETREG8L(gp, sil, rsi);
399 _GETREG8L(gp, dil, rdi);
400 _GETREG8L(gp, spl, rsp);
401 _GETREG8L(gp, bpl, rbp);
402 _GETREG8L(gp, r8l, r8);
403 _GETREG8L(gp, r9l, r9);
404 _GETREG8L(gp, r10l, r10);
405 _GETREG8L(gp, r11l, r11);
406 _GETREG8L(gp, r12l, r12);
407 _GETREG8L(gp, r13l, r13);
408 _GETREG8L(gp, r14l, r14);
409 _GETREG8L(gp, r15l, r15);
411 _GETREG8H(gp, ah, rax);
412 _GETREG8H(gp, bh, rbx);
413 _GETREG8H(gp, ch, rcx);
414 _GETREG8H(gp, dh, rdx);
417 _GETREG(avx, mxcsrmask);
418 _GETREG2(avx, ymm0, regs[0]);
419 _GETREG2(avx, ymm1, regs[1]);
420 _GETREG2(avx, ymm2, regs[2]);
421 _GETREG2(avx, ymm3, regs[3]);
422 _GETREG2(avx, ymm4, regs[4]);
423 _GETREG2(avx, ymm5, regs[5]);
424 _GETREG2(avx, ymm6, regs[6]);
425 _GETREG2(avx, ymm7, regs[7]);
426 _GETREG2(avx, ymm8, regs[8]);
427 _GETREG2(avx, ymm9, regs[9]);
428 _GETREG2(avx, ymm10, regs[10]);
429 _GETREG2(avx, ymm11, regs[11]);
430 _GETREG2(avx, ymm12, regs[12]);
431 _GETREG2(avx, ymm13, regs[13]);
432 _GETREG2(avx, ymm14, regs[14]);
433 _GETREG2(avx, ymm15, regs[15]);
435 _GETREG2(sse, xmm0, regs[16]);
436 _GETREG2(sse, xmm1, regs[17]);
437 _GETREG2(sse, xmm2, regs[18]);
438 _GETREG2(sse, xmm3, regs[19]);
439 _GETREG2(sse, xmm4, regs[20]);
440 _GETREG2(sse, xmm5, regs[21]);
441 _GETREG2(sse, xmm6, regs[22]);
442 _GETREG2(sse, xmm7, regs[23]);
443 _GETREG2(sse, xmm8, regs[24]);
444 _GETREG2(sse, xmm9, regs[25]);
445 _GETREG2(sse, xmm10, regs[26]);
446 _GETREG2(sse, xmm11, regs[27]);
447 _GETREG2(sse, xmm12, regs[28]);
448 _GETREG2(sse, xmm13, regs[29]);
449 _GETREG2(sse, xmm14, regs[30]);
450 _GETREG2(sse, xmm15, regs[31]);
464 inline bool getGDBRegisterPtr(
int regno,
void **ptr,
size_t *length)
const {
465#define _GETREG2(T, REG, FLD) \
466 case reg_gdb_##REG: \
467 *ptr = &const_cast<CPUState64 *>(this)->T.FLD, *length = sizeof(T.FLD); \
469#define _GETREG(T, REG) _GETREG2(T, REG, REG)
497 _GETREG2(x87, st0, regs[0].data);
498 _GETREG2(x87, st1, regs[1].data);
499 _GETREG2(x87, st2, regs[2].data);
500 _GETREG2(x87, st3, regs[3].data);
501 _GETREG2(x87, st4, regs[4].data);
502 _GETREG2(x87, st5, regs[5].data);
503 _GETREG2(x87, st6, regs[6].data);
504 _GETREG2(x87, st7, regs[7].data);
505 _GETREG2(x87, fstat, fstw);
506 _GETREG2(x87, fctrl, fctw);
508 _GETREG2(x87, fiseg, fiseg);
509 _GETREG2(x87, fioff, fioff);
510 _GETREG2(x87, foseg, foseg);
511 _GETREG2(x87, fooff, fooff);
515 _GETREG2(sse, ymm0, regs[0]);
516 _GETREG2(sse, ymm1, regs[1]);
517 _GETREG2(sse, ymm2, regs[2]);
518 _GETREG2(sse, ymm3, regs[3]);
519 _GETREG2(sse, ymm4, regs[4]);
520 _GETREG2(sse, ymm5, regs[5]);
521 _GETREG2(sse, ymm6, regs[6]);
522 _GETREG2(sse, ymm7, regs[7]);
523 _GETREG2(sse, ymm8, regs[8]);
524 _GETREG2(sse, ymm9, regs[9]);
525 _GETREG2(sse, ymm10, regs[10]);
526 _GETREG2(sse, ymm11, regs[11]);
527 _GETREG2(sse, ymm12, regs[12]);
528 _GETREG2(sse, ymm13, regs[13]);
529 _GETREG2(sse, ymm14, regs[14]);
530 _GETREG2(sse, ymm15, regs[15]);
535 _GETREG(linux_gp, orig_rax);