summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-24 18:42:12 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-24 18:42:12 -0700
commit04e9b59f87797bea9a62e384817532ac21fd4e4f (patch)
treeb6cb72e4955c83c312b870e50cc96c926944034f
parent4557746401a0c7e4903e55ca3ed3d6a3314acc04 (diff)
[PATCH] H8/300 module fix
From: Yoshinori Sato <ysato@users.sourceforge.jp> - fix relocation - define SYMBOL_PREFIX
-rw-r--r--arch/h8300/kernel/h8300_ksyms.c2
-rw-r--r--arch/h8300/kernel/module.c10
-rw-r--r--include/asm-h8300/module.h2
-rw-r--r--scripts/mk_elfconfig.c2
4 files changed, 10 insertions, 6 deletions
diff --git a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c
index 590415dc2f30..ca8578fedaa9 100644
--- a/arch/h8300/kernel/h8300_ksyms.c
+++ b/arch/h8300/kernel/h8300_ksyms.c
@@ -40,6 +40,8 @@ EXPORT_SYMBOL(strncmp);
EXPORT_SYMBOL(ip_fast_csum);
EXPORT_SYMBOL(kernel_thread);
+EXPORT_SYMBOL(enable_irq);
+EXPORT_SYMBOL(disable_irq);
/* Networking helper routines. */
EXPORT_SYMBOL(csum_partial_copy);
diff --git a/arch/h8300/kernel/module.c b/arch/h8300/kernel/module.c
index 433e92292428..4fd7138a6e03 100644
--- a/arch/h8300/kernel/module.c
+++ b/arch/h8300/kernel/module.c
@@ -67,7 +67,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
Elf32_Sym *sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rela[i].r_info);
uint32_t v = sym->st_value + rela[i].r_addend;
- uint32_t dot = sechdrs[symindex].sh_addr + rela[i].r_offset;
switch (ELF32_R_TYPE(rela[i].r_info)) {
case R_H8_DIR24R8:
@@ -75,14 +74,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
*loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
break;
case R_H8_DIR24A8:
- *loc += v;
+ if (ELF32_R_SYM(rela[i].r_info))
+ *loc += v;
break;
case R_H8_DIR32:
case R_H8_DIR32A16:
*loc += v;
break;
case R_H8_PCREL16:
- v -= dot + 2;
+ v -= (unsigned long)loc + 2;
if ((Elf32_Sword)v > 0x7fff ||
(Elf32_Sword)v < -(Elf32_Sword)0x8000)
goto overflow;
@@ -90,7 +90,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
*(unsigned short *)loc = v;
break;
case R_H8_PCREL8:
- v -= dot + 1;
+ v -= (unsigned long)loc + 1;
if ((Elf32_Sword)v > 0x7f ||
(Elf32_Sword)v < -(Elf32_Sword)0x80)
goto overflow;
@@ -105,7 +105,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
}
return 0;
overflow:
- printk(KERN_ERR "module %s: relocation offset overflow: %p\n",
+ printk(KERN_ERR "module %s: relocation offset overflow: %08x\n",
me->name, rela[i].r_offset);
return -ENOEXEC;
}
diff --git a/include/asm-h8300/module.h b/include/asm-h8300/module.h
index 8e46724b7c09..de23231f3196 100644
--- a/include/asm-h8300/module.h
+++ b/include/asm-h8300/module.h
@@ -8,4 +8,6 @@ struct mod_arch_specific { };
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
+#define MODULE_SYMBOL_PREFIX "_"
+
#endif /* _ASM_H8/300_MODULE_H */
diff --git a/scripts/mk_elfconfig.c b/scripts/mk_elfconfig.c
index a397648231af..de2aabf89fb3 100644
--- a/scripts/mk_elfconfig.c
+++ b/scripts/mk_elfconfig.c
@@ -55,7 +55,7 @@ main(int argc, char **argv)
else
abort();
- if (strcmp(argv[1], "v850") == 0)
+ if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0))
printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
else
printf("#define MODULE_SYMBOL_PREFIX \"\"\n");