From: arnd@arndb.de (Arnd Bergmann)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 13/20] arm64: ilp32: share aarch32 syscall wrappers to ilp32
Date: Wed, 23 Dec 2015 21:41:54 +0100 [thread overview]
Message-ID: <201512232141.54384.arnd@arndb.de> (raw)
In-Reply-To: <20151223133736.GB28445@e104818-lin.cambridge.arm.com>
On Wednesday 23 December 2015, Catalin Marinas wrote:
> > That means we have to set ARCH_PACK_STATFS64 in the arm64 header files
> > though, and propagate the OABI alignment to arm64/ilp32 as well, rather
> > than using the 88-byte version that every other 32-bit architecture
> > except for x86-32 and arm32 has.
>
> Yuri replied that for EABI glibc, sizeof(struct statfs64) is already 88.
> If that's correct and the packing attribute is ignored by glibc, we
> could drop ARCH_PACK_COMPAT_STATFS64 as well (OABI not supported by
> arm64). But I would be slightly worried since glibc is not the only user
> of the kernel ABI.
It looks like glibc has its own definition of 'struct statfs64', which
is incompatible with the one in the kernel headers for ARM EABI.
However, there are other libc implementations besides glibc, and we
can't assume that they all do it the same way, so we clearly have to
keep using the wrapper for ARM EABI. For ARM64/ILP32, we are probably
better off defining it the same way in kernel and libc without that
wrapper.
> For ILP32, I think we can skip defining ARCH_PACK_STATFS64 (of course,
> only if __ILP32__) and state that sizeof(struct statfs64) is 88
> (unpacked). In which case we need the wrappers above to be able to reuse
> the compat_sys_statfs64 code.
>
> > Another option would be to set "#define __statfs_word __u64" and use
> > the 64-bit statfs call, instead of compat_sys_statfs64, but that in turn
> > requires special-casing statfs in libc.
>
> I wouldn't go this route as we kind of agreed that ILP32 should look
> like any other 32-bit ABI.
It's really tricky then: in order to support EABI binaries from a libc
that uses the kernel headers with the OABI compatible definition, we
must not copy the 88 byte structure to user space, because that would
overwrite user space stack data, and that in turn means we have to set
ARCH_PACK_COMPAT_STATFS64, but that in turn prevents us from using the
generic 32-bit syscall ABI for the arm64/ilp32 fstatfs64 call.
It seems that today, put_compat_statfs64() doesn't actually use
the size argument, and it just copies the individual fields, which
is fine either way. This means we could turn around the logic
in the arm32 wrapper, remove ARCH_PACK_COMPAT_STATFS64, and make
the ilp32 code call directly into compat_sys_fstatfs64(), but it
would be a bit fragile, as we rely on put_compat_statfs64() not
actually writing the padding fields that the native do_statfs64()
writes. If someone changed them to both use copy_to_user, we'd
silently introduce data corruption on rarely used libc implementations.
Arnd
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: Catalin Marinas <catalin.marinas@arm.com>
Cc: pinskia@gmail.com, Prasun.Kapoor@caviumnetworks.com,
schwab@suse.de, broonie@kernel.org, Nathan_Lynch@mentor.com,
linux-kernel@vger.kernel.org, agraf@suse.de,
klimov.linux@gmail.com, Yury Norov <ynorov@caviumnetworks.com>,
jan.dakinevich@gmail.com, joseph@codesourcery.com,
ddaney.cavm@gmail.com, bamvor.zhangjian@huawei.com,
philipp.tomsich@theobroma-systems.com,
linux-arm-kernel@lists.infradead.org,
christoph.muellner@theobroma-systems.com
Subject: Re: [PATCH v6 13/20] arm64: ilp32: share aarch32 syscall wrappers to ilp32
Date: Wed, 23 Dec 2015 21:41:54 +0100 [thread overview]
Message-ID: <201512232141.54384.arnd@arndb.de> (raw)
In-Reply-To: <20151223133736.GB28445@e104818-lin.cambridge.arm.com>
On Wednesday 23 December 2015, Catalin Marinas wrote:
> > That means we have to set ARCH_PACK_STATFS64 in the arm64 header files
> > though, and propagate the OABI alignment to arm64/ilp32 as well, rather
> > than using the 88-byte version that every other 32-bit architecture
> > except for x86-32 and arm32 has.
>
> Yuri replied that for EABI glibc, sizeof(struct statfs64) is already 88.
> If that's correct and the packing attribute is ignored by glibc, we
> could drop ARCH_PACK_COMPAT_STATFS64 as well (OABI not supported by
> arm64). But I would be slightly worried since glibc is not the only user
> of the kernel ABI.
It looks like glibc has its own definition of 'struct statfs64', which
is incompatible with the one in the kernel headers for ARM EABI.
However, there are other libc implementations besides glibc, and we
can't assume that they all do it the same way, so we clearly have to
keep using the wrapper for ARM EABI. For ARM64/ILP32, we are probably
better off defining it the same way in kernel and libc without that
wrapper.
> For ILP32, I think we can skip defining ARCH_PACK_STATFS64 (of course,
> only if __ILP32__) and state that sizeof(struct statfs64) is 88
> (unpacked). In which case we need the wrappers above to be able to reuse
> the compat_sys_statfs64 code.
>
> > Another option would be to set "#define __statfs_word __u64" and use
> > the 64-bit statfs call, instead of compat_sys_statfs64, but that in turn
> > requires special-casing statfs in libc.
>
> I wouldn't go this route as we kind of agreed that ILP32 should look
> like any other 32-bit ABI.
It's really tricky then: in order to support EABI binaries from a libc
that uses the kernel headers with the OABI compatible definition, we
must not copy the 88 byte structure to user space, because that would
overwrite user space stack data, and that in turn means we have to set
ARCH_PACK_COMPAT_STATFS64, but that in turn prevents us from using the
generic 32-bit syscall ABI for the arm64/ilp32 fstatfs64 call.
It seems that today, put_compat_statfs64() doesn't actually use
the size argument, and it just copies the individual fields, which
is fine either way. This means we could turn around the logic
in the arm32 wrapper, remove ARCH_PACK_COMPAT_STATFS64, and make
the ilp32 code call directly into compat_sys_fstatfs64(), but it
would be a bit fragile, as we rely on put_compat_statfs64() not
actually writing the padding fields that the native do_statfs64()
writes. If someone changed them to both use copy_to_user, we'd
silently introduce data corruption on rarely used libc implementations.
Arnd
next prev parent reply other threads:[~2015-12-23 20:41 UTC|newest]
Thread overview: 156+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-15 21:42 [RFC3 PATCH v6 00/20] ILP32 for ARM64 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 01/20] arm64: ilp32: add documentation on the ILP32 ABI " Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 02/20] arm64: ensure the kernel is compiled for LP64 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 03/20] arm64: rename COMPAT to AARCH32_EL0 in Kconfig Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-17 11:23 ` Catalin Marinas
2015-12-17 11:23 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 04/20] arm64: change some CONFIG_COMPAT over to use CONFIG_AARCH32_EL0 instead Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-23 14:15 ` Yury Norov
2015-12-23 14:15 ` Yury Norov
2015-12-28 8:43 ` > diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile Bamvor Jian Zhang
2015-12-28 8:43 ` Bamvor Jian Zhang
2015-12-28 9:01 ` [PATCH v6 04/20] arm64: change some CONFIG_COMPAT over to use CONFIG_AARCH32_EL0 instead Zhangjian (Bamvor)
2015-12-28 9:01 ` Zhangjian (Bamvor)
2015-12-29 12:27 ` Yury Norov
2015-12-29 12:27 ` Yury Norov
2015-12-29 14:59 ` [PATCH] arm64: compat: fix wrong dependency Bamvor Jian Zhang
2015-12-29 14:59 ` Bamvor Jian Zhang
2015-12-29 13:12 ` [PATCH v6 04/20] arm64: change some CONFIG_COMPAT over to use CONFIG_AARCH32_EL0 instead Yury Norov
2015-12-29 13:12 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 05/20] arm64:uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 06/20] thread: move thread bits accessors to separated file Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 07/20] arm64: introduce is_a32_task and is_a32_thread (for AArch32 compat) Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-17 11:38 ` Catalin Marinas
2015-12-17 11:38 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 08/20] arm64: ilp32: add is_ilp32_compat_{task, thread} and TIF_32BIT_AARCH64 Yury Norov
2015-12-15 21:42 ` [PATCH v6 08/20] arm64: ilp32: add is_ilp32_compat_{task,thread} " Yury Norov
2015-12-17 11:41 ` [PATCH v6 08/20] arm64: ilp32: add is_ilp32_compat_{task, thread} " Catalin Marinas
2015-12-17 11:41 ` Catalin Marinas
2015-12-18 14:11 ` Yury Norov
2015-12-18 14:11 ` Yury Norov
2015-12-18 14:44 ` Yury Norov
2015-12-18 14:44 ` Yury Norov
2015-12-21 17:42 ` Catalin Marinas
2015-12-21 17:42 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 09/20] arm64:ilp32: share HWCAP between LP64 and ILP32 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-16 15:54 ` Arnd Bergmann
2015-12-16 15:54 ` Arnd Bergmann
2015-12-16 16:58 ` Catalin Marinas
2015-12-16 16:58 ` Catalin Marinas
2015-12-16 17:19 ` Catalin Marinas
2015-12-16 17:19 ` Catalin Marinas
2015-12-16 19:17 ` Arnd Bergmann
2015-12-16 19:17 ` Arnd Bergmann
2015-12-17 10:54 ` Catalin Marinas
2015-12-17 10:54 ` Catalin Marinas
2015-12-17 13:56 ` Arnd Bergmann
2015-12-17 13:56 ` Arnd Bergmann
2015-12-15 21:42 ` [PATCH v6 10/20] arm64:ilp32 use the native LP64 'start_thread' for ILP32 threads Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-16 15:50 ` Arnd Bergmann
2015-12-16 15:50 ` Arnd Bergmann
2015-12-18 13:57 ` Yury Norov
2015-12-18 13:57 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 11/20] arm64:ilp32: support core dump generation for ILP32 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-17 14:05 ` Catalin Marinas
2015-12-17 14:05 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 12/20] arm64:ilp32: add sys_ilp32.c and a separate table (in entry.S) to use it Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-16 16:07 ` Arnd Bergmann
2015-12-16 16:07 ` Arnd Bergmann
2015-12-17 18:27 ` Catalin Marinas
2015-12-17 18:27 ` Catalin Marinas
2015-12-17 20:10 ` Arnd Bergmann
2015-12-17 20:10 ` Arnd Bergmann
2015-12-17 20:14 ` Andrew Pinski
2015-12-17 20:14 ` Andrew Pinski
2015-12-17 20:50 ` Arnd Bergmann
2015-12-17 20:50 ` Arnd Bergmann
2016-01-05 15:26 ` Yury Norov
2016-01-05 15:26 ` Yury Norov
2016-01-05 21:12 ` Arnd Bergmann
2016-01-05 21:12 ` Arnd Bergmann
2016-01-06 17:10 ` Catalin Marinas
2016-01-06 17:10 ` Catalin Marinas
2016-01-07 14:13 ` Arnd Bergmann
2016-01-07 14:13 ` Arnd Bergmann
2016-01-07 15:42 ` Yury Norov
2016-01-07 15:42 ` Yury Norov
2016-01-07 17:23 ` Catalin Marinas
2016-01-07 17:23 ` Catalin Marinas
2015-12-18 11:42 ` Catalin Marinas
2015-12-18 11:42 ` Catalin Marinas
2015-12-18 12:47 ` Arnd Bergmann
2015-12-18 12:47 ` Arnd Bergmann
2015-12-21 18:31 ` Catalin Marinas
2015-12-21 18:31 ` Catalin Marinas
2015-12-21 22:19 ` Arnd Bergmann
2015-12-21 22:19 ` Arnd Bergmann
2015-12-21 18:39 ` Dr. Philipp Tomsich
2015-12-21 18:39 ` Dr. Philipp Tomsich
2015-12-21 22:13 ` Arnd Bergmann
2015-12-21 22:13 ` Arnd Bergmann
2015-12-21 22:31 ` Arnd Bergmann
2015-12-21 22:31 ` Arnd Bergmann
2015-12-23 18:31 ` Yury Norov
2015-12-23 18:31 ` Yury Norov
2015-12-23 21:48 ` Arnd Bergmann
2015-12-23 21:48 ` Arnd Bergmann
2015-12-15 21:42 ` [PATCH v6 13/20] arm64: ilp32: share aarch32 syscall wrappers to ilp32 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-17 14:38 ` Andreas Schwab
2015-12-17 14:38 ` Andreas Schwab
2015-12-18 13:49 ` Yury Norov
2015-12-18 13:49 ` Yury Norov
2015-12-22 12:25 ` Catalin Marinas
2015-12-22 12:25 ` Catalin Marinas
2015-12-22 21:44 ` Arnd Bergmann
2015-12-22 21:44 ` Arnd Bergmann
2015-12-23 13:37 ` Catalin Marinas
2015-12-23 13:37 ` Catalin Marinas
2015-12-23 20:41 ` Arnd Bergmann [this message]
2015-12-23 20:41 ` Arnd Bergmann
2015-12-30 17:29 ` Yury Norov
2015-12-30 17:29 ` Yury Norov
2015-12-30 22:36 ` Arnd Bergmann
2015-12-30 22:36 ` Arnd Bergmann
2015-12-23 4:21 ` Yury Norov
2015-12-23 4:21 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 14/20] arm64: signal: wrap struct ucontext, fp and lr with struct sigframe Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 15/20] arm64: signal: move ilp32 and lp64 common code to separated file Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-16 16:08 ` Arnd Bergmann
2015-12-16 16:08 ` Arnd Bergmann
2015-12-18 13:48 ` Yury Norov
2015-12-18 13:48 ` Yury Norov
2015-12-18 14:09 ` Arnd Bergmann
2015-12-18 14:09 ` Arnd Bergmann
2015-12-22 17:11 ` Catalin Marinas
2015-12-22 17:11 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 16/20] arm64: signal32: move ilp32 and aarch32 " Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-22 14:29 ` Catalin Marinas
2015-12-22 14:29 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 17/20] arm64: ilp32: introduce ilp32-specific handlers for sigframe Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-22 17:08 ` Catalin Marinas
2015-12-22 17:08 ` Catalin Marinas
2015-12-15 21:42 ` [PATCH v6 18/20] arm64:ilp32: add vdso-ilp32 and use for signal return Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 19/20] arm64:ilp32: change COMPAT_ELF_PLATFORM to report a a subplatform for ILP32 Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-15 21:42 ` [PATCH v6 20/20] arm64:ilp32: add ARM64_ILP32 to Kconfig Yury Norov
2015-12-15 21:42 ` Yury Norov
2015-12-16 16:24 ` [RFC3 PATCH v6 00/20] ILP32 for ARM64 Arnd Bergmann
2015-12-16 16:24 ` Arnd Bergmann
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=201512232141.54384.arnd@arndb.de \
--to=arnd@arndb.de \
--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.