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