Messages in this thread | | | From | Ingo Molnar <> | Subject | [PATCH 00/15] x86/headers: Clean up sigcontext types and headers | Date | Sat, 5 Sep 2015 09:32:28 +0200 |
| |
So Mikko Rapeli reported that sigcontext32.h does not build standalone, and while trying to fix it I came up with this series that cleans up all sorts of details and makes the sigcontext types (hopefully) much more maintainable.
Before this series we had a somewhat messy duplication that resulted in 3 type definitions (repeated for both sigcontext and for various FPU state structures):
- native 32-bit types (only available on 32-bit kernels) - native 64-bit types (only available on 64-bit kernels) - compat 32-bit types (only available on 64-bit kernels) - wrappers defining _32 named variants of these types
... while in reality our compat 32-bit ABI structures are the same as the native 32-bit ABI structures.
So after the series there's a clear, bitness independent definition of all the relevant types:
struct sigcontext_32 (available on all kernels) struct sigcontext_64 (available on all kernels)
struct _fpstate_32 (available on all kernels) struct _fpstate_64 (available on all kernels)
and the kernel bitness dependent 'struct sigcontext' and 'struct _fpstate' structures are then mapped to their respective types, depending on bitness.
Modern user-space can start using these cleaner types. (If they want to: all old names are kept as well).
I have also extended/harmonized all the disjunct (and often hard to read) comments in the various structure definitions. The patches add a lot of new comments, this is why the diffstat shows only a modest line count reduction:
13 files changed, 324 insertions(+), 338 deletions(-)
Another effect of the series is that sigcontext32.h is gone (only a wrapper to sigcontext.h is kept, in case existing user-space relies on the header), and the kernel side asm/sigcontext.h file is gone as well. This should solve the original build failure reported by Mikko Rapeli.
All legacy names are still kept to make sure we don't break user-space builds, and are collected at the end of the file, without confusing people who'd only like to read the file to understand the kernel side code.
The various _ia32 names are mostly gone as well from the kernel side, compatibility wrappers are kept for the user-space side.
There's one new type quirk in patch 11, which is the result of having unified C code operating on a 32-bit pointer field both from 64-bit kernel and from a native 32-bit kernel:
int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) { + unsigned long buf_val;
- get_user_ex(buf, &sc->fpstate); + get_user_ex(buf_val, &sc->fpstate); + buf = (void __user *)buf_val;
this is the cleanest I could structure it. If this is the only quirk then I think the advantages outweigh the ugliness - BYMMV.
So in general this is how I imagine our model should be to define ABIs going forward.
Comments, suggestions are welcome!
Ingo
============================> Ingo Molnar (15): x86/headers: Fix (old) header file dependency bug in uapi/asm/sigcontext32.h x86/headers: Clean up uapi/asm/sigcontext32.h x86/headers: Clean up and better document uapi/asm/sigcontext.h x86/headers: Separate out legacy user-space structure definitions x86/headers: Use ABI types consistently in sigcontext*.h x86/headers: Unify register type definitions between 32-bit compat and i386 x86/headers: Unify 'struct _fpstate_ia32' and i386 struct _fpstate x86/headers: Convert uses of _fpstate_ia32 to _fpstate_32 x86/headers: Clean up the kernel's struct sigcontext types to be ABI-clean x86/headers: Move the 'struct sigcontext' definitions into the UAPI header x86/headers: Make sigcontext pointers bit independent x86/headers: Unify 'struct sigcontext_ia32' and 'struct sigcontext_32' x86/headers: Convert sigcontext_ia32 uses to sigcontext_32 x86/headers: Remove direct sigcontext32.h uses x86/headers: Remove <asm/sigcontext.h>
arch/x86/ia32/ia32_signal.c | 8 +- arch/x86/include/asm/fpu/signal.h | 2 +- arch/x86/include/asm/ia32.h | 4 +- arch/x86/include/asm/processor.h | 2 +- arch/x86/include/asm/sigcontext.h | 79 ------ arch/x86/include/asm/sigframe.h | 8 +- arch/x86/include/asm/signal.h | 2 +- arch/x86/include/uapi/asm/sigcontext.h | 456 ++++++++++++++++++++----------- arch/x86/include/uapi/asm/sigcontext32.h | 73 +---- arch/x86/kernel/asm-offsets.c | 18 +- arch/x86/kernel/fpu/signal.c | 4 +- arch/x86/kernel/signal.c | 4 +- arch/x86/math-emu/fpu_emu.h | 2 +- 13 files changed, 324 insertions(+), 338 deletions(-) delete mode 100644 arch/x86/include/asm/sigcontext.h
-- 2.1.4
| |