Debugger: Fill in missing piece of CpuState.

CpuStateX86{-64}:
- Fully implement the BVariant version of SetRegisterValue().

Also fixes CID 1296160.
This commit is contained in:
Rene Gollent
2015-04-29 17:03:23 -04:00
parent f49b18811e
commit 22f13a09e1
2 changed files with 46 additions and 3 deletions
+23 -2
View File
@@ -227,10 +227,31 @@ bool
CpuStateX86::SetRegisterValue(const Register* reg, const BVariant& value)
{
int32 index = reg->Index();
if (index >= X86_INT_REGISTER_END)
if (index >= X86_XMM_REGISTER_END)
return false;
if (index < X86_INT_REGISTER_END)
fIntRegisters[index] = value.ToUInt32();
else if (index >= X86_REGISTER_ST0 && index < X86_FP_REGISTER_END)
fFloatRegisters[index - X86_REGISTER_ST0] = value.ToDouble();
else if (index >= X86_REGISTER_MM0 && index < X86_MMX_REGISTER_END) {
if (value.Size() > sizeof(int64))
return false;
memset(&fMMXRegisters[index - X86_REGISTER_MM0], 0,
sizeof(x86_fp_register));
memcpy(fMMXRegisters[index - X86_REGISTER_MM0].value,
value.ToPointer(), value.Size());
} else if (index >= X86_REGISTER_XMM0 && index < X86_XMM_REGISTER_END) {
if (value.Size() > sizeof(x86_xmm_register))
return false;
memset(&fXMMRegisters[index - X86_REGISTER_XMM0], 0,
sizeof(x86_xmm_register));
memcpy(fXMMRegisters[index - X86_REGISTER_XMM0].value,
value.ToPointer(), value.Size());
} else
return false;
fIntRegisters[index] = value.ToUInt32();
fSetRegisters[index] = 1;
return true;
}
@@ -256,7 +256,29 @@ CpuStateX8664::SetRegisterValue(const Register* reg, const BVariant& value)
if (index >= X86_64_XMM_REGISTER_END)
return false;
fIntRegisters[index] = value.ToUInt64();
if (index < X86_64_INT_REGISTER_END)
fIntRegisters[index] = value.ToUInt64();
else if (index >= X86_64_REGISTER_ST0 && index < X86_64_FP_REGISTER_END)
fFloatRegisters[index - X86_64_REGISTER_ST0] = value.ToDouble();
else if (index >= X86_64_REGISTER_MM0 && index < X86_64_MMX_REGISTER_END) {
if (value.Size() > sizeof(int64))
return false;
memset(&fMMXRegisters[index - X86_64_REGISTER_MM0], 0,
sizeof(x86_64_fp_register));
memcpy(fMMXRegisters[index - X86_64_REGISTER_MM0].value,
value.ToPointer(), value.Size());
} else if (index >= X86_64_REGISTER_XMM0
&& index < X86_64_XMM_REGISTER_END) {
if (value.Size() > sizeof(x86_64_xmm_register))
return false;
memset(&fXMMRegisters[index - X86_64_REGISTER_XMM0], 0,
sizeof(x86_64_xmm_register));
memcpy(fXMMRegisters[index - X86_64_REGISTER_XMM0].value,
value.ToPointer(), value.Size());
} else
return false;
fSetRegisters[index] = 1;
return true;
}