Skip to content
  • Nicolas Pitre's avatar
    [ARM] 2865/2: fix fadvise64_64 syscall argument passing · 68d9102f
    Nicolas Pitre authored
    
    
    Patch from Nicolas Pitre
    
    The prototype for sys_fadvise64_64() is:
        long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
    The argument list is therefore as follows on legacy ABI:
    	fd: type int (r0)
    	offset: type long long (r1-r2)
    	len: type long long (r3-sp[0])
    	advice: type int (sp[4])
    With EABI this becomes:
    	fd: type int (r0)
    	offset: type long long (r2-r3)
    	len: type long long (sp[0]-sp[4])
    	advice: type int (sp[8])
    Not only do we have ABI differences here, but the EABI version requires
    one additional word on the syscall stack.
    To avoid the ABI mismatch and the extra stack space required with EABI
    this syscall is now defined with a different argument ordering
    on ARM as follows:
        long sys_arm_fadvise64_64(int fd, int advice, loff_t offset, loff_t len)
    This gives us the following ABI independent argument distribution:
    	fd: type int (r0)
    	advice: type int (r1)
    	offset: type long long (r2-r3)
    	len: type long long (sp[0]-sp[4])
    Now, since the syscall entry code takes care of 5 registers only by
    default including the store of r4 to the stack, we need a wrapper to
    store r5 to the stack as well.  Because that wrapper was missing and was
    always required this means that sys_fadvise64_64 never worked on ARM and
    therefore we can safely reuse its syscall number for our new
    sys_arm_fadvise64_64 interface.
    
    Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    68d9102f