diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-12-12 18:51:24 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-12 11:51:24 +0100 |
| commit | 55d6971a23d43f3f80919b47bc54b46192a89040 (patch) | |
| tree | 1c962ac0032a6d1794543616730d8c856966db77 /src/libtools | |
| parent | 7168167400d7fbe60e0d9034d95bdbcbf302af99 (diff) | |
| download | box64-55d6971a23d43f3f80919b47bc54b46192a89040.tar.gz box64-55d6971a23d43f3f80919b47bc54b46192a89040.zip | |
[RV64_DYNAREC] New register mapping (#2139)
* [RV64_DYNAREC] New register mapping * Fix
Diffstat (limited to 'src/libtools')
| -rw-r--r-- | src/libtools/signal32.c | 16 | ||||
| -rw-r--r-- | src/libtools/signals.c | 70 |
2 files changed, 43 insertions, 43 deletions
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index 6dace456..3742d0c7 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -487,7 +487,7 @@ void my_sigactionhandler_oldcode_32(int32_t sig, int simple, siginfo_t* info, vo if(p) { pc = (void*)p->uc_mcontext.__gregs[0]; if(db) - frame = (uintptr_t)p->uc_mcontext.__gregs[16+_SP]; + frame = (uintptr_t)p->uc_mcontext.__gregs[9]; } #else #error Unsupported architecture @@ -573,13 +573,13 @@ void my_sigactionhandler_oldcode_32(int32_t sig, int simple, siginfo_t* info, vo #elif defined(RV64) if(db && p) { sigcontext->uc_mcontext.gregs[I386_EAX] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[I386_ECX] = p->uc_mcontext.__gregs[17]; - sigcontext->uc_mcontext.gregs[I386_EDX] = p->uc_mcontext.__gregs[18]; - sigcontext->uc_mcontext.gregs[I386_EBX] = p->uc_mcontext.__gregs[19]; - sigcontext->uc_mcontext.gregs[I386_ESP] = p->uc_mcontext.__gregs[20]; - sigcontext->uc_mcontext.gregs[I386_EBP] = p->uc_mcontext.__gregs[21]; - sigcontext->uc_mcontext.gregs[I386_ESI] = p->uc_mcontext.__gregs[22]; - sigcontext->uc_mcontext.gregs[I386_EDI] = p->uc_mcontext.__gregs[23]; + sigcontext->uc_mcontext.gregs[I386_ECX] = p->uc_mcontext.__gregs[13]; + sigcontext->uc_mcontext.gregs[I386_EDX] = p->uc_mcontext.__gregs[12]; + sigcontext->uc_mcontext.gregs[I386_EBX] = p->uc_mcontext.__gregs[24]; + sigcontext->uc_mcontext.gregs[I386_ESP] = p->uc_mcontext.__gregs[9]; + sigcontext->uc_mcontext.gregs[I386_EBP] = p->uc_mcontext.__gregs[8]; + sigcontext->uc_mcontext.gregs[I386_ESI] = p->uc_mcontext.__gregs[11]; + sigcontext->uc_mcontext.gregs[I386_EDI] = p->uc_mcontext.__gregs[10]; sigcontext->uc_mcontext.gregs[I386_EIP] = getX64Address(db, (uintptr_t)pc); } #else diff --git a/src/libtools/signals.c b/src/libtools/signals.c index db4a5709..290452a2 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -501,8 +501,8 @@ x64emu_t* getEmuSignal(x64emu_t* emu, ucontext_t* p, dynablock_t* db) emu = (x64emu_t*)p->uc_mcontext.__gregs[4]; } #elif defined(RV64) - if(db && p->uc_mcontext.__gregs[10]>0x10000) { - emu = (x64emu_t*)p->uc_mcontext.__gregs[10]; + if(db && p->uc_mcontext.__gregs[25]>0x10000) { + emu = (x64emu_t*)p->uc_mcontext.__gregs[25]; } #else #error Unsupported Architecture @@ -604,23 +604,23 @@ void copyUCTXreg2Emu(x64emu_t* emu, ucontext_t* p, uintptr_t ip) { emu->eflags.x64 = p->uc_mcontext.__gregs[31]; #elif defined(RV64) emu->regs[_AX].q[0] = p->uc_mcontext.__gregs[16]; - emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[17]; - emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[18]; - emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[19]; - emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[20]; - emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[21]; - emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[22]; - emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[23]; - emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[24]; - emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[25]; + emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[13]; + emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[12]; + emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[24]; + emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[9]; + emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[8]; + emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[11]; + emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[10]; + emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[14]; + emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[15]; emu->regs[_R10].q[0] = p->uc_mcontext.__gregs[26]; emu->regs[_R11].q[0] = p->uc_mcontext.__gregs[27]; - emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[28]; - emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[29]; - emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[30]; - emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[31]; - emu->ip.q[0] = ip; - emu->eflags.x64 = p->uc_mcontext.__gregs[8]; + emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[18]; + emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[19]; + emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[20]; + emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[21]; + emu->ip.q[0] = ip; + emu->eflags.x64 = p->uc_mcontext.__gregs[23]; #else #error Unsupported architecture #endif @@ -972,7 +972,7 @@ void my_sigactionhandler_oldcode(x64emu_t* emu, int32_t sig, int simple, siginfo if(p) { pc = (void*)p->uc_mcontext.__gregs[0]; if(db) - frame = (uintptr_t)p->uc_mcontext.__gregs[16+_SP]; + frame = (uintptr_t)p->uc_mcontext.__gregs[9]; } #else #error Unsupported architecture @@ -1075,21 +1075,21 @@ void my_sigactionhandler_oldcode(x64emu_t* emu, int32_t sig, int simple, siginfo #elif defined(RV64) if(db && p) { sigcontext->uc_mcontext.gregs[X64_RAX] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[X64_RCX] = p->uc_mcontext.__gregs[17]; - sigcontext->uc_mcontext.gregs[X64_RDX] = p->uc_mcontext.__gregs[18]; - sigcontext->uc_mcontext.gregs[X64_RBX] = p->uc_mcontext.__gregs[19]; - sigcontext->uc_mcontext.gregs[X64_RSP] = p->uc_mcontext.__gregs[20]; - sigcontext->uc_mcontext.gregs[X64_RBP] = p->uc_mcontext.__gregs[21]; - sigcontext->uc_mcontext.gregs[X64_RSI] = p->uc_mcontext.__gregs[22]; - sigcontext->uc_mcontext.gregs[X64_RDI] = p->uc_mcontext.__gregs[23]; - sigcontext->uc_mcontext.gregs[X64_R8] = p->uc_mcontext.__gregs[24]; - sigcontext->uc_mcontext.gregs[X64_R9] = p->uc_mcontext.__gregs[25]; + sigcontext->uc_mcontext.gregs[X64_RCX] = p->uc_mcontext.__gregs[13]; + sigcontext->uc_mcontext.gregs[X64_RDX] = p->uc_mcontext.__gregs[12]; + sigcontext->uc_mcontext.gregs[X64_RBX] = p->uc_mcontext.__gregs[24]; + sigcontext->uc_mcontext.gregs[X64_RSP] = p->uc_mcontext.__gregs[9]; + sigcontext->uc_mcontext.gregs[X64_RBP] = p->uc_mcontext.__gregs[8]; + sigcontext->uc_mcontext.gregs[X64_RSI] = p->uc_mcontext.__gregs[11]; + sigcontext->uc_mcontext.gregs[X64_RDI] = p->uc_mcontext.__gregs[10]; + sigcontext->uc_mcontext.gregs[X64_R8] = p->uc_mcontext.__gregs[14]; + sigcontext->uc_mcontext.gregs[X64_R9] = p->uc_mcontext.__gregs[15]; sigcontext->uc_mcontext.gregs[X64_R10] = p->uc_mcontext.__gregs[26]; sigcontext->uc_mcontext.gregs[X64_R11] = p->uc_mcontext.__gregs[27]; - sigcontext->uc_mcontext.gregs[X64_R12] = p->uc_mcontext.__gregs[28]; - sigcontext->uc_mcontext.gregs[X64_R13] = p->uc_mcontext.__gregs[29]; - sigcontext->uc_mcontext.gregs[X64_R14] = p->uc_mcontext.__gregs[30]; - sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.__gregs[31]; + sigcontext->uc_mcontext.gregs[X64_R12] = p->uc_mcontext.__gregs[18]; + sigcontext->uc_mcontext.gregs[X64_R13] = p->uc_mcontext.__gregs[19]; + sigcontext->uc_mcontext.gregs[X64_R14] = p->uc_mcontext.__gregs[20]; + sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.__gregs[21]; sigcontext->uc_mcontext.gregs[X64_RIP] = getX64Address(db, (uintptr_t)pc); } #else @@ -1676,12 +1676,12 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "Repeated SIGSEGV with Access error on %p for rsp = (void*)p->uc_mcontext.__gregs[12+_SP]; } #elif defined(RV64) - if(db && p->uc_mcontext.__gregs[10]>0x10000) { - emu = (x64emu_t*)p->uc_mcontext.__gregs[10]; + if(db && p->uc_mcontext.__gregs[25]>0x10000) { + emu = (x64emu_t*)p->uc_mcontext.__gregs[25]; } if(db) { x64pc = getX64Address(db, (uintptr_t)pc); - rsp = (void*)p->uc_mcontext.__gregs[16+_SP]; + rsp = (void*)p->uc_mcontext.__gregs[9]; } #else #error Unsupported Architecture @@ -1837,7 +1837,7 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "Repeated SIGSEGV with Access error on %p for shown_regs = 1; for (int i=0; i<16; ++i) { if(!(i%4)) printf_log(log_minimum, "\n"); - printf_log(log_minimum, "%s:0x%016llx ", reg_name[i], p->uc_mcontext.__gregs[16+i]); + printf_log(log_minimum, "%s:0x%016llx ", reg_name[i], p->uc_mcontext.__gregs[(((uint8_t[]) { 16, 13, 12, 24, 9, 8, 11, 10, 14, 15, 26, 27, 18, 19, 20, 21 })[i])]); } printf_log(log_minimum, "\n"); for (int i=0; i<6; ++i) |