/* Literal pool */
add_literal(int addr,int val)
{
+ assert(literalcount<sizeof(literals)/sizeof(literals[0]));
literals[literalcount][0]=addr;
literals[literalcount][1]=val;
literalcount++;
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;
u_int *ptr=(u_int *)addr;
#ifdef ARMv5_ONLY
// get from literal pool
- assert((*ptr&0xFFF00000)==0xe5900000);
+ assert((*ptr&0xFFFF0000)==0xe59f0000);
u_int offset=*ptr&0xfff;
u_int *l_ptr=(void *)ptr+offset+8;
u_int source=l_ptr[0];
u_int *ptr=(u_int *)addr;
#ifdef ARMv5_ONLY
// get from literal pool
- assert((*ptr&0xFFF00000)==0xe5900000);
+ assert((*ptr&0xFFFF0000)==0xe59f0000);
u_int offset=*ptr&0xfff;
u_int *l_ptr=(void *)ptr+offset+8;
u_int source=l_ptr[0];