X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/2745ba44b659701075dbcbf3eaab257e53f95830..6cd2a38d9443178b42f390440413d91d5984a04c:/target/linux/sibyte/patches/106-no_module_reloc.patch diff --git a/target/linux/sibyte/patches/106-no_module_reloc.patch b/target/linux/sibyte/patches/106-no_module_reloc.patch index 833dea791..108b49808 100644 --- a/target/linux/sibyte/patches/106-no_module_reloc.patch +++ b/target/linux/sibyte/patches/106-no_module_reloc.patch @@ -1,34 +1,33 @@ -diff -urN linux-2.6.30.7/arch/mips/Makefile linux-2.6.30.7.new/arch/mips/Makefile ---- linux-2.6.30.7/arch/mips/Makefile 2009-09-27 13:17:16.000000000 +0200 -+++ linux-2.6.30.7.new/arch/mips/Makefile 2009-09-15 19:46:05.000000000 +0200 -@@ -83,7 +83,7 @@ +--- a/arch/mips/Makefile ++++ b/arch/mips/Makefile +@@ -93,8 +93,8 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin cflags-y += -G 0 -mno-abicalls -fno-pic -pipe cflags-y += -msoft-float LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --MODFLAGS += -mno-long-calls -+MODFLAGS += -mlong-calls +-KBUILD_AFLAGS_MODULE += -mno-long-calls +-KBUILD_CFLAGS_MODULE += -mno-long-calls ++KBUILD_AFLAGS_MODULE += -mlong-calls ++KBUILD_CFLAGS_MODULE += -mlong-calls cflags-y += -ffreestanding -diff -urN linux-2.6.30.7/arch/mips/include/asm/module.h linux-2.6.30.7.new/arch/mips/include/asm/module.h ---- linux-2.6.30.7/arch/mips/include/asm/module.h 2009-09-27 13:17:16.000000000 +0200 -+++ linux-2.6.30.7.new/arch/mips/include/asm/module.h 2009-09-15 19:46:05.000000000 +0200 -@@ -9,11 +9,6 @@ +--- a/arch/mips/include/asm/module.h ++++ b/arch/mips/include/asm/module.h +@@ -9,11 +9,6 @@ struct mod_arch_specific { struct list_head dbe_list; const struct exception_table_entry *dbe_start; const struct exception_table_entry *dbe_end; - -- void *plt_tbl; -- unsigned int core_plt_offset; -- unsigned int core_plt_size; -- unsigned int init_plt_offset; +- void *phys_plt_tbl; +- void *virt_plt_tbl; +- unsigned int phys_plt_offset; +- unsigned int virt_plt_offset; }; typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ -diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/kernel/module.c ---- linux-2.6.30.7/arch/mips/kernel/module.c 2009-09-27 13:17:16.000000000 +0200 -+++ linux-2.6.30.7.new/arch/mips/kernel/module.c 2009-09-15 19:46:05.000000000 +0200 -@@ -43,116 +43,6 @@ +--- a/arch/mips/kernel/module.c ++++ b/arch/mips/kernel/module.c +@@ -43,117 +43,6 @@ static struct mips_hi16 *mips_hi16_list; static LIST_HEAD(dbe_list); static DEFINE_SPINLOCK(dbe_lock); @@ -141,11 +140,12 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ - for (; page < end; ++page) - __free_page(page); -} +- - void *module_alloc(unsigned long size) { #ifdef MODULE_START -@@ -168,45 +58,16 @@ +@@ -169,99 +58,21 @@ void *module_alloc(unsigned long size) return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL); #else @@ -189,11 +189,28 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ - } else { - vfree(module_region); - } +-} +- +-static void *__module_alloc(int size, bool phys) +-{ +- void *ptr; +- +- if (phys) +- ptr = kmalloc(size, GFP_KERNEL); +- else +- ptr = vmalloc(size); +- return ptr; +-} +- +-static void __module_free(void *ptr) +-{ +- if (is_phys_addr(ptr)) +- kfree(ptr); +- else +- vfree(ptr); + vfree(module_region); - /* FIXME: If module_region == mod->init_region, trim exception - table entries. */ } -@@ -214,24 +75,6 @@ + int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, char *secstrings, struct module *mod) { @@ -208,17 +225,29 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ - core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false); - init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true); - -- mod->arch.core_plt_offset = 0; -- mod->arch.core_plt_size = core_size; -- mod->arch.init_plt_offset = core_size; -- mod->arch.plt_tbl = kmalloc(core_size + init_size, GFP_KERNEL); -- if (!mod->arch.plt_tbl) +- mod->arch.phys_plt_offset = 0; +- mod->arch.virt_plt_offset = 0; +- mod->arch.phys_plt_tbl = NULL; +- mod->arch.virt_plt_tbl = NULL; +- +- if ((core_size + init_size) == 0) +- return 0; +- +- mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1); +- if (!mod->arch.phys_plt_tbl) +- return -ENOMEM; +- +- mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0); +- if (!mod->arch.virt_plt_tbl) { +- __module_free(mod->arch.phys_plt_tbl); +- mod->arch.phys_plt_tbl = NULL; - return -ENOMEM; +- } - return 0; } -@@ -254,41 +97,27 @@ +@@ -284,36 +95,28 @@ static int apply_r_mips_32_rela(struct m return 0; } @@ -227,7 +256,6 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ +static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v) { - unsigned *tramp = start + *plt_offset; -- - *plt_offset += 4 * sizeof(int); - - /* adjust carry for addiu */ @@ -238,20 +266,14 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ - tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */ - tramp[2] = 0x03200008; /* jr t9 */ - tramp[3] = 0x00000000; /* nop */ -- -- return (Elf_Addr) tramp; --} + if (v % 4) { -+ printk(KERN_ERR "module %s: dangerous relocation\n", me->name); ++ pr_err("module %s: dangerous R_MIPS_26 REL relocation\n", ++ me->name); + return -ENOEXEC; + } --static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v) --{ -- if (location >= me->module_core && -- location < me->module_core + me->core_size) -- return add_plt_entry_to(&me->arch.core_plt_offset, -- me->arch.plt_tbl, v); +- return (Elf_Addr) tramp; +-} + if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { + printk(KERN_ERR + "module %s: relocation overflow\n", @@ -259,22 +281,26 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ + return -ENOEXEC; + } -- if (location >= me->module_init && -- location < me->module_init + me->init_size) -- return add_plt_entry_to(&me->arch.init_plt_offset, -- me->arch.plt_tbl, v); +-static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v) +-{ +- if (is_phys_addr(location)) +- return add_plt_entry_to(&me->arch.phys_plt_offset, +- me->arch.phys_plt_tbl, v); +- else +- return add_plt_entry_to(&me->arch.virt_plt_offset, +- me->arch.virt_plt_tbl, v); + *location = (*location & ~0x03ffffff) | + ((*location + (v >> 2)) & 0x03ffffff); - return 0; ++ return 0; } -static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v) +static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v) { if (v % 4) { - printk(KERN_ERR "module %s: dangerous relocation\n", me->name); -@@ -296,31 +125,17 @@ + pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n", +@@ -322,31 +125,17 @@ static int set_r_mips_26(struct module * } if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { @@ -309,18 +335,20 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v) { struct mips_hi16 *n; -@@ -585,23 +400,11 @@ +@@ -611,32 +400,11 @@ int module_finalize(const Elf_Ehdr *hdr, list_add(&me->arch.dbe_list, &dbe_list); spin_unlock_irq(&dbe_lock); } - - /* Get rid of the fixup trampoline if we're running the module - * from physically mapped address space */ -- if (me->arch.core_plt_offset == 0 && -- me->arch.init_plt_offset == me->arch.core_plt_size && -- is_phys_addr(me->module_core)) { -- kfree(me->arch.plt_tbl); -- me->arch.plt_tbl = NULL; +- if (me->arch.phys_plt_offset == 0) { +- __module_free(me->arch.phys_plt_tbl); +- me->arch.phys_plt_tbl = NULL; +- } +- if (me->arch.virt_plt_offset == 0) { +- __module_free(me->arch.virt_plt_tbl); +- me->arch.virt_plt_tbl = NULL; - } - return 0; @@ -328,8 +356,15 @@ diff -urN linux-2.6.30.7/arch/mips/kernel/module.c linux-2.6.30.7.new/arch/mips/ void module_arch_cleanup(struct module *mod) { -- if (mod->arch.plt_tbl) -- kfree(mod->arch.plt_tbl); +- if (mod->arch.phys_plt_tbl) { +- __module_free(mod->arch.phys_plt_tbl); +- mod->arch.phys_plt_tbl = NULL; +- } +- if (mod->arch.virt_plt_tbl) { +- __module_free(mod->arch.virt_plt_tbl); +- mod->arch.virt_plt_tbl = NULL; +- } +- spin_lock_irq(&dbe_lock); list_del(&mod->arch.dbe_list); spin_unlock_irq(&dbe_lock);