• Christophe Leroy's avatar
    powerpc/lib/sstep: Don't use __{get/put}_user() on kernel addresses · e28d0b67
    Christophe Leroy authored
    In the old days, when we didn't have kernel userspace access
    protection and had set_fs(), it was wise to use __get_user()
    and friends to read kernel memory.
    
    Nowadays, get_user() and put_user() are granting userspace access and
    are exclusively for userspace access.
    
    Convert single step emulation functions to user_access_begin() and
    friends and use unsafe_get_user() and unsafe_put_user().
    
    When addressing kernel addresses, there is no need to open userspace
    access. And for book3s/32 it is particularly important to no try and
    open userspace access on kernel address, because that would break the
    content of kernel space segment registers. No guard has been put
    against that risk in order to avoid degrading performance.
    
    copy_from_kernel_nofault() and copy_to_kernel_nofault() should
    be used but they are out-of-line functions which would degrade
    performance. Those two functions are making use of
    __get_kernel_nofault() and __put_kernel_nofault() macros.
    Those two macros are just wrappers behind __get_user_size_goto() and
    __put_user_size_goto().
    
    unsafe_get_user() and unsafe_put_user() are also wrappers of
    __get_user_size_goto() and __put_user_size_goto(). Use them to
    access kernel space. That allows refactoring userspace and
    kernelspace access.
    Reported-by: default avatarStan Johnson <userm57@yahoo.com>
    Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
    Depends-on: 4fe5cda9 ("powerpc/uaccess: Implement user_read_access_begin and user_write_access_begin")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/22831c9d17f948680a12c5292e7627288b15f713.1631817805.git.christophe.leroy@csgroup.eu
    e28d0b67
sstep.c 82.4 KB