summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-02-10 21:31:43 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-02-10 21:31:43 +0000
commitb80029cad1dad2caaaae61de334488a6847a087e (patch)
treeb9074de46b5418e326ee2866ba57d4bb02c720d2
parent43024c6a2b939ec865af3b96a4840a3db804141d (diff)
Support for more SPARC relocations, by Martin Bochnig.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2407 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--dyngen.c27
-rw-r--r--elf.h3
2 files changed, 30 insertions, 0 deletions
diff --git a/dyngen.c b/dyngen.c
index bcfb86ea0d..c6a878c6de 100644
--- 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 1825d50e82..e6ccfebede 100644
--- 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