LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* asm-x86/sigcontext.h changes break userland
@ 2008-02-13  0:15 Jakub Jelinek
  2008-02-13  7:26 ` Ingo Molnar
  0 siblings, 1 reply; 3+ messages in thread
From: Jakub Jelinek @ 2008-02-13  0:15 UTC (permalink / raw)
  To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Ulrich Drepper; +Cc: linux-kernel

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: asm-x86/sigcontext.h changes break userland
  2008-02-13  0:15 asm-x86/sigcontext.h changes break userland Jakub Jelinek
@ 2008-02-13  7:26 ` Ingo Molnar
  2008-02-13 12:49   ` Jakub Jelinek
  0 siblings, 1 reply; 3+ messages in thread
From: Ingo Molnar @ 2008-02-13  7:26 UTC (permalink / raw)
  To: Jakub Jelinek
  Cc: Thomas Gleixner, H. Peter Anvin, Ulrich Drepper, linux-kernel


* Jakub Jelinek <jakub@redhat.com> 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 <mingo@elte.hu>

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 <hpa@zytor.com>
  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 <jakub@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 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__ */
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: asm-x86/sigcontext.h changes break userland
  2008-02-13  7:26 ` Ingo Molnar
@ 2008-02-13 12:49   ` Jakub Jelinek
  0 siblings, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2008-02-13 12:49 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Thomas Gleixner, H. Peter Anvin, Ulrich Drepper, linux-kernel

On Wed, Feb 13, 2008 at 08:26:50AM +0100, Ingo Molnar wrote:
> 
> * Jakub Jelinek <jakub@redhat.com> 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-02-13 12:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-13  0:15 asm-x86/sigcontext.h changes break userland Jakub Jelinek
2008-02-13  7:26 ` Ingo Molnar
2008-02-13 12:49   ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).