[PATCH] H8/300 module fix

From: Yoshinori Sato
Date: Sun May 23 2004 - 07:42:13 EST


- fix relocation
- define SYMBOL_PREFIX

--
Yoshinori Sato
<ysato@xxxxxxxxxxxxxxxxxxxx>

diff -ur linux-2.6.6-bk9/arch/h8300/kernel/h8300_ksyms.c linux-2.6.6-h8300/arch/h8300/kernel/h8300_ksyms.c
--- linux-2.6.6-bk9/arch/h8300/kernel/h8300_ksyms.c 2004-05-23 21:11:56.000000000 +0900
+++ linux-2.6.6-h8300/arch/h8300/kernel/h8300_ksyms.c 2004-05-23 21:01:50.000000000 +0900
@@ -40,6 +40,8 @@
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 -ur linux-2.6.6-bk9/arch/h8300/kernel/module.c linux-2.6.6-h8300/arch/h8300/kernel/module.c
--- linux-2.6.6-bk9/arch/h8300/kernel/module.c 2004-05-23 21:11:56.000000000 +0900
+++ linux-2.6.6-h8300/arch/h8300/kernel/module.c 2004-05-23 21:01:50.000000000 +0900
@@ -67,7 +67,6 @@
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 @@
*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 @@
*(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 @@
}
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 -ur linux-2.6.6-bk9/include/asm-h8300/module.h linux-2.6.6-h8300/include/asm-h8300/module.h
--- linux-2.6.6-bk9/include/asm-h8300/module.h 2004-05-23 21:12:07.000000000 +0900
+++ linux-2.6.6-h8300/include/asm-h8300/module.h 2004-05-23 21:00:28.000000000 +0900
@@ -8,4 +8,6 @@
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr

+#define MODULE_SYMBOL_PREFIX "_"
+
#endif /* _ASM_H8/300_MODULE_H */
diff -ur linux-2.6.6-bk9/scripts/mk_elfconfig.c linux-2.6.6-h8300/scripts/mk_elfconfig.c
--- linux-2.6.6-bk9/scripts/mk_elfconfig.c 2004-01-09 16:00:04.000000000 +0900
+++ linux-2.6.6-h8300/scripts/mk_elfconfig.c 2004-05-23 21:01:08.000000000 +0900
@@ -55,7 +55,7 @@
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");
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/