On Tue, 5 Apr 2016, Mikulas Patocka wrote: > > > On Tue, 5 Apr 2016, Helge Deller wrote: > > > On 05.04.2016 19:36, Mikulas Patocka wrote: > > > On Tue, 5 Apr 2016, Mikulas Patocka wrote: > > > > > >> Hi > > >> > > >> The patch "parisc: Use generic extable search and sort routines" makes the > > >> kernel unable to load any modules. It fails with: > > >> > > >> module unix: Unknown relocation: 9 > > >> modprobe: FATAL: Error inserting unix (/lib/modules/4.6.0-rc2/kernel/net/unix/unix.ko): Invalid module format > > >> > > >> When I revert the patch, the kernel 4.6-rc2 boots fine. > > >> > > >> Apparently, the function apply_relocate_add in arch/parisc/kernel/module.c > > >> doesn't handle the new relocation type. > > >> > > >> Mikulas > > > > > > BTW. I'm using hppa64 binutils 2.21 to build the kernel. It generates the > > > R_PARISC_PCREL32 relocation that the kernel module loader doesn't handle: > > > > > > Can you try attached patch (untested) ? > > > > Helge > > I tried a similar patch, the system booted fine ... but then I discovered > that the system boots fine no matter what value is written to *loc. > > Apparently, none of the modules trigger any exceptions in my > configuration. > > I'll have to create a test module that triggers some exception. > > Mikulas Hmm - it's even more strange. I created a test kernel module that triggers an exception by using get_user with an invalid address (see the attached file exception.tar) On x86-64 the module loads fine, but on pa-risc it always crashes, even with older kernel version (I tried versions 2.6.39, 4.5 and 4.6-rc2 and I always get a crash). When I write a userspace code that triggers a fault in module unix.ko, by passing an invalid address to the ioctl syscall, the kernel also crashes. So, it seems that handling exceptions from modules never worked on pa-risc, it was just masked by the fact that exceptions from modules don't happen during normal use. Mikulas /* this will crash pa-risc kernel if it is compiled with CONFIG_UNIX=m */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> int main(void) { int s, r; s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) perror("socket"), exit(1); r = ioctl(s, SIOCOUTQ, 0x124); if (r == -1) perror("ioctl"), exit(1); return 0; }
Attachment:
exception.tar
Description: exception module