[PATCH 00/15] x86/headers: Clean up sigcontext types and headers

From: Ingo Molnar
Date: Sat Sep 05 2015 - 03:33:21 EST


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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/