• Max Filippov's avatar
    xtensa: fix type conversion in __get_user_[no]check · c9c63f3c
    Max Filippov authored
    __get_user_[no]check uses temporary buffer of type long to store result
    of __get_user_size and do sign extension on it when necessary. This
    doesn't work correctly for 64-bit data. Fix it by moving temporary
    buffer/sign extension logic to __get_user_asm.
    
    Don't do assignment of __get_user_bad result to (x) as it may not always
    be integer-compatible now and issue warning even when it's going to be
    optimized. Instead do (x) = 0; and call __get_user_bad separately.
    
    Zero initialize __x in __get_user_asm and use '+' constraint for its
    assembly argument, so that its value is preserved in error cases. This
    may add at most 1 cycle to the fast path, but saves an instruction and
    two padding bytes in the fixup section for each use of this macro and
    works for both misaligned store and store exception.
    Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
    c9c63f3c
uaccess.h 9.04 KB