diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-03-07 13:42:36 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-03-07 13:42:36 +0100 |
| commit | 5e980767b977d8065c6332e74a2674ce96a0aea2 (patch) | |
| tree | 1d3221c1964f25d05af81fbdf8cc523c7894ab2b /src | |
| parent | 2b3c9b95af4ff056d05f4ed9aeb77e049bb844a5 (diff) | |
| download | box64-5e980767b977d8065c6332e74a2674ce96a0aea2.tar.gz box64-5e980767b977d8065c6332e74a2674ce96a0aea2.zip | |
[ARM64] Added 1 more special case of SIGBUS when accessing device memory (Help Planet Coaster on NVidia)
Diffstat (limited to 'src')
| -rw-r--r-- | src/libtools/signals.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index f4c17edc..5ca91776 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -827,6 +827,22 @@ 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&0b10111111111111111111110000000000)==0b00001101000000001000010000000000) { + // this is ST1.D + int idx = (opcode>>30)&1; + int val = opcode&31; + int dest = (opcode>>5)&31; + volatile uint8_t* addr = (void*)(p->uc_mcontext.regs[dest]); + uint64_t value = fpsimd->vregs[val]>>(idx*64); + if((((uintptr_t)addr)&3)==0) { + for(int i=0; i<2; ++i) + ((volatile uint32_t*)addr)[i] = (value>>(i*32))&0xffffffff; + } else + for(int i=0; i<8; ++i) + addr[i] = (value>>(i*8))&0xff; + p->uc_mcontext.pc+=4; // go to next opcode + return 1; + } #endif return 0; } |