1254721Semaste//===-- RegisterContextDarwin_x86_64.h --------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_RegisterContextDarwin_x86_64_h_ 11254721Semaste#define liblldb_RegisterContextDarwin_x86_64_h_ 12254721Semaste 13254721Semaste// C Includes 14254721Semaste// C++ Includes 15254721Semaste// Other libraries and framework includes 16254721Semaste// Project includes 17254721Semaste#include "lldb/lldb-private.h" 18254721Semaste#include "lldb/Target/RegisterContext.h" 19254721Semaste 20254721Semasteclass RegisterContextDarwin_x86_64 : public lldb_private::RegisterContext 21254721Semaste{ 22254721Semastepublic: 23254721Semaste RegisterContextDarwin_x86_64 (lldb_private::Thread &thread, 24254721Semaste uint32_t concrete_frame_idx); 25254721Semaste 26254721Semaste virtual 27254721Semaste ~RegisterContextDarwin_x86_64(); 28254721Semaste 29254721Semaste virtual void 30254721Semaste InvalidateAllRegisters (); 31254721Semaste 32254721Semaste virtual size_t 33254721Semaste GetRegisterCount (); 34254721Semaste 35254721Semaste virtual const lldb_private::RegisterInfo * 36254721Semaste GetRegisterInfoAtIndex (size_t reg); 37254721Semaste 38254721Semaste virtual size_t 39254721Semaste GetRegisterSetCount (); 40254721Semaste 41254721Semaste virtual const lldb_private::RegisterSet * 42254721Semaste GetRegisterSet (size_t set); 43254721Semaste 44254721Semaste virtual bool 45254721Semaste ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value); 46254721Semaste 47254721Semaste virtual bool 48254721Semaste WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value); 49254721Semaste 50254721Semaste virtual bool 51254721Semaste ReadAllRegisterValues (lldb::DataBufferSP &data_sp); 52254721Semaste 53254721Semaste virtual bool 54254721Semaste WriteAllRegisterValues (const lldb::DataBufferSP &data_sp); 55254721Semaste 56254721Semaste virtual uint32_t 57254721Semaste ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num); 58254721Semaste 59254721Semaste virtual bool 60254721Semaste HardwareSingleStep (bool enable); 61254721Semaste 62254721Semaste struct GPR 63254721Semaste { 64254721Semaste uint64_t rax; 65254721Semaste uint64_t rbx; 66254721Semaste uint64_t rcx; 67254721Semaste uint64_t rdx; 68254721Semaste uint64_t rdi; 69254721Semaste uint64_t rsi; 70254721Semaste uint64_t rbp; 71254721Semaste uint64_t rsp; 72254721Semaste uint64_t r8; 73254721Semaste uint64_t r9; 74254721Semaste uint64_t r10; 75254721Semaste uint64_t r11; 76254721Semaste uint64_t r12; 77254721Semaste uint64_t r13; 78254721Semaste uint64_t r14; 79254721Semaste uint64_t r15; 80254721Semaste uint64_t rip; 81254721Semaste uint64_t rflags; 82254721Semaste uint64_t cs; 83254721Semaste uint64_t fs; 84254721Semaste uint64_t gs; 85254721Semaste }; 86254721Semaste 87254721Semaste struct MMSReg 88254721Semaste { 89254721Semaste uint8_t bytes[10]; 90254721Semaste uint8_t pad[6]; 91254721Semaste }; 92254721Semaste 93254721Semaste struct XMMReg 94254721Semaste { 95254721Semaste uint8_t bytes[16]; 96254721Semaste }; 97254721Semaste 98254721Semaste struct FPU 99254721Semaste { 100254721Semaste uint32_t pad[2]; 101254721Semaste uint16_t fcw; // "fctrl" 102254721Semaste uint16_t fsw; // "fstat" 103254721Semaste uint8_t ftw; // "ftag" 104254721Semaste uint8_t pad1; 105254721Semaste uint16_t fop; // "fop" 106254721Semaste uint32_t ip; // "fioff" 107254721Semaste uint16_t cs; // "fiseg" 108254721Semaste uint16_t pad2; 109254721Semaste uint32_t dp; // "fooff" 110254721Semaste uint16_t ds; // "foseg" 111254721Semaste uint16_t pad3; 112254721Semaste uint32_t mxcsr; 113254721Semaste uint32_t mxcsrmask; 114254721Semaste MMSReg stmm[8]; 115254721Semaste XMMReg xmm[16]; 116254721Semaste uint8_t pad4[6*16]; 117254721Semaste int pad5; 118254721Semaste }; 119254721Semaste 120254721Semaste struct EXC 121254721Semaste { 122254721Semaste uint32_t trapno; 123254721Semaste uint32_t err; 124254721Semaste uint64_t faultvaddr; 125254721Semaste }; 126254721Semaste 127254721Semasteprotected: 128254721Semaste 129254721Semaste enum 130254721Semaste { 131254721Semaste GPRRegSet = 4, 132254721Semaste FPURegSet = 5, 133254721Semaste EXCRegSet = 6 134254721Semaste }; 135254721Semaste 136254721Semaste enum 137254721Semaste { 138254721Semaste GPRWordCount = sizeof(GPR)/sizeof(uint32_t), 139254721Semaste FPUWordCount = sizeof(FPU)/sizeof(uint32_t), 140254721Semaste EXCWordCount = sizeof(EXC)/sizeof(uint32_t) 141254721Semaste }; 142254721Semaste 143254721Semaste enum 144254721Semaste { 145254721Semaste Read = 0, 146254721Semaste Write = 1, 147254721Semaste kNumErrors = 2 148254721Semaste }; 149254721Semaste 150254721Semaste GPR gpr; 151254721Semaste FPU fpu; 152254721Semaste EXC exc; 153254721Semaste int gpr_errs[2]; // Read/Write errors 154254721Semaste int fpu_errs[2]; // Read/Write errors 155254721Semaste int exc_errs[2]; // Read/Write errors 156254721Semaste 157254721Semaste void 158254721Semaste InvalidateAllRegisterStates() 159254721Semaste { 160254721Semaste SetError (GPRRegSet, Read, -1); 161254721Semaste SetError (FPURegSet, Read, -1); 162254721Semaste SetError (EXCRegSet, Read, -1); 163254721Semaste } 164254721Semaste 165254721Semaste int 166254721Semaste GetError (int flavor, uint32_t err_idx) const 167254721Semaste { 168254721Semaste if (err_idx < kNumErrors) 169254721Semaste { 170254721Semaste switch (flavor) 171254721Semaste { 172254721Semaste // When getting all errors, just OR all values together to see if 173254721Semaste // we got any kind of error. 174254721Semaste case GPRRegSet: return gpr_errs[err_idx]; 175254721Semaste case FPURegSet: return fpu_errs[err_idx]; 176254721Semaste case EXCRegSet: return exc_errs[err_idx]; 177254721Semaste default: break; 178254721Semaste } 179254721Semaste } 180254721Semaste return -1; 181254721Semaste } 182254721Semaste 183254721Semaste bool 184254721Semaste SetError (int flavor, uint32_t err_idx, int err) 185254721Semaste { 186254721Semaste if (err_idx < kNumErrors) 187254721Semaste { 188254721Semaste switch (flavor) 189254721Semaste { 190254721Semaste case GPRRegSet: 191254721Semaste gpr_errs[err_idx] = err; 192254721Semaste return true; 193254721Semaste 194254721Semaste case FPURegSet: 195254721Semaste fpu_errs[err_idx] = err; 196254721Semaste return true; 197254721Semaste 198254721Semaste case EXCRegSet: 199254721Semaste exc_errs[err_idx] = err; 200254721Semaste return true; 201254721Semaste 202254721Semaste default: break; 203254721Semaste } 204254721Semaste } 205254721Semaste return false; 206254721Semaste } 207254721Semaste 208254721Semaste bool 209254721Semaste RegisterSetIsCached (int set) const 210254721Semaste { 211254721Semaste return GetError(set, Read) == 0; 212254721Semaste } 213254721Semaste 214254721Semaste void 215254721Semaste LogGPR (lldb_private::Log *log, const char *format, ...); 216254721Semaste 217254721Semaste int 218254721Semaste ReadGPR (bool force); 219254721Semaste 220254721Semaste int 221254721Semaste ReadFPU (bool force); 222254721Semaste 223254721Semaste int 224254721Semaste ReadEXC (bool force); 225254721Semaste 226254721Semaste int 227254721Semaste WriteGPR (); 228254721Semaste 229254721Semaste int 230254721Semaste WriteFPU (); 231254721Semaste 232254721Semaste int 233254721Semaste WriteEXC (); 234254721Semaste 235254721Semaste // Subclasses override these to do the actual reading. 236254721Semaste virtual int 237254721Semaste DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr) = 0; 238254721Semaste 239254721Semaste virtual int 240254721Semaste DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu) = 0; 241254721Semaste 242254721Semaste virtual int 243254721Semaste DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc) = 0; 244254721Semaste 245254721Semaste virtual int 246254721Semaste DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr) = 0; 247254721Semaste 248254721Semaste virtual int 249254721Semaste DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu) = 0; 250254721Semaste 251254721Semaste virtual int 252254721Semaste DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc) = 0; 253254721Semaste 254254721Semaste int 255254721Semaste ReadRegisterSet (uint32_t set, bool force); 256254721Semaste 257254721Semaste int 258254721Semaste WriteRegisterSet (uint32_t set); 259254721Semaste 260254721Semaste static uint32_t 261254721Semaste GetRegisterNumber (uint32_t reg_kind, uint32_t reg_num); 262254721Semaste 263254721Semaste static int 264254721Semaste GetSetForNativeRegNum (int reg_num); 265254721Semaste 266254721Semaste static size_t 267254721Semaste GetRegisterInfosCount (); 268254721Semaste 269254721Semaste static const lldb_private::RegisterInfo * 270254721Semaste GetRegisterInfos (); 271254721Semaste 272254721Semaste}; 273254721Semaste 274254721Semaste#endif // liblldb_RegisterContextDarwin_x86_64_h_ 275