arm64: fix implementation of mmap2 compat syscall
The arm mmap2 syscall takes the offset in units of 4K, thus with 64K pages the offset needs to be scaled to units of pages. Signed-off-by: Andreas Schwab <schwab@suse.de> Signed-off-by: Alexander Graf <agraf@suse.de> [will: removed redundant lr parameter, localised PAGE_SHIFT #if check] Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
ad08fd494b
commit
18ccb0cab4
|
@ -406,7 +406,7 @@ __SYSCALL(__NR_vfork, sys_vfork)
|
|||
#define __NR_ugetrlimit 191 /* SuS compliant getrlimit */
|
||||
__SYSCALL(__NR_ugetrlimit, compat_sys_getrlimit) /* SuS compliant getrlimit */
|
||||
#define __NR_mmap2 192
|
||||
__SYSCALL(__NR_mmap2, sys_mmap_pgoff)
|
||||
__SYSCALL(__NR_mmap2, compat_sys_mmap2_wrapper)
|
||||
#define __NR_truncate64 193
|
||||
__SYSCALL(__NR_truncate64, compat_sys_truncate64_wrapper)
|
||||
#define __NR_ftruncate64 194
|
||||
|
|
|
@ -19,9 +19,12 @@
|
|||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/const.h>
|
||||
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
* System call wrappers for the AArch32 compatibility layer.
|
||||
|
@ -53,6 +56,21 @@ ENTRY(compat_sys_fstatfs64_wrapper)
|
|||
b compat_sys_fstatfs64
|
||||
ENDPROC(compat_sys_fstatfs64_wrapper)
|
||||
|
||||
/*
|
||||
* Note: off_4k (w5) is always in units of 4K. If we can't do the
|
||||
* requested offset because it is not page-aligned, we return -EINVAL.
|
||||
*/
|
||||
ENTRY(compat_sys_mmap2_wrapper)
|
||||
#if PAGE_SHIFT > 12
|
||||
tst w5, #~PAGE_MASK >> 12
|
||||
b.ne 1f
|
||||
lsr w5, w5, #PAGE_SHIFT - 12
|
||||
#endif
|
||||
b sys_mmap_pgoff
|
||||
1: mov x0, #-EINVAL
|
||||
ret
|
||||
ENDPROC(compat_sys_mmap2_wrapper)
|
||||
|
||||
/*
|
||||
* Wrappers for AArch32 syscalls that either take 64-bit parameters
|
||||
* in registers or that take 32-bit parameters which require sign
|
||||
|
|
|
@ -37,6 +37,7 @@ asmlinkage long compat_sys_readahead_wrapper(void);
|
|||
asmlinkage long compat_sys_fadvise64_64_wrapper(void);
|
||||
asmlinkage long compat_sys_sync_file_range2_wrapper(void);
|
||||
asmlinkage long compat_sys_fallocate_wrapper(void);
|
||||
asmlinkage long compat_sys_mmap2_wrapper(void);
|
||||
|
||||
#undef __SYSCALL
|
||||
#define __SYSCALL(nr, sym) [nr] = sym,
|
||||
|
|
Loading…
Reference in New Issue