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