diff options
author | notaz | 2011-07-31 23:50:19 +0300 |
---|---|---|
committer | notaz | 2011-08-01 23:32:21 +0300 |
commit | f968d35dc0302f3fb7fba5a1bafb5feed1f758f6 (patch) | |
tree | 0a9ff0e2abb86149d1deeb10c7192809455a636d /libpcsxcore | |
parent | b17618c006c1a79ea0aa38c5e452a384f7f2bc95 (diff) | |
download | pcsx_rearmed-f968d35dc0302f3fb7fba5a1bafb5feed1f758f6.tar.gz pcsx_rearmed-f968d35dc0302f3fb7fba5a1bafb5feed1f758f6.tar.bz2 pcsx_rearmed-f968d35dc0302f3fb7fba5a1bafb5feed1f758f6.zip |
drc: fix page get code in linkage_arm.s
it did not match what was used elsewhere for PCSX,
causing rare crashes due to making bad links..
Also comment get_pointer, it's not obvious what it does.
Diffstat (limited to 'libpcsxcore')
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.c | 6 | ||||
-rw-r--r-- | libpcsxcore/new_dynarec/linkage_arm.s | 24 |
2 files changed, 19 insertions, 11 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c index 0c668d3..33ecf8e 100644 --- a/libpcsxcore/new_dynarec/assem_arm.c +++ b/libpcsxcore/new_dynarec/assem_arm.c @@ -186,11 +186,15 @@ void *kill_pointer(void *stub) return i_ptr; } +// find where external branch is liked to using addr of it's stub: +// get address that insn one after stub loads (dyna_linker arg1), +// treat it as a pointer to branch insn, +// return addr where that branch jumps to int get_pointer(void *stub) { //printf("get_pointer(%x)\n",(int)stub); int *ptr=(int *)(stub+4); - assert((*ptr&0x0ff00000)==0x05900000); + assert((*ptr&0x0fff0000)==0x059f0000); u_int offset=*ptr&0xfff; int **l_ptr=(void *)ptr+offset+8; int *i_ptr=*l_ptr; diff --git a/libpcsxcore/new_dynarec/linkage_arm.s b/libpcsxcore/new_dynarec/linkage_arm.s index 6107e27..b22d491 100644 --- a/libpcsxcore/new_dynarec/linkage_arm.s +++ b/libpcsxcore/new_dynarec/linkage_arm.s @@ -219,14 +219,16 @@ dynarec_local_end = memory_map + 4194304 dyna_linker: /* r0 = virtual target address */ /* r1 = instruction to patch */ - mov r12, r0 - mov r6, #4096 - mov r2, #0x80000 ldr r3, .jiptr + /* get_page */ + lsr r2, r0, #12 + mov r6, #4096 + bic r2, r2, #0xe0000 sub r6, r6, #1 + cmp r2, #0x1000 ldr r7, [r1] - eor r2, r2, r12, lsr #12 - and r6, r6, r12, lsr #12 + biclt r2, #0x0e00 + and r6, r6, r2 cmp r2, #2048 add r12, r7, #2 orrcs r2, r6, #2048 @@ -337,14 +339,16 @@ exec_pagefault: dyna_linker_ds: /* r0 = virtual target address */ /* r1 = instruction to patch */ - mov r12, r0 - mov r6, #4096 - mov r2, #0x80000 ldr r3, .jiptr + /* get_page */ + lsr r2, r0, #12 + mov r6, #4096 + bic r2, r2, #0xe0000 sub r6, r6, #1 + cmp r2, #0x1000 ldr r7, [r1] - eor r2, r2, r12, lsr #12 - and r6, r6, r12, lsr #12 + biclt r2, #0x0e00 + and r6, r6, r2 cmp r2, #2048 add r12, r7, #2 orrcs r2, r6, #2048 |