Loading arch/sh/kernel/module.c +5 −34 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/fs.h> #include <linux/string.h> #include <linux/kernel.h> #include <asm/unaligned.h> void *module_alloc(unsigned long size) { Loading @@ -56,34 +57,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, return 0; } #ifdef CONFIG_SUPERH32 #define COPY_UNALIGNED_WORD(sw, tw, align) \ { \ void *__s = &(sw), *__t = &(tw); \ unsigned short *__s2 = __s, *__t2 = __t; \ unsigned char *__s1 = __s, *__t1 = __t; \ switch ((align)) \ { \ case 0: \ *(unsigned long *) __t = *(unsigned long *) __s; \ break; \ case 2: \ *__t2++ = *__s2++; \ *__t2 = *__s2; \ break; \ default: \ *__t1++ = *__s1++; \ *__t1++ = *__s1++; \ *__t1++ = *__s1++; \ *__t1 = *__s1; \ break; \ } \ } #else /* One thing SHmedia doesn't screw up! */ #define COPY_UNALIGNED_WORD(sw, tw, align) { (tw) = (sw); } #endif int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, Loading @@ -96,7 +69,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, Elf32_Addr relocation; uint32_t *location; uint32_t value; int align; pr_debug("Applying relocate section %u to %u\n", relsec, sechdrs[relsec].sh_info); Loading @@ -109,7 +81,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + ELF32_R_SYM(rel[i].r_info); relocation = sym->st_value + rel[i].r_addend; align = (int)location & 3; #ifdef CONFIG_SUPERH64 /* For text addresses, bit2 of the st_other field indicates Loading @@ -122,15 +93,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, switch (ELF32_R_TYPE(rel[i].r_info)) { case R_SH_DIR32: COPY_UNALIGNED_WORD (*location, value, align); value = get_unaligned(location); value += relocation; COPY_UNALIGNED_WORD (value, *location, align); put_unaligned(value, location); break; case R_SH_REL32: relocation = (relocation - (Elf32_Addr) location); COPY_UNALIGNED_WORD (*location, value, align); value = get_unaligned(location); value += relocation; COPY_UNALIGNED_WORD (value, *location, align); put_unaligned(value, location); break; case R_SH_IMM_LOW16: *location = (*location & ~0x3fffc00) | Loading Loading
arch/sh/kernel/module.c +5 −34 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/fs.h> #include <linux/string.h> #include <linux/kernel.h> #include <asm/unaligned.h> void *module_alloc(unsigned long size) { Loading @@ -56,34 +57,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, return 0; } #ifdef CONFIG_SUPERH32 #define COPY_UNALIGNED_WORD(sw, tw, align) \ { \ void *__s = &(sw), *__t = &(tw); \ unsigned short *__s2 = __s, *__t2 = __t; \ unsigned char *__s1 = __s, *__t1 = __t; \ switch ((align)) \ { \ case 0: \ *(unsigned long *) __t = *(unsigned long *) __s; \ break; \ case 2: \ *__t2++ = *__s2++; \ *__t2 = *__s2; \ break; \ default: \ *__t1++ = *__s1++; \ *__t1++ = *__s1++; \ *__t1++ = *__s1++; \ *__t1 = *__s1; \ break; \ } \ } #else /* One thing SHmedia doesn't screw up! */ #define COPY_UNALIGNED_WORD(sw, tw, align) { (tw) = (sw); } #endif int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, Loading @@ -96,7 +69,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, Elf32_Addr relocation; uint32_t *location; uint32_t value; int align; pr_debug("Applying relocate section %u to %u\n", relsec, sechdrs[relsec].sh_info); Loading @@ -109,7 +81,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + ELF32_R_SYM(rel[i].r_info); relocation = sym->st_value + rel[i].r_addend; align = (int)location & 3; #ifdef CONFIG_SUPERH64 /* For text addresses, bit2 of the st_other field indicates Loading @@ -122,15 +93,15 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, switch (ELF32_R_TYPE(rel[i].r_info)) { case R_SH_DIR32: COPY_UNALIGNED_WORD (*location, value, align); value = get_unaligned(location); value += relocation; COPY_UNALIGNED_WORD (value, *location, align); put_unaligned(value, location); break; case R_SH_REL32: relocation = (relocation - (Elf32_Addr) location); COPY_UNALIGNED_WORD (*location, value, align); value = get_unaligned(location); value += relocation; COPY_UNALIGNED_WORD (value, *location, align); put_unaligned(value, location); break; case R_SH_IMM_LOW16: *location = (*location & ~0x3fffc00) | Loading