Commit c298be74 authored by Helge Deller's avatar Helge Deller Committed by Rusty Russell

parisc: fix module loading failure of large kernel modules

On 32bit (and sometimes 64bit) and with big kernel modules like xfs or
ipv6 the relocation types R_PARISC_PCREL17F and R_PARISC_PCREL22F may
fail to reach their PLT stub if we only create one big stub array for
all sections at the beginning of the core or init section.

With this patch we now instead add individual PLT stub entries
directly in front of the code sections where the stubs are actually
called. This reduces the distance between the PCREL location and the
stub entry so that the relocations can be fulfilled.

While calculating the final layout of the kernel module in memory, the
kernel module loader calls arch_mod_section_prepend() to request the
to be reserved amount of memory in front of each individual section.

Tested with 32- and 64bit kernels.
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 088af9a6
...@@ -23,8 +23,10 @@ struct mod_arch_specific ...@@ -23,8 +23,10 @@ struct mod_arch_specific
{ {
unsigned long got_offset, got_count, got_max; unsigned long got_offset, got_count, got_max;
unsigned long fdesc_offset, fdesc_count, fdesc_max; unsigned long fdesc_offset, fdesc_count, fdesc_max;
unsigned long stub_offset, stub_count, stub_max; struct {
unsigned long init_stub_offset, init_stub_count, init_stub_max; unsigned long stub_offset;
unsigned int stub_entries;
} *section;
int unwind_section; int unwind_section;
struct unwind_table *unwind; struct unwind_table *unwind;
}; };
......
This diff is collapsed.
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