R_PPC_REL24 safety net
authormalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 9 Jun 2008 06:06:28 +0000 (06:06 +0000)
committermalc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 9 Jun 2008 06:06:28 +0000 (06:06 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4706 c046a42c-6fe2-441c-8c8c-71466251a162

dyngen.c

index c38d123..880d641 100644 (file)
--- a/dyngen.c
+++ b/dyngen.c
@@ -1963,6 +1963,14 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
                                 break;
                             case R_PPC_REL24:
                                 /* 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",
                                         reloc_offset, reloc_offset, relname, reloc_offset, addend);
                                 break;