提交 90426a4e 编写于 作者: B bellard

ppc dyngen fix (malc)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4585 c046a42c-6fe2-441c-8c8c-71466251a162
上级 2662e13f
...@@ -1910,10 +1910,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, ...@@ -1910,10 +1910,11 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
char relname[256]; char relname[256];
int type; int type;
int addend; int addend;
int is_label;
int reloc_offset; int reloc_offset;
for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) { for(i = 0, rel = relocs;i < nb_relocs; i++, rel++) {
if (rel->r_offset >= start_offset && if (rel->r_offset >= start_offset &&
rel->r_offset < start_offset + copy_size) { rel->r_offset < start_offset + copy_size) {
sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name; sym_name = strtab + symtab[ELFW(R_SYM)(rel->r_info)].st_name;
reloc_offset = rel->r_offset - start_offset; reloc_offset = rel->r_offset - start_offset;
if (strstart(sym_name, "__op_jmp", &p)) { if (strstart(sym_name, "__op_jmp", &p)) {
...@@ -1930,31 +1931,44 @@ void gen_code(const char *name, host_ulong offset, host_ulong size, ...@@ -1930,31 +1931,44 @@ void gen_code(const char *name, host_ulong offset, host_ulong size,
get_reloc_expr(relname, sizeof(relname), sym_name); get_reloc_expr(relname, sizeof(relname), sym_name);
type = ELF32_R_TYPE(rel->r_info); type = ELF32_R_TYPE(rel->r_info);
is_label = get_reloc_expr(relname, sizeof(relname), sym_name);
addend = rel->r_addend; addend = rel->r_addend;
switch(type) { if (is_label) {
case R_PPC_ADDR32: switch (type) {
fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n", case R_PPC_REL24:
reloc_offset, relname, addend); fprintf (outfile, " tcg_out_reloc(s, gen_code_ptr + %d, %d, %s, %d);\n",
break; reloc_offset, type, relname, addend);
case R_PPC_ADDR16_LO: break;
fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n", default:
reloc_offset, relname, addend); error ("unsupported ppc relocation (%d)", type);
break; }
case R_PPC_ADDR16_HI: }
fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n", else {
reloc_offset, relname, addend); switch(type) {
break; case R_PPC_ADDR32:
case R_PPC_ADDR16_HA: fprintf(outfile, " *(uint32_t *)(gen_code_ptr + %d) = %s + %d;\n",
fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n", reloc_offset, relname, addend);
reloc_offset, relname, addend); break;
break; case R_PPC_ADDR16_LO:
case R_PPC_REL24: fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d);\n",
/* warning: must be at 32 MB distancy */ reloc_offset, relname, 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", break;
reloc_offset, reloc_offset, relname, reloc_offset, addend); case R_PPC_ADDR16_HI:
break; fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d) >> 16;\n",
default: reloc_offset, relname, addend);
error("unsupported powerpc relocation (%d)", type); break;
case R_PPC_ADDR16_HA:
fprintf(outfile, " *(uint16_t *)(gen_code_ptr + %d) = (%s + %d + 0x8000) >> 16;\n",
reloc_offset, relname, addend);
break;
case R_PPC_REL24:
/* warning: must be at 32 MB distancy */
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;
default:
error("unsupported powerpc relocation (%d)", type);
}
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册