Exemple #1
0
status_t
CpuStateX8664::UpdateDebugState(void* state, size_t size) const
{
	if (size != sizeof(x86_64_debug_cpu_state))
		return B_BAD_VALUE;

	x86_64_debug_cpu_state* x64State = (x86_64_debug_cpu_state*)state;

	x64State->rip = InstructionPointer();
	x64State->rsp = StackPointer();
	x64State->rbp = StackFramePointer();
	x64State->rax = IntRegisterValue(X86_64_REGISTER_RAX);
	x64State->rbx = IntRegisterValue(X86_64_REGISTER_RBX);
	x64State->rcx = IntRegisterValue(X86_64_REGISTER_RCX);
	x64State->rdx = IntRegisterValue(X86_64_REGISTER_RDX);
	x64State->rsi = IntRegisterValue(X86_64_REGISTER_RSI);
	x64State->rdi = IntRegisterValue(X86_64_REGISTER_RDI);
	x64State->r8 = IntRegisterValue(X86_64_REGISTER_R8);
	x64State->r9 = IntRegisterValue(X86_64_REGISTER_R9);
	x64State->r10 = IntRegisterValue(X86_64_REGISTER_R10);
	x64State->r11 = IntRegisterValue(X86_64_REGISTER_R11);
	x64State->r12 = IntRegisterValue(X86_64_REGISTER_R12);
	x64State->r13 = IntRegisterValue(X86_64_REGISTER_R13);
	x64State->r14 = IntRegisterValue(X86_64_REGISTER_R14);
	x64State->r15 = IntRegisterValue(X86_64_REGISTER_R15);
	x64State->cs = IntRegisterValue(X86_64_REGISTER_CS);
	x64State->ds = IntRegisterValue(X86_64_REGISTER_DS);
	x64State->es = IntRegisterValue(X86_64_REGISTER_ES);
	x64State->fs = IntRegisterValue(X86_64_REGISTER_FS);
	x64State->gs = IntRegisterValue(X86_64_REGISTER_GS);
	x64State->ss = IntRegisterValue(X86_64_REGISTER_SS);

	for (int32 i = 0; i < 8; i++) {
		*(long double*)(x64State->extended_registers.fp_registers[i].value)
			= (long double)FloatRegisterValue(X86_64_REGISTER_ST0 + i);

		if (IsRegisterSet(X86_64_REGISTER_MM0 + i)) {
			memcpy(&x64State->extended_registers.mmx_registers[i],
				&fMMXRegisters[i], sizeof(x86_64_fp_register));
		}
	}

	for (int32 i = 0; i < 16; i++) {
		if (IsRegisterSet(X86_64_REGISTER_XMM0 + i)) {
			memcpy(&x64State->extended_registers.xmm_registers[i],
				&fXMMRegisters[i], sizeof(x86_64_xmm_register));
		} else {
			memset(&x64State->extended_registers.xmm_registers[i],
				0, sizeof(x86_64_xmm_register));
		}
	}

	return B_OK;
}
Exemple #2
0
bool
CpuStateX8664::GetRegisterValue(const Register* reg, BVariant& _value) const
{
	int32 index = reg->Index();
	if (!IsRegisterSet(index))
		return false;

	if (index >= X86_64_XMM_REGISTER_END)
		return false;

	if (BVariant::TypeIsInteger(reg->ValueType())) {
		if (reg->BitSize() == 16)
			_value.SetTo((uint16)fIntRegisters[index]);
		else
			_value.SetTo(fIntRegisters[index]);
	} else if (BVariant::TypeIsFloat(reg->ValueType())) {
		index -= X86_64_REGISTER_ST0;
		if (reg->ValueType() == B_FLOAT_TYPE)
			_value.SetTo((float)fFloatRegisters[index]);
		else
			_value.SetTo(fFloatRegisters[index]);
	} else {
		if (index >= X86_64_REGISTER_MM0 && index < X86_64_REGISTER_XMM0) {
			index -= X86_64_REGISTER_MM0;
			_value.SetTo(fMMXRegisters[index].value);
		} else {
			index -= X86_64_REGISTER_XMM0;
			_value.SetTo(fXMMRegisters[index].value);
		}
	}

	return true;
}
Exemple #3
0
uint32
CpuStateX86::IntRegisterValue(int32 index) const
{
	if (!IsRegisterSet(index) || index >= X86_INT_REGISTER_END)
		return 0;

	return fIntRegisters[index];
}
Exemple #4
0
const void*
CpuStateX8664::XMMRegisterValue(int32 index) const
{
	if (index < X86_64_REGISTER_XMM0 || index >= X86_64_XMM_REGISTER_END
		|| !IsRegisterSet(index)) {
		return NULL;
	}

	return fXMMRegisters[index - X86_64_REGISTER_XMM0].value;
}
Exemple #5
0
const void*
CpuStateX8664::MMXRegisterValue(int32 index) const
{
	if (index < X86_64_REGISTER_MM0 || index >= X86_64_MMX_REGISTER_END
		|| !IsRegisterSet(index)) {
		return 0;
	}

	return fMMXRegisters[index - X86_64_REGISTER_MM0].value;
}
Exemple #6
0
double
CpuStateX8664::FloatRegisterValue(int32 index) const
{
	if (index < X86_64_REGISTER_ST0 || index >= X86_64_FP_REGISTER_END
		|| !IsRegisterSet(index)) {
		return 0.0;
	}

	return fFloatRegisters[index - X86_64_REGISTER_ST0];
}
Exemple #7
0
bool
CpuStateX86::GetRegisterValue(const Register* reg, BVariant& _value) const
{
	int32 index = reg->Index();
	if (!IsRegisterSet(index))
		return false;

	if (index >= X86_INT_REGISTER_END)
		return false;

	if (reg->BitSize() == 16)
		_value.SetTo((uint16)fIntRegisters[index]);
	else
		_value.SetTo(fIntRegisters[index]);

	return true;
}
Exemple #8
0
target_addr_t
CpuStateX86::InstructionPointer() const
{
	return IsRegisterSet(X86_REGISTER_EIP)
		? IntRegisterValue(X86_REGISTER_EIP) : 0;
}
Exemple #9
0
target_addr_t
CpuStateX8664::StackPointer() const
{
	return IsRegisterSet(X86_64_REGISTER_RSP)
		? IntRegisterValue(X86_64_REGISTER_RSP) : 0;
}
Exemple #10
0
target_addr_t
CpuStateX86::StackFramePointer() const
{
	return IsRegisterSet(X86_REGISTER_EBP)
		? IntRegisterValue(X86_REGISTER_EBP) : 0;
}