R_PPC_REL24 safety net
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4706 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
398ce98e4f
commit
5be1676206
8
dyngen.c
8
dyngen.c
|
@ -1963,6 +1963,14 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
|
||||||
break;
|
break;
|
||||||
case R_PPC_REL24:
|
case R_PPC_REL24:
|
||||||
/* warning: must be at 32 MB distancy */
|
/* warning: must be at 32 MB distancy */
|
||||||
|
fprintf(outfile, "{\n"
|
||||||
|
" long disp = (%s - (long)(gen_code_ptr + %d) + %d);\n"
|
||||||
|
" if ((disp << 6) >> 6 != disp) {;\n"
|
||||||
|
" fprintf(stderr, \"Branch target is too far away\\n\");"
|
||||||
|
" abort();\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n",
|
||||||
|
relname, reloc_offset, addend);
|
||||||
fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n",
|
fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = (*(uint32_t *)(gen_code_ptr + %d) & ~0x03fffffc) | ((%s - (long)(gen_code_ptr + %d) + %d) & 0x03fffffc);\n",
|
||||||
reloc_offset, reloc_offset, relname, reloc_offset, addend);
|
reloc_offset, reloc_offset, relname, reloc_offset, addend);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue