Commit fadf2e60 authored by John Williams's avatar John Williams Committed by Michal Simek

microblaze: Get module loading working

New reloc type R_MICROBLAZE_32_PCREL_LO requires a null handler (no work to do).

Remove legacy hack for broken linker pre gcc-4.1.1, that required us to extract
an offset from the code, add it to the addend, then rewrite the instruction.

Fixup the invalid reloc type error output.

Boot tested with the xilinx_emaclite ethernet driver.
Signed-off-by: default avatarJohn Williams <john.williams@petalogix.com>
Signed-off-by: default avatarMichal Simek <monstr@monstr.eu>
parent bfc0ca0d
...@@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
unsigned long int *location; unsigned long int *location;
unsigned long int locoffs;
unsigned long int value; unsigned long int value;
#if __GNUC__ < 4 #if __GNUC__ < 4
unsigned long int old_value; unsigned long int old_value;
...@@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
break; break;
case R_MICROBLAZE_64_PCREL: case R_MICROBLAZE_64_PCREL:
locoffs = (location[0] & 0xFFFF) << 16 | #if __GNUC__ < 4
old_value = (location[0] & 0xFFFF) << 16 |
(location[1] & 0xFFFF); (location[1] & 0xFFFF);
value -= (unsigned long int)(location) + 4 + value -= old_value;
locoffs; #endif
value -= (unsigned long int)(location) + 4;
location[0] = (location[0] & 0xFFFF0000) | location[0] = (location[0] & 0xFFFF0000) |
(value >> 16); (value >> 16);
location[1] = (location[1] & 0xFFFF0000) | location[1] = (location[1] & 0xFFFF0000) |
...@@ -125,6 +126,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -125,6 +126,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
value); value);
break; break;
case R_MICROBLAZE_32_PCREL_LO:
pr_debug("R_MICROBLAZE_32_PCREL_LO\n");
break;
case R_MICROBLAZE_NONE: case R_MICROBLAZE_NONE:
pr_debug("R_MICROBLAZE_NONE\n"); pr_debug("R_MICROBLAZE_NONE\n");
break; break;
...@@ -133,7 +138,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, ...@@ -133,7 +138,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
printk(KERN_ERR "module %s: " printk(KERN_ERR "module %s: "
"Unknown relocation: %u\n", "Unknown relocation: %u\n",
module->name, module->name,
ELF32_R_TYPE(rela->r_info)); ELF32_R_TYPE(rela[i].r_info));
return -ENOEXEC; return -ENOEXEC;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment