From 262ec3ed3c9fdf8f5028c55f616565266fc53e4b Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 12 Mar 2023 14:04:57 +0100 Subject: Rv64 dynarec (#550) * [RV64_DYNAREC] Pushed the rv64_lock.h * [RV64_DYNAREC] Add initial support for atomic functions * [RV64_DYNAREC] Added some basic infrastructure for the Dynarec (and 1 opcode) * [RV64_DYNAREC] Add a disassembler for RV64 instructions * [RV64_DYNAREC] Added 86 MOV opcode, and some fixes too * [RV64_DYNAREC] Added 8D LEA opcode * [RV64_DYNAREC] Added POP reg opcode * [RV64_DYNAREC] Various fixes and small optims --------- Co-authored-by: Yang Liu --- src/libtools/signals.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 0558a88a..9526f49b 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -481,6 +481,25 @@ void copyUCTXreg2Emu(x64emu_t* emu, ucontext_t* p, uintptr_t ip) { emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[30]; emu->ip.q[0] = 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[_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[5]; #else #error Unsupported architecture #endif @@ -512,6 +531,13 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void if(db) { frame = (uintptr_t)p->uc_mcontext.__gregs[12+_SP]; } +#elif defined(RV64) + ucontext_t *p = (ucontext_t *)ucntx; + void * pc = (void*)p->uc_mcontext.__gregs[0]; + dynablock_t* db = (dynablock_t*)cur_db;//FindDynablockFromNativeAddress(pc); + if(db) { + frame = (uintptr_t)p->uc_mcontext.__gregs[16+_SP]; + } #else #error Unsupported architecture #endif @@ -604,6 +630,26 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.__gregs[30]; sigcontext->uc_mcontext.gregs[X64_RIP] = getX64Address(db, (uintptr_t)pc); } +#elif defined(RV64) + if(db) { + 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_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_RIP] = getX64Address(db, (uintptr_t)pc); + } #else #error Unsupported architecture #endif @@ -902,6 +948,13 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) ejb->emu->xmm[2].u128 = fpsimd->vregs[2]; ejb->emu->xmm[3].u128 = fpsimd->vregs[3]; }*/ +#elif defined(RV64) + /*if(fpsimd) { + ejb->emu->xmm[0].u128 = fpsimd->vregs[0]; + ejb->emu->xmm[1].u128 = fpsimd->vregs[1]; + ejb->emu->xmm[2].u128 = fpsimd->vregs[2]; + ejb->emu->xmm[3].u128 = fpsimd->vregs[3]; + }*/ #else #error Unsupported architecture #endif @@ -1036,6 +1089,14 @@ exit(-1); x64pc = getX64Address(db, (uintptr_t)pc); 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) { + x64pc = getX64Address(db, (uintptr_t)pc); + rsp = (void*)p->uc_mcontext.__gregs[16+_SP]; + } #else #error Unsupported Architecture #endif //arch @@ -1165,6 +1226,18 @@ exit(-1); for (int i=-4; i<4; ++i) { printf_log(log_minimum, "%sRSP%c0x%02x:0x%016lx", (i%4)?" ":"\n", i<0?'-':'+', abs(i)*8, *(uintptr_t*)(rsp+i*8)); } +#elif defined(RV64) + if(db) { + 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]); + } + } + if(rsp!=addr) + for (int i=-4; i<4; ++i) { + printf_log(log_minimum, "%sRSP%c0x%02x:0x%016lx", (i%4)?" ":"\n", i<0?'-':'+', abs(i)*8, *(uintptr_t*)(rsp+i*8)); + } #else #warning TODO #endif @@ -1203,6 +1276,8 @@ void my_sigactionhandler(int32_t sig, siginfo_t* info, void * ucntx) void * pc = (void*)p->uc_mcontext.pc; #elif defined(LA464) void * pc = (void*)p->uc_mcontext.__pc; + #elif defined(RV64) + void * pc = (void*)p->uc_mcontext.__gregs[0]; #else #error Unsupported architecture #endif -- cgit 1.4.1