12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- RegisterContextPOSIX_i386.cpp ---------------------------*- C++ -*-===// 22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// The LLVM Compiler Infrastructure 42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source 62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details. 72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// 82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===// 92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Core/DataExtractor.h" 112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Thread.h" 122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Host/Endian.h" 1377e1b85eaaa20f7650c894c9a1515d581e4a07efAndy Gibbs#include "llvm/Support/Compiler.h" 142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIX.h" 162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessPOSIXLog.h" 172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "ProcessMonitor.h" 182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContext_i386.h" 19253dbb4618f89b43b50aba42f3364175f4b65524Matt Kopec#include "RegisterContext_x86.h" 202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenusing namespace lldb_private; 222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenusing namespace lldb; 232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenenum 252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_first_gpr, 272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eax = k_first_gpr, 282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ebx, 292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ecx, 302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_edx, 312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_edi, 322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_esi, 332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ebp, 342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_esp, 352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ss, 362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eflags, 372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifdef __FreeBSD__ 382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_orig_ax, 392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif 402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eip, 412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_cs, 422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ds, 432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_es, 442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_fs, 452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_gs, 462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_last_gpr = gpr_gs, 472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_first_fpr, 492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fcw = k_first_fpr, 502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fsw, 512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_ftw, 522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fop, 532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_ip, 542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_cs, 552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_foo, 562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fos, 572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_mxcsr, 582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm0, 592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm1, 602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm2, 612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm3, 622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm4, 632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm5, 642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm6, 652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm7, 662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm0, 672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm1, 682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm2, 692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm3, 702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm4, 712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm5, 722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm6, 732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm7, 742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_last_fpr = fpu_xmm7, 752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_num_registers, 772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_num_gpr_registers = k_last_gpr - k_first_gpr + 1, 782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_num_fpu_registers = k_last_fpr - k_first_fpr + 1 792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Number of register sets provided by this context. 822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenenum 832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen k_num_register_sets = 2 852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic const 882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenuint32_t g_gpr_regnums[k_num_gpr_registers] = 892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eax, 912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ebx, 922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ecx, 932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_edx, 942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_edi, 952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_esi, 962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ebp, 972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_esp, 982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ss, 992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eflags, 1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifdef __FreeBSD__ 1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_orig_ax, 1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif 1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_eip, 1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_cs, 1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_ds, 1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_es, 1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_fs, 1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen gpr_gs, 1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic const uint32_t 1122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Cheng_fpu_regnums[k_num_fpu_registers] = 1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 1142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fcw, 1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fsw, 1162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_ftw, 1172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fop, 1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_ip, 1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_cs, 1202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_foo, 1212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_fos, 1222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_mxcsr, 1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm0, 1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm1, 1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm2, 1262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm3, 1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm4, 1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm5, 1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm6, 1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_stmm7, 1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm0, 1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm1, 1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm2, 1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm3, 1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm4, 1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm5, 1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm6, 1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen fpu_xmm7, 1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic const RegisterSet 1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Cheng_reg_sets[k_num_register_sets] = 1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums }, 1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { "Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums } 1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Computes the offset of the given GPR in the user data area. 1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define GPR_OFFSET(regname) \ 1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen (offsetof(RegisterContext_i386::UserArea, regs) + \ 1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen offsetof(RegisterContext_i386::GPR, regname)) 1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Computes the offset of the given FPR in the user data area. 1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define FPR_OFFSET(regname) \ 1552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen (offsetof(RegisterContext_i386::UserArea, i387) + \ 1562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen offsetof(RegisterContext_i386::FPU, regname)) 1572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Number of bytes needed to represent a GPR. 1592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define GPR_SIZE(reg) sizeof(((RegisterContext_i386::GPR*)NULL)->reg) 1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Number of bytes needed to represent a FPR. 1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define FPR_SIZE(reg) sizeof(((RegisterContext_i386::FPU*)NULL)->reg) 1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Number of bytes needed to represent the i'th FP register. 1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define FP_SIZE sizeof(((RegisterContext_i386::MMSReg*)NULL)->bytes) 1662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Number of bytes needed to represent an XMM register. 1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define XMM_SIZE sizeof(RegisterContext_i386::XMMReg) 1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4) \ 1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { #reg, alt, GPR_SIZE(reg), GPR_OFFSET(reg), eEncodingUint, \ 172402607fe513617c06282d4ae479522e244a53b71Johnny Chen eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg }, NULL, NULL } 1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define DEFINE_FPR(reg, kind1, kind2, kind3, kind4) \ 1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { #reg, NULL, FPR_SIZE(reg), FPR_OFFSET(reg), eEncodingUint, \ 176402607fe513617c06282d4ae479522e244a53b71Johnny Chen eFormatHex, { kind1, kind2, kind3, kind4, fpu_##reg }, NULL, NULL } 1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define DEFINE_FP(reg, i) \ 17977e1b85eaaa20f7650c894c9a1515d581e4a07efAndy Gibbs { #reg#i, NULL, FP_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]), \ 18077e1b85eaaa20f7650c894c9a1515d581e4a07efAndy Gibbs eEncodingVector, eFormatVectorOfUInt8, \ 1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { dwarf_##reg##i, dwarf_##reg##i, \ 182402607fe513617c06282d4ae479522e244a53b71Johnny Chen LLDB_INVALID_REGNUM, gdb_##reg##i, fpu_##reg##i }, NULL, NULL } 1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define DEFINE_XMM(reg, i) \ 18577e1b85eaaa20f7650c894c9a1515d581e4a07efAndy Gibbs { #reg#i, NULL, XMM_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]), \ 18677e1b85eaaa20f7650c894c9a1515d581e4a07efAndy Gibbs eEncodingVector, eFormatVectorOfUInt8, \ 1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { dwarf_##reg##i, dwarf_##reg##i, \ 188402607fe513617c06282d4ae479522e244a53b71Johnny Chen LLDB_INVALID_REGNUM, gdb_##reg##i, fpu_##reg##i }, NULL, NULL } 1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic RegisterInfo 1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Cheng_register_infos[k_num_registers] = 1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // General purpose registers. 1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(eax, NULL, gcc_eax, dwarf_eax, LLDB_INVALID_REGNUM, gdb_eax), 1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(ebx, NULL, gcc_ebx, dwarf_ebx, LLDB_INVALID_REGNUM, gdb_ebx), 1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(ecx, NULL, gcc_ecx, dwarf_ecx, LLDB_INVALID_REGNUM, gdb_ecx), 1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(edx, NULL, gcc_edx, dwarf_edx, LLDB_INVALID_REGNUM, gdb_edx), 1982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(edi, NULL, gcc_edi, dwarf_edi, LLDB_INVALID_REGNUM, gdb_edi), 1992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(esi, NULL, gcc_esi, dwarf_esi, LLDB_INVALID_REGNUM, gdb_esi), 2002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(ebp, "fp", gcc_ebp, dwarf_ebp, LLDB_INVALID_REGNUM, gdb_ebp), 2012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(esp, "sp", gcc_esp, dwarf_esp, LLDB_INVALID_REGNUM, gdb_esp), 2022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(ss, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ss), 2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(eflags, "flags", gcc_eflags, dwarf_eflags, LLDB_INVALID_REGNUM, gdb_eflags), 2042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(eip, "pc", gcc_eip, dwarf_eip, LLDB_INVALID_REGNUM, gdb_eip), 2052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(cs, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_cs), 2062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(ds, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ds), 2072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(es, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_es), 2082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(fs, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fs), 2092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_GPR(gs, NULL, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_gs), 2102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // Floating point registers. 2122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(fcw, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fcw), 2132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(fsw, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fsw), 2142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(ftw, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ftw), 2152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(fop, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fop), 2162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(ip, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ip), 2172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(cs, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_cs), 2182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(foo, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_dp), 2192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(fos, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_ds), 2202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FPR(mxcsr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_mxcsr), 2212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 0), 2232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 1), 2242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 2), 2252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 3), 2262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 4), 2272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 5), 2282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 6), 2292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_FP(stmm, 7), 2302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // XMM registers 2322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 0), 2332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 1), 2342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 2), 2352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 3), 2362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 4), 2372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 5), 2382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 6), 2392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen DEFINE_XMM(xmm, 7), 2402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}; 2422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef NDEBUG 2442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic size_t k_num_register_infos = (sizeof(g_register_infos)/sizeof(RegisterInfo)); 2452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif 2462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic unsigned GetRegOffset(unsigned reg) 2482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(reg < k_num_registers && "Invalid register number."); 2502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return g_register_infos[reg].byte_offset; 2512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenstatic unsigned GetRegSize(unsigned reg) 2542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(reg < k_num_registers && "Invalid register number."); 2562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return g_register_infos[reg].byte_size; 2572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::RegisterContext_i386(Thread &thread, 2602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint32_t concrete_frame_idx) 2612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen : RegisterContextPOSIX(thread, concrete_frame_idx) 2622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::~RegisterContext_i386() 2662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenProcessMonitor & 2702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::GetMonitor() 2712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 272e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton ProcessSP base = CalculateProcess(); 273e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton ProcessPOSIX *process = static_cast<ProcessPOSIX*>(base.get()); 2742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return process->GetMonitor(); 2752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid 2782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::Invalidate() 2792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid 2832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::InvalidateAllRegisters() 2842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t 2882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::GetRegisterCount() 2892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(k_num_register_infos == k_num_registers); 2912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return k_num_registers; 2922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 2932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 2942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst RegisterInfo * 2952989a5aec5b5e313e0885c215681c68151e7c4bbGreg ClaytonRegisterContext_i386::GetRegisterInfoAtIndex(size_t reg) 2962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 2972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(k_num_register_infos == k_num_registers); 2982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (reg < k_num_registers) 2992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return &g_register_infos[reg]; 3002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen else 3012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return NULL; 3022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chensize_t 3052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::GetRegisterSetCount() 3062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return k_num_register_sets; 3082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst RegisterSet * 3112989a5aec5b5e313e0885c215681c68151e7c4bbGreg ClaytonRegisterContext_i386::GetRegisterSet(size_t set) 3122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (set < k_num_register_sets) 3142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return &g_reg_sets[set]; 3152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen else 3162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return NULL; 3172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenunsigned 3202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::GetRegisterIndexFromOffset(unsigned offset) 3212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen unsigned reg; 3232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen for (reg = 0; reg < k_num_registers; reg++) 3242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 3252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (g_register_infos[reg].byte_offset == offset) 3262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen break; 3272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 3282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(reg < k_num_registers && "Invalid register offset."); 3292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return reg; 3302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenconst char * 3332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::GetRegisterName(unsigned reg) 3342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen assert(reg < k_num_registers && "Invalid register offset."); 3362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return g_register_infos[reg].name; 3372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 3402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::ReadRegister(const RegisterInfo *reg_info, 3412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen RegisterValue &value) 3422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 3442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor &monitor = GetMonitor(); 345c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi return monitor.ReadRegisterValue(m_thread.GetID(), GetRegOffset(reg), 346c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi GetRegisterName(reg), GetRegSize(reg), value); 3472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 3502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::ReadAllRegisterValues(DataBufferSP &data_sp) 3512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return false; 3532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool RegisterContext_i386::WriteRegister(const RegisterInfo *reg_info, 356c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi const RegisterValue &value) 3572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 3592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor &monitor = GetMonitor(); 360c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi return monitor.WriteRegisterValue(m_thread.GetID(), GetRegOffset(reg), 361c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi GetRegisterName(reg), value); 3622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 3652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::WriteAllRegisterValues(const DataBufferSP &data) 3662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return false; 3682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 3712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::UpdateAfterBreakpoint() 3722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen // PC points one byte past the int3 responsible for the breakpoint. 3742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen lldb::addr_t pc; 3752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if ((pc = GetPC()) == LLDB_INVALID_ADDRESS) 3772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return false; 3782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen SetPC(pc - 1); 3802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return true; 3812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 3822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 3832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenuint32_t 3842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::ConvertRegisterKindToRegisterNumber(uint32_t kind, 3852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint32_t num) 3862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 3872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (kind == eRegisterKindGeneric) 3882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 3892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen switch (num) 3902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 3912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case LLDB_REGNUM_GENERIC_PC: return gpr_eip; 3922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case LLDB_REGNUM_GENERIC_SP: return gpr_esp; 3932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case LLDB_REGNUM_GENERIC_FP: return gpr_ebp; 3942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case LLDB_REGNUM_GENERIC_FLAGS: return gpr_eflags; 3952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case LLDB_REGNUM_GENERIC_RA: 3962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen default: 3972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return LLDB_INVALID_REGNUM; 3982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 3992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 4012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (kind == eRegisterKindGCC || kind == eRegisterKindDWARF) 4022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 4032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen switch (num) 4042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 4052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_eax: return gpr_eax; 4062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_edx: return gpr_edx; 4072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_ecx: return gpr_ecx; 4082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_ebx: return gpr_ebx; 4092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_esi: return gpr_esi; 4102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_edi: return gpr_edi; 4112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_ebp: return gpr_ebp; 4122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_esp: return gpr_esp; 4132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_eip: return gpr_eip; 4142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm0: return fpu_xmm0; 4152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm1: return fpu_xmm1; 4162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm2: return fpu_xmm2; 4172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm3: return fpu_xmm3; 4182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm4: return fpu_xmm4; 4192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm5: return fpu_xmm5; 4202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm6: return fpu_xmm6; 4212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_xmm7: return fpu_xmm7; 4222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm0: return fpu_stmm0; 4232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm1: return fpu_stmm1; 4242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm2: return fpu_stmm2; 4252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm3: return fpu_stmm3; 4262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm4: return fpu_stmm4; 4272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm5: return fpu_stmm5; 4282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm6: return fpu_stmm6; 4292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case dwarf_stmm7: return fpu_stmm7; 4302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen default: 4312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return LLDB_INVALID_REGNUM; 4322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 4352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (kind == eRegisterKindGDB) 4362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 4372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen switch (num) 4382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 4392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_eax : return gpr_eax; 4402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ebx : return gpr_ebx; 4412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ecx : return gpr_ecx; 4422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_edx : return gpr_edx; 4432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_esi : return gpr_esi; 4442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_edi : return gpr_edi; 4452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ebp : return gpr_ebp; 4462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_esp : return gpr_esp; 4472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_eip : return gpr_eip; 4482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_eflags : return gpr_eflags; 4492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_cs : return gpr_cs; 4502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ss : return gpr_ss; 4512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ds : return gpr_ds; 4522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_es : return gpr_es; 4532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fs : return gpr_fs; 4542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_gs : return gpr_gs; 4552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm0 : return fpu_stmm0; 4562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm1 : return fpu_stmm1; 4572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm2 : return fpu_stmm2; 4582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm3 : return fpu_stmm3; 4592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm4 : return fpu_stmm4; 4602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm5 : return fpu_stmm5; 4612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm6 : return fpu_stmm6; 4622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_stmm7 : return fpu_stmm7; 4632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fcw : return fpu_fcw; 4642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fsw : return fpu_fsw; 4652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ftw : return fpu_ftw; 4662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fpu_cs : return fpu_cs; 4672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_ip : return fpu_ip; 4682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fpu_ds : return fpu_fos; 4692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_dp : return fpu_foo; 4702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_fop : return fpu_fop; 4712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm0 : return fpu_xmm0; 4722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm1 : return fpu_xmm1; 4732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm2 : return fpu_xmm2; 4742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm3 : return fpu_xmm3; 4752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm4 : return fpu_xmm4; 4762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm5 : return fpu_xmm5; 4772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm6 : return fpu_xmm6; 4782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_xmm7 : return fpu_xmm7; 4792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen case gdb_mxcsr : return fpu_mxcsr; 4802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen default: 4812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return LLDB_INVALID_REGNUM; 4822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen else if (kind == eRegisterKindLLDB) 4852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 4862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return num; 4872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 4882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 4892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return LLDB_INVALID_REGNUM; 4902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 4912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 4922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 4932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::HardwareSingleStep(bool enable) 4942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 4952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen enum { TRACE_BIT = 0x100 }; 4962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint64_t eflags; 4972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 4982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if ((eflags = ReadRegisterAsUnsigned(gpr_eflags, -1UL)) == -1UL) 4992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return false; 5002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (enable) 5022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 5032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (eflags & TRACE_BIT) 5042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return true; 5052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen eflags |= TRACE_BIT; 5072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 5082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen else 5092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 5102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (!(eflags & TRACE_BIT)) 5112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return false; 5122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen eflags &= ~TRACE_BIT; 5142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 5152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return WriteRegisterFromUnsigned(gpr_eflags, eflags); 5172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 5182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenvoid 5202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::LogGPR(const char *title) 5212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 522d8f6b6446d8b9d1568f91f51bc5dd3aae45db5ccAshok Thirumurthi Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS)); 5232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (log) 5242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 5252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen if (title) 5262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen log->Printf ("%s", title); 5272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen for (uint32_t i=0; i<k_num_gpr_registers; i++) 5282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen { 5292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen uint32_t reg = gpr_eax + i; 5305f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("%12s = 0x%8.8" PRIx64, g_register_infos[reg].name, ((uint64_t*)&user.regs)[reg]); 5312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 5322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen } 5332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 5342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 5362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::ReadGPR() 5372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 5382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen bool result; 5392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor &monitor = GetMonitor(); 541247bc3a7bb79482185bd6dedb0b9f8b5eefd8ca1Matt Kopec result = monitor.ReadGPR(m_thread.GetID(), &user.regs, sizeof(user.regs)); 5422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen LogGPR("RegisterContext_i386::ReadGPR()"); 5432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen return result; 5442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 5452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen 5462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenbool 5472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny ChenRegisterContext_i386::ReadFPR() 5482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{ 5492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen ProcessMonitor &monitor = GetMonitor(); 550247bc3a7bb79482185bd6dedb0b9f8b5eefd8ca1Matt Kopec return monitor.ReadFPR(m_thread.GetID(), &user.i387, sizeof(user.i387)); 5512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen} 552