• Jamie Garside's avatar
    microblaze: Fix syscall error recovery for invalid syscall IDs · c2219eda
    Jamie Garside authored
    This patch fixes two bugs in the Microblaze syscall trap handler when an invalid
    syscall ID is used.
    
    First, the range check on line 351 only checks for syscall IDs greater than
    __NR_syscalls. A negative syscall ID (either passed to `syscall()` or as returned
    by `do_syscall_trace_enter()` on error) will still satisfy this test and cause
    the Linux kernel to access an invalid memory location and cause a kernel oops.
    This has been fixed by also checking for r12 < 0.
    
    Secondly, the current error recovery at line 378 returns using the wrong register
    (r15 instead of r14) and does not restore the previous stack state. This has been
    fixed by invoking `ret_from_trap` on error, setting r3 to `-ENOSYS`, similar to
    what would happen when calling a valid syscall.
    Signed-off-by: default avatarJamie Garside <jamie.garside@york.ac.uk>
    Signed-off-by: default avatarMichal Simek <michal.simek@xilinx.com>
    c2219eda
entry.S 28.2 KB