133549Sjkh/* 233549Sjkh * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. 32892Sdfr * Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de. 42892Sdfr * Copyright 2011, Rene Gollent, rene@gollent.com. 52892Sdfr * Distributed under the terms of the MIT License. 62892Sdfr */ 72892Sdfr 82892Sdfr#include "CpuStateX8664.h" 92892Sdfr 102892Sdfr#include "Register.h" 112892Sdfr 122892Sdfr 132892SdfrCpuStateX8664::CpuStateX8664() 142892Sdfr : 152892Sdfr fSetRegisters() 162892Sdfr{ 172892Sdfr} 182892Sdfr 192892Sdfr 202892SdfrCpuStateX8664::CpuStateX8664(const x86_64_debug_cpu_state& state) 212892Sdfr : 222892Sdfr fSetRegisters() 232892Sdfr{ 242892Sdfr SetIntRegister(X86_64_REGISTER_RIP, state.rip); 252892Sdfr SetIntRegister(X86_64_REGISTER_RSP, state.rsp); 262892Sdfr SetIntRegister(X86_64_REGISTER_RBP, state.rbp); 272892Sdfr SetIntRegister(X86_64_REGISTER_RAX, state.rax); 282892Sdfr SetIntRegister(X86_64_REGISTER_RBX, state.rbx); 292892Sdfr SetIntRegister(X86_64_REGISTER_RCX, state.rcx); 302892Sdfr SetIntRegister(X86_64_REGISTER_RDX, state.rdx); 312892Sdfr SetIntRegister(X86_64_REGISTER_RSI, state.rsi); 322892Sdfr SetIntRegister(X86_64_REGISTER_RDI, state.rdi); 332892Sdfr SetIntRegister(X86_64_REGISTER_R8, state.r8); 3415771Swollman SetIntRegister(X86_64_REGISTER_R9, state.r9); 3550476Speter SetIntRegister(X86_64_REGISTER_R10, state.r10); 362892Sdfr SetIntRegister(X86_64_REGISTER_R11, state.r11); 372892Sdfr SetIntRegister(X86_64_REGISTER_R12, state.r12); 382892Sdfr SetIntRegister(X86_64_REGISTER_R13, state.r13); 392892Sdfr SetIntRegister(X86_64_REGISTER_R14, state.r14); 402892Sdfr SetIntRegister(X86_64_REGISTER_R15, state.r15); 41120492Sfjoe SetIntRegister(X86_64_REGISTER_CS, state.cs); 42121363Strhodes SetIntRegister(X86_64_REGISTER_DS, state.ds); 43121429Strhodes SetIntRegister(X86_64_REGISTER_ES, state.es); 4423335Sbde SetIntRegister(X86_64_REGISTER_FS, state.fs); 452892Sdfr SetIntRegister(X86_64_REGISTER_GS, state.gs); 462892Sdfr SetIntRegister(X86_64_REGISTER_SS, state.ss); 472892Sdfr} 4833761Sache 492892Sdfr 502892SdfrCpuStateX8664::~CpuStateX8664() 5155613Sache{ 5255613Sache} 532892Sdfr 542892Sdfr 5515771Swollmantarget_addr_t 562892SdfrCpuStateX8664::InstructionPointer() const 57121429Strhodes{ 582892Sdfr return IsRegisterSet(X86_64_REGISTER_RIP) 592892Sdfr ? IntRegisterValue(X86_64_REGISTER_RIP) : 0; 6092882Simp} 6192882Simp 6292882Simp 6392882Simptarget_addr_t 64152809SavatarCpuStateX8664::StackFramePointer() const 652892Sdfr{ 662892Sdfr return IsRegisterSet(X86_64_REGISTER_RBP) 67121373Strhodes ? IntRegisterValue(X86_64_REGISTER_RBP) : 0; 682892Sdfr} 69152416Smaxim 70152416Smaxim 712892Sdfrtarget_addr_t 72118837StrhodesCpuStateX8664::StackPointer() const 73120492Sfjoe{ 74152362Srodrigc return IsRegisterSet(X86_64_REGISTER_RSP) 75166326Srodrigc ? IntRegisterValue(X86_64_REGISTER_RSP) : 0; 76152362Srodrigc} 77152362Srodrigc 78152362Srodrigc 79152362Srodrigcbool 80152362SrodrigcCpuStateX8664::GetRegisterValue(const Register* reg, BVariant& _value) const 81152362Srodrigc{ 822892Sdfr int32 index = reg->Index(); 83118837Strhodes if (!IsRegisterSet(index)) 842892Sdfr return false; 85152731Savatar 862892Sdfr if (index >= X86_64_INT_REGISTER_END) 8733549Sjkh return false; 88152362Srodrigc 8933549Sjkh if (reg->BitSize() == 16) 9033549Sjkh _value.SetTo((uint16)fIntRegisters[index]); 91152362Srodrigc else 9233549Sjkh _value.SetTo(fIntRegisters[index]); 9333549Sjkh 94152731Savatar return true; 9533549Sjkh} 962892Sdfr 97152362Srodrigc 982892Sdfrbool 992892SdfrCpuStateX8664::SetRegisterValue(const Register* reg, const BVariant& value) 1002892Sdfr{ 101152362Srodrigc int32 index = reg->Index(); 1022892Sdfr if (index >= X86_64_INT_REGISTER_END) 1032892Sdfr return false; 1042892Sdfr 105152362Srodrigc fIntRegisters[index] = value.ToUInt64(); 1062892Sdfr fSetRegisters[index] = 1; 1072892Sdfr return true; 108118837Strhodes} 109152362Srodrigc 110118837Strhodes 111118837Strhodesbool 112152362SrodrigcCpuStateX8664::IsRegisterSet(int32 index) const 113152362Srodrigc{ 114120492Sfjoe return index >= 0 && index < X86_64_REGISTER_COUNT && fSetRegisters[index]; 115120492Sfjoe} 116120492Sfjoe 117120492Sfjoe 118120492Sfjoeuint64 119152362SrodrigcCpuStateX8664::IntRegisterValue(int32 index) const 120152362Srodrigc{ 121152974Savatar if (!IsRegisterSet(index) || index >= X86_64_INT_REGISTER_END) 122152362Srodrigc return 0; 12333761Sache 124120492Sfjoe return fIntRegisters[index]; 125152362Srodrigc} 126152362Srodrigc 12733749Sache 128152362Srodrigcvoid 129152362SrodrigcCpuStateX8664::SetIntRegister(int32 index, uint64 value) 130152362Srodrigc{ 131152416Smaxim if (index < 0 || index >= X86_64_INT_REGISTER_END) 132152416Smaxim return; 133152362Srodrigc 134152362Srodrigc fIntRegisters[index] = value; 135152362Srodrigc fSetRegisters[index] = 1; 136152362Srodrigc} 137152362Srodrigc 138152362Srodrigc 1392892Sdfrvoid 140120492SfjoeCpuStateX8664::UnsetRegister(int32 index) 141120492Sfjoe{ 142152362Srodrigc if (index < 0 || index >= X86_64_REGISTER_COUNT) 143152362Srodrigc return; 144120492Sfjoe 145152362Srodrigc fSetRegisters[index] = 0; 146152362Srodrigc} 147120492Sfjoe