From 22f13a09e14321c4692baffaab67d1ca56011b77 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 29 Apr 2015 17:03:23 -0400 Subject: [PATCH] Debugger: Fill in missing piece of CpuState. CpuStateX86{-64}: - Fully implement the BVariant version of SetRegisterValue(). Also fixes CID 1296160. --- src/apps/debugger/arch/x86/CpuStateX86.cpp | 25 +++++++++++++++++-- .../debugger/arch/x86_64/CpuStateX8664.cpp | 24 +++++++++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/apps/debugger/arch/x86/CpuStateX86.cpp b/src/apps/debugger/arch/x86/CpuStateX86.cpp index 1b8f0d0dab..3715f2151a 100644 --- a/src/apps/debugger/arch/x86/CpuStateX86.cpp +++ b/src/apps/debugger/arch/x86/CpuStateX86.cpp @@ -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; } diff --git a/src/apps/debugger/arch/x86_64/CpuStateX8664.cpp b/src/apps/debugger/arch/x86_64/CpuStateX8664.cpp index c36edaf281..36e4b089b8 100644 --- a/src/apps/debugger/arch/x86_64/CpuStateX8664.cpp +++ b/src/apps/debugger/arch/x86_64/CpuStateX8664.cpp @@ -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; }