Support for more SPARC relocations, by Martin Bochnig.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 10 Feb 2007 21:31:43 +0000 (21:31 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 10 Feb 2007 21:31:43 +0000 (21:31 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2407 c046a42c-6fe2-441c-8c8c-71466251a162

dyngen.c
elf.h

index bcfb86e..c6a878c 100644 (file)
--- a/dyngen.c
+++ b/dyngen.c
@@ -2349,6 +2349,33 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
                                     reloc_offset, reloc_offset, name, addend,
                                    reloc_offset);
                             break;
+                        case R_SPARC_HH22:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | (((%s + %d) >> 42) & 0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                             break;
+
+                       case R_SPARC_LM22:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | (((%s + %d) >> 10) & 0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                           break;
+
+                       case R_SPARC_HM10:
+                            fprintf(outfile,
+                                   "    *(uint32_t *)(gen_code_ptr + %d) = "
+                                   "((*(uint32_t *)(gen_code_ptr + %d)) "
+                                   " & ~0x00000000) "
+                                   " | ((((%s + %d) >> 32 & 0x3ff)) & 0x00000000);\n",
+                                    reloc_offset, reloc_offset, name, addend);
+                           break;
+
                         default:
                            error("unsupported sparc64 relocation (%d) for symbol %s", type, name);
                         }
diff --git a/elf.h b/elf.h
index 1825d50..e6ccfeb 100644 (file)
--- a/elf.h
+++ b/elf.h
@@ -328,6 +328,9 @@ typedef struct {
 #define R_SPARC_11             31
 #define R_SPARC_64             32
 #define R_SPARC_OLO10           33
+#define R_SPARC_HH22            34
+#define R_SPARC_HM10            35
+#define R_SPARC_LM22            36
 #define R_SPARC_WDISP16                40
 #define R_SPARC_WDISP19                41
 #define R_SPARC_7              43