From ae9bf8c49ee1733ec51c0fc184ce112e2140bf70 Mon Sep 17 00:00:00 2001 From: torusrxxx Date: Wed, 20 Jun 2018 17:00:35 +0800 Subject: [PATCH] st(X) can be edited --- src/dbg/value.cpp | 51 +++++++++++ src/gui/Src/Gui/RegistersView.cpp | 136 +++++++++++++++++++----------- 2 files changed, 137 insertions(+), 50 deletions(-) diff --git a/src/dbg/value.cpp b/src/dbg/value.cpp index 92509ce7..68bbee2b 100644 --- a/src/dbg/value.cpp +++ b/src/dbg/value.cpp @@ -2028,6 +2028,7 @@ static bool startsWith(const char* pre, const char* str) #define XMM_PRE_FIELD_STRING "XMM" #define YMM_PRE_FIELD_STRING "YMM" #define x8780BITFPU_PRE_FIELD_STRING "x87r" +#define x8780BITFPU_PRE_FIELD_STRING_ST "st" #define STRLEN_USING_SIZEOF(string) (sizeof(string) - 1) /** @@ -2211,6 +2212,56 @@ static void setfpuvalue(const char* string, duint value) if(found) SetContextDataEx(hActiveThread, registerindex, value); } + else if(startsWith(x8780BITFPU_PRE_FIELD_STRING_ST, string)) + { + flags = GetContextDataEx(hActiveThread, UE_X87_STATUSWORD); + flags >>= 11; + flags &= 7; + string += STRLEN_USING_SIZEOF(x8780BITFPU_PRE_FIELD_STRING_ST); + bool found = true; + DWORD registerindex; + switch(*string) + { + case '0': + registerindex = flags; + break; + + case '1': + registerindex = ((1 + flags) & 7); + break; + + case '2': + registerindex = ((2 + flags) & 7); + break; + + case '3': + registerindex = ((3 + flags) & 7); + break; + + case '4': + registerindex = ((4 + flags) & 7); + break; + + case '5': + registerindex = ((5 + flags) & 7); + break; + + case '6': + registerindex = ((6 + flags) & 7); + break; + + case '7': + registerindex = ((7 + flags) & 7); + break; + + default: + found = false; + break; + } + registerindex += UE_x87_r0; + if(found) + SetContextDataEx(hActiveThread, registerindex, value); + } else if(startsWith(MMX_PRE_FIELD_STRING, string)) { string += STRLEN_USING_SIZEOF(MMX_PRE_FIELD_STRING); diff --git a/src/gui/Src/Gui/RegistersView.cpp b/src/gui/Src/Gui/RegistersView.cpp index fdd8aa8f..997bcd0a 100644 --- a/src/gui/Src/Gui/RegistersView.cpp +++ b/src/gui/Src/Gui/RegistersView.cpp @@ -161,22 +161,44 @@ void RegistersView::InitMappings() { offset++; - mRegisterMapping.insert(x87r0, "x87r0"); - mRegisterPlaces.insert(x87r0, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r1, "x87r1"); - mRegisterPlaces.insert(x87r1, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r2, "x87r2"); - mRegisterPlaces.insert(x87r2, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r3, "x87r3"); - mRegisterPlaces.insert(x87r3, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r4, "x87r4"); - mRegisterPlaces.insert(x87r4, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r5, "x87r5"); - mRegisterPlaces.insert(x87r5, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r6, "x87r6"); - mRegisterPlaces.insert(x87r6, Register_Position(offset++, 0, 6, 10 * 2)); - mRegisterMapping.insert(x87r7, "x87r7"); - mRegisterPlaces.insert(x87r7, Register_Position(offset++, 0, 6, 10 * 2)); + if(mFpuMode) + { + mRegisterMapping.insert(x87r0, "x87r0"); + mRegisterPlaces.insert(x87r0, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r1, "x87r1"); + mRegisterPlaces.insert(x87r1, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r2, "x87r2"); + mRegisterPlaces.insert(x87r2, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r3, "x87r3"); + mRegisterPlaces.insert(x87r3, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r4, "x87r4"); + mRegisterPlaces.insert(x87r4, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r5, "x87r5"); + mRegisterPlaces.insert(x87r5, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r6, "x87r6"); + mRegisterPlaces.insert(x87r6, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87r7, "x87r7"); + mRegisterPlaces.insert(x87r7, Register_Position(offset++, 0, 6, 10 * 2)); + } + else + { + mRegisterMapping.insert(x87st0, "ST(0)"); + mRegisterPlaces.insert(x87st0, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st1, "ST(1)"); + mRegisterPlaces.insert(x87st1, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st2, "ST(2)"); + mRegisterPlaces.insert(x87st2, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st3, "ST(3)"); + mRegisterPlaces.insert(x87st3, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st4, "ST(4)"); + mRegisterPlaces.insert(x87st4, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st5, "ST(5)"); + mRegisterPlaces.insert(x87st5, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st6, "ST(6)"); + mRegisterPlaces.insert(x87st6, Register_Position(offset++, 0, 6, 10 * 2)); + mRegisterMapping.insert(x87st7, "ST(7)"); + mRegisterPlaces.insert(x87st7, Register_Position(offset++, 0, 6, 10 * 2)); + } offset++; @@ -741,6 +763,15 @@ RegistersView::RegistersView(CPUWidget* parent) : QScrollArea(parent), mVScrollO mFPU.insert(i); } + for(REGISTER_NAME i = x87st0; i <= x87st7; i = (REGISTER_NAME)(i + 1)) + { + mMODIFYDISPLAY.insert(i); + mUNDODISPLAY.insert(i); + mFPUx87.insert(i); + mFPUx87_80BITSDISPLAY.insert(i); + mFPU.insert(i); + } + mSETONEZEROTOGGLE.insert(x87TagWord); mFPUx87.insert(x87TagWord); mMODIFYDISPLAY.insert(x87TagWord); @@ -2165,7 +2196,14 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value) if(mRegisterUpdates.contains(x87SW_TOP)) p->setPen(ConfigColor("RegistersModifiedColor")); - newText = QString("ST%1 ").arg(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->st_value); + if(reg >= x87r0 && reg <= x87r7) + { + newText = QString("ST%1 ").arg(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->st_value); + } + else + { + newText = QString("x87r%1 ").arg((wRegDumpStruct.x87StatusWordFields.TOP + (reg - x87st0)) & 7); + } width = fontMetrics.width(newText); p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText); @@ -2175,38 +2213,8 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value) p->setPen(ConfigColor("RegistersExtraInfoColor")); - if(reg == x87r0 && mRegisterUpdates.contains(x87TW_0)) - { + if(reg >= x87r0 && reg <= x87r7 && mRegisterUpdates.contains((REGISTER_NAME)(x87TW_0 + (reg - x87r0)))) p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r1 && mRegisterUpdates.contains(x87TW_1)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r2 && mRegisterUpdates.contains(x87TW_2)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r3 && mRegisterUpdates.contains(x87TW_3)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r4 && mRegisterUpdates.contains(x87TW_4)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r5 && mRegisterUpdates.contains(x87TW_5)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r6 && mRegisterUpdates.contains(x87TW_6)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } - else if(reg == x87r7 && mRegisterUpdates.contains(x87TW_7)) - { - p->setPen(ConfigColor("RegistersModifiedColor")); - } newText += GetTagWordStateString(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->tag) + QString(" "); @@ -2311,7 +2319,11 @@ void RegistersView::displayEditDialog() else if(mSelected == x87CW_PC) MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_PC", ControlWordPCValueStringTable); else if(mSelected == x87SW_TOP) + { MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87SW_TOP", StatusWordTOPValueStringTable); + if(mFpuMode == false) + updateRegistersSlot(); + } else if(mFPUYMM.contains(mSelected)) { EditFloatRegister mEditFloat(256, this); @@ -2682,6 +2694,7 @@ void RegistersView::onCopyAllAction() appendRegister(text, REGISTER_NAME::SS, "SS : ", "SS : "); if(mShowFpu) { + appendRegister(text, REGISTER_NAME::x87r0, "x87r0 : ", "x87r0 : "); appendRegister(text, REGISTER_NAME::x87r1, "x87r1 : ", "x87r1 : "); appendRegister(text, REGISTER_NAME::x87r2, "x87r2 : ", "x87r2 : "); @@ -3028,8 +3041,13 @@ void RegistersView::setRegister(REGISTER_NAME reg, duint value) // is register-id known? if(mRegisterMapping.contains(reg)) { - // map "cax" to "eax" or "rax" - QString wRegName = mRegisterMapping.constFind(reg).value(); + // map x87st0 to x87r0 + QString wRegName; + if(reg >= x87st0 && reg <= x87st7) + wRegName = QString().sprintf("st%d", reg - x87st0); + else + // map "cax" to "eax" or "rax" + wRegName = mRegisterMapping.constFind(reg).value(); // flags need to '_' infront if(mFlags.contains(reg)) @@ -3236,6 +3254,23 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg) case x87r7: return (char*) ®d->x87FPURegisters[7]; + case x87st0: + return (char*) ®d->x87FPURegisters[regd->x87StatusWordFields.TOP & 7]; + case x87st1: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 1) & 7]; + case x87st2: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 2) & 7]; + case x87st3: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 3) & 7]; + case x87st4: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 4) & 7]; + case x87st5: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 5) & 7]; + case x87st6: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 6) & 7]; + case x87st7: + return (char*) ®d->x87FPURegisters[(regd->x87StatusWordFields.TOP + 7) & 7]; + case x87TagWord: return (char*) ®d->regcontext.x87fpu.TagWord; @@ -3456,6 +3491,7 @@ void RegistersView::onSIMDMode() void RegistersView::onFpuMode() { mFpuMode = !mFpuMode; + InitMappings(); emit refresh(); }