From 356340ad098ddc06140c8b4262e0c5331e2c26c9 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 18 Dec 2023 09:12:32 +0100 Subject: [ARM64] Added a new case of device memory unaligned write --- src/libtools/signals.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index e5d0d7e9..40d86d9b 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -752,6 +752,20 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd) p->uc_mcontext.pc+=4; // go to next opcode return 1; } + if((opcode&0b11111111111000000000110000000000)==0b01111000000000000000000000000000) { + // this is STURH + int val = opcode&31; + int dest = (opcode>>5)&31; + int64_t offset = (opcode>>12)&0b111111111; + if((offset>>(9-1))&1) + offset |= (0xffffffffffffffffll<<9); + uint8_t* addr = (uint8_t*)(p->uc_mcontext.regs[dest] + offset); + uint64_t value = p->uc_mcontext.regs[val]; + for(int i=0; i<2; ++i) + addr[i] = (value>>(i*8))&0xff; + p->uc_mcontext.pc+=4; // go to next opcode + return 1; + } if((opcode&0b11111111111000000000110000000000)==0b01111000001000000000100000000000) { // this is STRH reg, reg int scale = (opcode>>30)&3; -- cgit 1.4.1