diff options
| author | Andrew Morton <akpm@osdl.org> | 2004-05-24 18:42:12 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-05-24 18:42:12 -0700 |
| commit | 04e9b59f87797bea9a62e384817532ac21fd4e4f (patch) | |
| tree | b6cb72e4955c83c312b870e50cc96c926944034f | |
| parent | 4557746401a0c7e4903e55ca3ed3d6a3314acc04 (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.c | 2 | ||||
| -rw-r--r-- | arch/h8300/kernel/module.c | 10 | ||||
| -rw-r--r-- | include/asm-h8300/module.h | 2 | ||||
| -rw-r--r-- | scripts/mk_elfconfig.c | 2 |
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"); |
