2008-02-13 00:15:59

by Jakub Jelinek

[permalink] [raw]
Subject: asm-x86/sigcontext.h changes break userland

Hi!

The

x86: use generic register names in struct sigcontext
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=742fa54a62be6a263df14a553bf832724471dfbe

changeset breaks userland, e.g. it is not possible to compile gcc anymore
(both 32-bit and 64-bit libgcc), and I expect any other program which pokes
into struct sigcontext. The register names with e resp. r have been in use
for years, what's the point breaking it now?

Jakub


2008-02-13 07:27:20

by Ingo Molnar

[permalink] [raw]
Subject: Re: asm-x86/sigcontext.h changes break userland


* Jakub Jelinek <[email protected]> wrote:

> x86: use generic register names in struct sigcontext
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=742fa54a62be6a263df14a553bf832724471dfbe
>
> changeset breaks userland, e.g. it is not possible to compile gcc
> anymore (both 32-bit and 64-bit libgcc), and I expect any other
> program which pokes into struct sigcontext. The register names with e
> resp. r have been in use for years, what's the point breaking it now?

ok - does the patch below solve the problem for you?

Ingo

------------>
Subject: x86: fix sigcontext.h user export
From: Ingo Molnar <[email protected]>

Jakub Jelinek reported that some user-space code that relies on
kernel headers has built dependency on the sigcontext->eip/rip
register names - which have been unified in commit:

commit 742fa54a62be6a263df14a553bf832724471dfbe
Author: H. Peter Anvin <[email protected]>
Date: Wed Jan 30 13:30:56 2008 +0100

x86: use generic register names in struct sigcontext

so give the old layout to user-space. This is not particularly
pretty, but it's an ABI so there's no danger of the two definitions
getting out of sync.

Reported-by: Jakub Jelinek <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
---
include/asm-x86/sigcontext.h | 66 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)

Index: linux/include/asm-x86/sigcontext.h
===================================================================
--- linux.orig/include/asm-x86/sigcontext.h
+++ linux/include/asm-x86/sigcontext.h
@@ -58,6 +58,7 @@ struct _fpstate {

#define X86_FXSR_MAGIC 0x0000

+#ifdef __KERNEL__
struct sigcontext {
unsigned short gs, __gsh;
unsigned short fs, __fsh;
@@ -82,6 +83,35 @@ struct sigcontext {
unsigned long oldmask;
unsigned long cr2;
};
+#else /* __KERNEL__ */
+/*
+ * User-space might still rely on the old definition:
+ */
+struct sigcontext {
+ unsigned short gs, __gsh;
+ unsigned short fs, __fsh;
+ unsigned short es, __esh;
+ unsigned short ds, __dsh;
+ unsigned long edi;
+ unsigned long esi;
+ unsigned long ebp;
+ unsigned long esp;
+ unsigned long ebx;
+ unsigned long edx;
+ unsigned long ecx;
+ unsigned long eax;
+ unsigned long trapno;
+ unsigned long err;
+ unsigned long eip;
+ unsigned short cs, __csh;
+ unsigned long eflags;
+ unsigned long esp_at_signal;
+ unsigned short ss, __ssh;
+ struct _fpstate __user * fpstate;
+ unsigned long oldmask;
+ unsigned long cr2;
+};
+#endif /* !__KERNEL__ */

#else /* __i386__ */

@@ -102,6 +132,7 @@ struct _fpstate {
__u32 reserved2[24];
};

+#ifdef __KERNEL__
struct sigcontext {
unsigned long r8;
unsigned long r9;
@@ -132,6 +163,41 @@ struct sigcontext {
struct _fpstate __user *fpstate; /* zero when no FPU context */
unsigned long reserved1[8];
};
+#else /* __KERNEL__ */
+/*
+ * User-space might still rely on the old definition:
+ */
+struct sigcontext {
+ unsigned long r8;
+ unsigned long r9;
+ unsigned long r10;
+ unsigned long r11;
+ unsigned long r12;
+ unsigned long r13;
+ unsigned long r14;
+ unsigned long r15;
+ unsigned long rdi;
+ unsigned long rsi;
+ unsigned long rbp;
+ unsigned long rbx;
+ unsigned long rdx;
+ unsigned long rax;
+ unsigned long rcx;
+ unsigned long rsp;
+ unsigned long rip;
+ unsigned long eflags; /* RFLAGS */
+ unsigned short cs;
+ unsigned short gs;
+ unsigned short fs;
+ unsigned short __pad0;
+ unsigned long err;
+ unsigned long trapno;
+ unsigned long oldmask;
+ unsigned long cr2;
+ struct _fpstate __user *fpstate; /* zero when no FPU context */
+ unsigned long reserved1[8];
+};
+#endif /* !__KERNEL__ */

#endif /* !__i386__ */

2008-02-13 12:49:51

by Jakub Jelinek

[permalink] [raw]
Subject: Re: asm-x86/sigcontext.h changes break userland

On Wed, Feb 13, 2008 at 08:26:50AM +0100, Ingo Molnar wrote:
>
> * Jakub Jelinek <[email protected]> wrote:
>
> > x86: use generic register names in struct sigcontext
> > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=742fa54a62be6a263df14a553bf832724471dfbe
> >
> > changeset breaks userland, e.g. it is not possible to compile gcc
> > anymore (both 32-bit and 64-bit libgcc), and I expect any other
> > program which pokes into struct sigcontext. The register names with e
> > resp. r have been in use for years, what's the point breaking it now?
>
> ok - does the patch below solve the problem for you?

Yes, this fixes it. Thanks.

FYI, gcc uses glibc headers to get at struct sigcontext, but
on i386 (and many other arches) glibc's <bits/sigcontext.h> just includes
<asm/sigcontext.h>. On x86_64, ia64 and sparc* glibc doesn't include
asm/sigcontext.h, but provides its own definitions, so for gcc itself
only changing 32-bit parts woiuld be enough. That said, there are certainly
programs which include asm/sigcontext.h directly (plus there are other c
libraries, some of which may use asm/sigcontext.h).

Jakub