From: catalin.marinas@arm.com (Catalin Marinas)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 22/24] ARM64:ILP32: Use a seperate syscall table as a few syscalls need to be using the compat syscalls.
Date: Tue, 1 Jul 2014 16:05:39 +0100 [thread overview]
Message-ID: <20140701150539.GA18309@arm.com> (raw)
In-Reply-To: <1400914939-9708-23-git-send-email-apinski@cavium.com>
On Sat, May 24, 2014 at 12:02:17AM -0700, Andrew Pinski wrote:
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index 1e1ebfc..8241ffe 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -620,9 +620,14 @@ ENDPROC(ret_from_fork)
> */
> .align 6
> el0_svc:
> - adrp stbl, sys_call_table // load syscall table pointer
> uxtw scno, w8 // syscall number in w8
> mov sc_nr, #__NR_syscalls
> +#ifdef CONFIG_ARM64_ILP32
> + get_thread_info tsk
> + ldr x16, [tsk, #TI_FLAGS]
> + tbnz x16, #TIF_32BIT_AARCH64, el0_ilp32_svc // We are using ILP32
> +#endif
> + adrp stbl, sys_call_table // load syscall table pointer
This adds a slight penalty on the AArch64 SVC entry path. I can't tell
whether that's visible or not but I think the x86 guys decided to set an
extra bit to the syscall number to distinguish it from native calls.
> diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c
> new file mode 100644
> index 0000000..1da1d11
> --- /dev/null
> +++ b/arch/arm64/kernel/sys_ilp32.c
[...]
> +/*
> + * Wrappers to pass the pt_regs argument.
> + */
> +#define sys_rt_sigreturn sys_rt_sigreturn_wrapper
> +
> +
> +/* Using Compat syscalls where necessary */
> +#define sys_ioctl compat_sys_ioctl
> +/* iovec */
> +#define sys_readv compat_sys_readv
> +#define sys_writev compat_sys_writev
> +#define sys_preadv compat_sys_preadv64
> +#define sys_pwritev compat_sys_pwritev64
> +#define sys_vmsplice compat_sys_vmsplice
Do these actually work? compat_iovec has two members of 32-bit each
while the ILP32 iovec has a void * (32-bit) and a __kernel_size_t which
is 64-bit.
> +/* robust_list_head */
> +#define sys_set_robust_list compat_sys_set_robust_list
> +#define sys_get_robust_list compat_sys_get_robust_list
Same here, we have a size_t * argument. The compat function would write
back 32-bit but size_t is 64-bit for ILP32.
> +/* kexec_segment */
> +#define sys_kexec_load compat_sys_kexec_load
More size_t members in the kexec_segment structure (but we don't yet
have kexec on arm64).
> +/* struct msghdr */
> +#define sys_recvfrom compat_sys_recvfrom
Why compat here? struct sockaddr seems to be the same as the native one.
> +#define sys_recvmmsg compat_sys_recvmmsg
> +#define sys_sendmmsg compat_sys_sendmmsg
> +#define sys_sendmsg compat_sys_sendmsg
> +#define sys_recvmsg compat_sys_recvmsg
These get messier as well with a different size_t affecting struct
msghdr.
> +#define sys_setsockopt compat_sys_setsockopt
> +#define sys_getsockopt compat_sys_getsockopt
Looking at the sock_getsockopt() function, we have a union v copied
to/from user. However, such a union contains a struct timeval which for
ILP32 would be different than the compat one.
> +/* iovec */
> +#define sys_process_vm_readv compat_sys_process_vm_readv
> +#define sys_process_vm_writev compat_sys_process_vm_writev
See above for iovec.
> +/* Pointer in struct */
> +#define sys_mount compat_sys_mount
Which structure is this?
> +/* Scheduler */
> +/* unsigned long bitmaps */
> +#define sys_sched_setaffinity compat_sys_sched_setaffinity
> +#define sys_sched_getaffinity compat_sys_sched_getaffinity
Does the long bitmask matter here? I can see the length is passed in
bytes.
> +/* iov usage */
> +#define sys_keyctl compat_sys_keyctl
Same problem as iovec above.
> +/* aio */
> +/* Pointer to Pointer */
> +#define sys_io_setup compat_sys_io_setup
sys_io_setup takes a pointer to aio_context_t which is defined as
__kernel_ulong_t (same as LP64).
--
Catalin
WARNING: multiple messages have this Message-ID (diff)
From: Catalin Marinas <catalin.marinas@arm.com>
To: Andrew Pinski <apinski@cavium.com>
Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 22/24] ARM64:ILP32: Use a seperate syscall table as a few syscalls need to be using the compat syscalls.
Date: Tue, 1 Jul 2014 16:05:39 +0100 [thread overview]
Message-ID: <20140701150539.GA18309@arm.com> (raw)
In-Reply-To: <1400914939-9708-23-git-send-email-apinski@cavium.com>
On Sat, May 24, 2014 at 12:02:17AM -0700, Andrew Pinski wrote:
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index 1e1ebfc..8241ffe 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -620,9 +620,14 @@ ENDPROC(ret_from_fork)
> */
> .align 6
> el0_svc:
> - adrp stbl, sys_call_table // load syscall table pointer
> uxtw scno, w8 // syscall number in w8
> mov sc_nr, #__NR_syscalls
> +#ifdef CONFIG_ARM64_ILP32
> + get_thread_info tsk
> + ldr x16, [tsk, #TI_FLAGS]
> + tbnz x16, #TIF_32BIT_AARCH64, el0_ilp32_svc // We are using ILP32
> +#endif
> + adrp stbl, sys_call_table // load syscall table pointer
This adds a slight penalty on the AArch64 SVC entry path. I can't tell
whether that's visible or not but I think the x86 guys decided to set an
extra bit to the syscall number to distinguish it from native calls.
> diff --git a/arch/arm64/kernel/sys_ilp32.c b/arch/arm64/kernel/sys_ilp32.c
> new file mode 100644
> index 0000000..1da1d11
> --- /dev/null
> +++ b/arch/arm64/kernel/sys_ilp32.c
[...]
> +/*
> + * Wrappers to pass the pt_regs argument.
> + */
> +#define sys_rt_sigreturn sys_rt_sigreturn_wrapper
> +
> +
> +/* Using Compat syscalls where necessary */
> +#define sys_ioctl compat_sys_ioctl
> +/* iovec */
> +#define sys_readv compat_sys_readv
> +#define sys_writev compat_sys_writev
> +#define sys_preadv compat_sys_preadv64
> +#define sys_pwritev compat_sys_pwritev64
> +#define sys_vmsplice compat_sys_vmsplice
Do these actually work? compat_iovec has two members of 32-bit each
while the ILP32 iovec has a void * (32-bit) and a __kernel_size_t which
is 64-bit.
> +/* robust_list_head */
> +#define sys_set_robust_list compat_sys_set_robust_list
> +#define sys_get_robust_list compat_sys_get_robust_list
Same here, we have a size_t * argument. The compat function would write
back 32-bit but size_t is 64-bit for ILP32.
> +/* kexec_segment */
> +#define sys_kexec_load compat_sys_kexec_load
More size_t members in the kexec_segment structure (but we don't yet
have kexec on arm64).
> +/* struct msghdr */
> +#define sys_recvfrom compat_sys_recvfrom
Why compat here? struct sockaddr seems to be the same as the native one.
> +#define sys_recvmmsg compat_sys_recvmmsg
> +#define sys_sendmmsg compat_sys_sendmmsg
> +#define sys_sendmsg compat_sys_sendmsg
> +#define sys_recvmsg compat_sys_recvmsg
These get messier as well with a different size_t affecting struct
msghdr.
> +#define sys_setsockopt compat_sys_setsockopt
> +#define sys_getsockopt compat_sys_getsockopt
Looking at the sock_getsockopt() function, we have a union v copied
to/from user. However, such a union contains a struct timeval which for
ILP32 would be different than the compat one.
> +/* iovec */
> +#define sys_process_vm_readv compat_sys_process_vm_readv
> +#define sys_process_vm_writev compat_sys_process_vm_writev
See above for iovec.
> +/* Pointer in struct */
> +#define sys_mount compat_sys_mount
Which structure is this?
> +/* Scheduler */
> +/* unsigned long bitmaps */
> +#define sys_sched_setaffinity compat_sys_sched_setaffinity
> +#define sys_sched_getaffinity compat_sys_sched_getaffinity
Does the long bitmask matter here? I can see the length is passed in
bytes.
> +/* iov usage */
> +#define sys_keyctl compat_sys_keyctl
Same problem as iovec above.
> +/* aio */
> +/* Pointer to Pointer */
> +#define sys_io_setup compat_sys_io_setup
sys_io_setup takes a pointer to aio_context_t which is defined as
__kernel_ulong_t (same as LP64).
--
Catalin
next prev parent reply other threads:[~2014-07-01 15:05 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-24 7:01 [PATCHv2 00/24] ILP32 Support in ARM64 Andrew Pinski
2014-05-24 7:01 ` Andrew Pinski
2014-05-24 7:01 ` [PATCH 01/24] ARM64: Force LP64 to compile the kernel Andrew Pinski
2014-05-24 7:01 ` Andrew Pinski
2014-05-24 7:01 ` [PATCH 02/24] ARM64: Rename COMPAT to AARCH32_EL0 in Kconfig Andrew Pinski
2014-05-24 7:01 ` Andrew Pinski
2014-05-24 7:01 ` [PATCH 03/24] ARM64: Change some CONFIG_COMPAT over to use CONFIG_AARCH32_EL0 instead Andrew Pinski
2014-05-24 7:01 ` Andrew Pinski
2014-06-17 15:15 ` Catalin Marinas
2014-06-17 15:15 ` Catalin Marinas
2014-05-24 7:01 ` [PATCH 04/24] ARM64:ILP32: Set kernel_long to long long so we can reuse most of the same syscalls as LP64 Andrew Pinski
2014-05-24 7:01 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 05/24] ARM64:UAPI: Set the correct __BITS_PER_LONG for ILP32 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-17 15:22 ` Catalin Marinas
2014-06-17 15:22 ` Catalin Marinas
2014-06-17 15:29 ` Arnd Bergmann
2014-06-17 15:29 ` Arnd Bergmann
2014-05-24 7:02 ` [PATCH 06/24] Allow for some signal structures to be the same between a 32bit ABI and the 64bit ABI Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-17 15:43 ` Catalin Marinas
2014-06-17 15:43 ` Catalin Marinas
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 07/24] ARM64:ILP32: Use the same size and layout of the signal structures for ILP32 as for LP64 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-17 15:58 ` Catalin Marinas
2014-06-17 15:58 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 08/24] Allow a 32bit ABI to use the naming of the 64bit ABI syscalls to avoid confusion of not splitting the registers Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-17 16:22 ` Catalin Marinas
2014-06-17 16:22 ` Catalin Marinas
2014-06-17 16:22 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 09/24] ARM64:ILP32: Use the same syscall names as LP64 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-18 8:51 ` Catalin Marinas
2014-06-18 8:51 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 10/24] ARM64: Introduce is_a32_task and is_a32_thread. Use them in the correct locations Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-18 17:47 ` Catalin Marinas
2014-06-18 17:47 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 11/24] ARM64: Add ARM64_ILP32 to Kconfig Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 12/24] ARM64: Add is_ilp32_compat_task and is_ilp32_compat_thread and TIF_32BIT_AARCH64 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-19 12:49 ` Catalin Marinas
2014-06-19 12:49 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 13/24] Drivers:input: Use is_compat_task for ARM64 also Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-19 12:50 ` Catalin Marinas
2014-06-19 12:50 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 14/24] ARM64:ILP32: COMPAT_USE_64BIT_TIME is true for ILP32 tasks Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-19 12:52 ` Catalin Marinas
2014-06-19 12:52 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 15/24] ARM64:ILP32: Use the non compat HWCAP for ILP32 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-19 12:54 ` Catalin Marinas
2014-06-19 12:54 ` Catalin Marinas
2014-07-01 13:01 ` Dr. Philipp Tomsich
2014-07-01 13:01 ` Dr. Philipp Tomsich
2014-05-24 7:02 ` [PATCH 16/24] ARM64:ILP32 use the standard start_thread for ILP32 so the processor state is not AARCH32 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 17/24] ARM64:ILP32: Support core dump for ILP32 Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 18/24] ARM64: Add loading of ILP32 binaries Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 19/24] ARM64: Add vdso for ILP32 and use it for the signal return Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 20/24] ptrace: Allow compat to use the native siginfo Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 21/24] ARM64:ILP32: The native siginfo is used instead of the compat siginfo Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 18:56 ` H. Peter Anvin
2014-05-24 18:56 ` H. Peter Anvin
2014-05-24 7:02 ` [PATCH 22/24] ARM64:ILP32: Use a seperate syscall table as a few syscalls need to be using the compat syscalls Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-07-01 15:05 ` Catalin Marinas [this message]
2014-07-01 15:05 ` Catalin Marinas
2014-07-01 15:30 ` Pinski, Andrew
2014-07-01 15:30 ` Pinski, Andrew
2014-07-01 16:38 ` Arnd Bergmann
2014-07-01 16:38 ` Arnd Bergmann
2014-07-01 16:50 ` Catalin Marinas
2014-07-01 16:50 ` Catalin Marinas
2014-07-01 17:04 ` Arnd Bergmann
2014-07-01 17:04 ` Arnd Bergmann
2014-07-01 16:49 ` Catalin Marinas
2014-07-01 16:49 ` Catalin Marinas
2014-05-24 7:02 ` [PATCH 23/24] ARM64:ILP32: Fix signal return for ILP32 when the user modified the signal stack Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-05-24 7:02 ` [PATCH 24/24] Add documentation about ARM64 ILP32 ABI Andrew Pinski
2014-05-24 7:02 ` Andrew Pinski
2014-06-16 17:08 ` [PATCHv2 00/24] ILP32 Support in ARM64 Catalin Marinas
2014-06-16 17:08 ` Catalin Marinas
2014-06-16 17:19 ` Pinski, Andrew
2014-06-16 17:19 ` Pinski, Andrew
2014-06-17 10:43 ` Catalin Marinas
2014-06-17 10:43 ` Catalin Marinas
2014-06-17 11:30 ` Pinski, Andrew
2014-06-17 11:30 ` Pinski, Andrew
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140701150539.GA18309@arm.com \
--to=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.