Changeset 16904


Ignore:
Timestamp:
2009-07-19T00:28:46+02:00 (7 years ago)
Author:
nbd
Message:

mips: fix another bug in the module relocation change: the wrong base address for 24 bit jump -> long jump fixup table was used

Location:
trunk/target/linux/generic-2.6
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/patches-2.6.28/026-mips_module_reloc.patch

    r16831 r16904  
    210210 } 
    211211  
    212 @@ -97,27 +248,44 @@ static int apply_r_mips_32_rela(struct m 
     212@@ -97,27 +248,41 @@ static int apply_r_mips_32_rela(struct m 
    213213        return 0; 
    214214 } 
     
    216216-static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v) 
    217217+static Elf_Addr add_plt_entry_to(unsigned *plt_offset, 
    218 +                                void *start, unsigned size, Elf_Addr v) 
     218+                                void *start, Elf_Addr v) 
    219219 { 
    220220-       if (v % 4) { 
     
    230230-               return -ENOEXEC; 
    231231-       } 
    232 +       if (*plt_offset == size) 
    233 +               return 0; 
    234   
    235 -       *location = (*location & ~0x03ffffff) | 
    236 -                   ((*location + (v >> 2)) & 0x03ffffff); 
    237232+       *plt_offset += 4 * sizeof(int); 
    238233+ 
     
    240235+       if (v & 0x00008000) 
    241236+               v += 0x10000; 
    242 + 
     237  
     238-       *location = (*location & ~0x03ffffff) | 
     239-                   ((*location + (v >> 2)) & 0x03ffffff); 
    243240+       tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */ 
    244241+       tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */ 
     
    254251+           location < me->module_core + me->core_size) 
    255252+               return add_plt_entry_to(&me->arch.core_plt_offset, 
    256 +                               me->module_core, me->core_size, v); 
     253+                               me->arch.plt_tbl, v); 
    257254+ 
    258255+       if (location >= me->module_init && 
    259256+           location < me->module_init + me->init_size) 
    260257+               return add_plt_entry_to(&me->arch.init_plt_offset, 
    261 +                               me->module_init, me->init_size, v); 
     258+                               me->arch.plt_tbl, v); 
    262259  
    263260        return 0; 
     
    269266        if (v % 4) { 
    270267                printk(KERN_ERR "module %s: dangerous relocation\n", me->name); 
    271 @@ -125,17 +293,31 @@ static int apply_r_mips_26_rela(struct m 
     268@@ -125,17 +290,31 @@ static int apply_r_mips_26_rela(struct m 
    272269        } 
    273270  
     
    304301 { 
    305302        struct mips_hi16 *n; 
    306 @@ -400,11 +582,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
     303@@ -400,11 +579,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
    307304                list_add(&me->arch.dbe_list, &dbe_list); 
    308305                spin_unlock_irq(&dbe_lock); 
  • trunk/target/linux/generic-2.6/patches-2.6.30/027-mips_module_reloc.patch

    r16831 r16904  
    210210 } 
    211211  
    212 @@ -97,27 +248,44 @@ static int apply_r_mips_32_rela(struct m 
     212@@ -97,27 +248,41 @@ static int apply_r_mips_32_rela(struct m 
    213213        return 0; 
    214214 } 
     
    216216-static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v) 
    217217+static Elf_Addr add_plt_entry_to(unsigned *plt_offset, 
    218 +                                void *start, unsigned size, Elf_Addr v) 
     218+                                void *start, Elf_Addr v) 
    219219 { 
    220220-       if (v % 4) { 
     
    230230-               return -ENOEXEC; 
    231231-       } 
    232 +       if (*plt_offset == size) 
    233 +               return 0; 
    234   
    235 -       *location = (*location & ~0x03ffffff) | 
    236 -                   ((*location + (v >> 2)) & 0x03ffffff); 
    237232+       *plt_offset += 4 * sizeof(int); 
    238233+ 
     
    240235+       if (v & 0x00008000) 
    241236+               v += 0x10000; 
    242 + 
     237  
     238-       *location = (*location & ~0x03ffffff) | 
     239-                   ((*location + (v >> 2)) & 0x03ffffff); 
    243240+       tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */ 
    244241+       tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */ 
     
    254251+           location < me->module_core + me->core_size) 
    255252+               return add_plt_entry_to(&me->arch.core_plt_offset, 
    256 +                               me->module_core, me->core_size, v); 
     253+                               me->arch.plt_tbl, v); 
    257254+ 
    258255+       if (location >= me->module_init && 
    259256+           location < me->module_init + me->init_size) 
    260257+               return add_plt_entry_to(&me->arch.init_plt_offset, 
    261 +                               me->module_init, me->init_size, v); 
     258+                               me->arch.plt_tbl, v); 
    262259  
    263260        return 0; 
     
    269266        if (v % 4) { 
    270267                printk(KERN_ERR "module %s: dangerous relocation\n", me->name); 
    271 @@ -125,17 +293,31 @@ static int apply_r_mips_26_rela(struct m 
     268@@ -125,17 +290,31 @@ static int apply_r_mips_26_rela(struct m 
    272269        } 
    273270  
     
    304301 { 
    305302        struct mips_hi16 *n; 
    306 @@ -400,11 +582,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
     303@@ -400,11 +579,23 @@ int module_finalize(const Elf_Ehdr *hdr, 
    307304                list_add(&me->arch.dbe_list, &dbe_list); 
    308305                spin_unlock_irq(&dbe_lock); 
Note: See TracChangeset for help on using the changeset viewer.