drc: fix page get code in linkage_arm.s
authornotaz <notasas@gmail.com>
Sun, 31 Jul 2011 20:50:19 +0000 (23:50 +0300)
committernotaz <notasas@gmail.com>
Mon, 1 Aug 2011 20:32:21 +0000 (23:32 +0300)
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.

libpcsxcore/new_dynarec/assem_arm.c
libpcsxcore/new_dynarec/linkage_arm.s

index 0c668d3..33ecf8e 100644 (file)
@@ -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;
index 6107e27..b22d491 100644 (file)
@@ -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