• Helge Deller's avatar
    parisc: Clean up fixup routines for get_user()/put_user() · d19f5e41
    Helge Deller authored
    Al Viro noticed that userspace accesses via get_user()/put_user() can be
    simplified a lot with regard to usage of the exception handling.
    
    This patch implements a fixup routine for get_user() and put_user() in such
    that the exception handler will automatically load -EFAULT into the register
    %r8 (the error value) in case on a fault on userspace.  Additionally the fixup
    routine will zero the target register on fault in case of a get_user() call.
    The target register is extracted out of the faulting assembly instruction.
    
    This patch brings a few benefits over the old implementation:
    1. Exception handling gets much cleaner, easier and smaller in size.
    2. Helper functions like fixup_get_user_skip_1 (all of fixup.S) can be dropped.
    3. No need to hardcode %r9 as target register for get_user() any longer. This
       helps the compiler register allocator and thus creates less assembler
       statements.
    4. No dependency on the exception_data contents any longer.
    5. Nested faults will be handled cleanly.
    Reported-by: default avatarAl Viro <viro@ZenIV.linux.org.uk>
    Cc: <stable@vger.kernel.org> # v4.9+
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    d19f5e41
fault.c 10.5 KB