 1cdde19109
			
		
	
	
	1cdde19109
	
	
	
		
			
			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 742fa54a62
  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>
		
	
			
		
			
				
	
	
		
			204 lines
		
	
	
	
		
			4.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
	
		
			4.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ASM_X86_SIGCONTEXT_H
 | |
| #define _ASM_X86_SIGCONTEXT_H
 | |
| 
 | |
| #include <linux/compiler.h>
 | |
| #include <asm/types.h>
 | |
| 
 | |
| #ifdef __i386__
 | |
| /*
 | |
|  * As documented in the iBCS2 standard..
 | |
|  *
 | |
|  * The first part of "struct _fpstate" is just the normal i387
 | |
|  * hardware setup, the extra "status" word is used to save the
 | |
|  * coprocessor status word before entering the handler.
 | |
|  *
 | |
|  * Pentium III FXSR, SSE support
 | |
|  *	Gareth Hughes <gareth@valinux.com>, May 2000
 | |
|  *
 | |
|  * The FPU state data structure has had to grow to accommodate the
 | |
|  * extended FPU state required by the Streaming SIMD Extensions.
 | |
|  * There is no documented standard to accomplish this at the moment.
 | |
|  */
 | |
| struct _fpreg {
 | |
| 	unsigned short significand[4];
 | |
| 	unsigned short exponent;
 | |
| };
 | |
| 
 | |
| struct _fpxreg {
 | |
| 	unsigned short significand[4];
 | |
| 	unsigned short exponent;
 | |
| 	unsigned short padding[3];
 | |
| };
 | |
| 
 | |
| struct _xmmreg {
 | |
| 	unsigned long element[4];
 | |
| };
 | |
| 
 | |
| struct _fpstate {
 | |
| 	/* Regular FPU environment */
 | |
| 	unsigned long	cw;
 | |
| 	unsigned long	sw;
 | |
| 	unsigned long	tag;
 | |
| 	unsigned long	ipoff;
 | |
| 	unsigned long	cssel;
 | |
| 	unsigned long	dataoff;
 | |
| 	unsigned long	datasel;
 | |
| 	struct _fpreg	_st[8];
 | |
| 	unsigned short	status;
 | |
| 	unsigned short	magic;		/* 0xffff = regular FPU data only */
 | |
| 
 | |
| 	/* FXSR FPU environment */
 | |
| 	unsigned long	_fxsr_env[6];	/* FXSR FPU env is ignored */
 | |
| 	unsigned long	mxcsr;
 | |
| 	unsigned long	reserved;
 | |
| 	struct _fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
 | |
| 	struct _xmmreg	_xmm[8];
 | |
| 	unsigned long	padding[56];
 | |
| };
 | |
| 
 | |
| #define X86_FXSR_MAGIC		0x0000
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| struct sigcontext {
 | |
| 	unsigned short gs, __gsh;
 | |
| 	unsigned short fs, __fsh;
 | |
| 	unsigned short es, __esh;
 | |
| 	unsigned short ds, __dsh;
 | |
| 	unsigned long di;
 | |
| 	unsigned long si;
 | |
| 	unsigned long bp;
 | |
| 	unsigned long sp;
 | |
| 	unsigned long bx;
 | |
| 	unsigned long dx;
 | |
| 	unsigned long cx;
 | |
| 	unsigned long ax;
 | |
| 	unsigned long trapno;
 | |
| 	unsigned long err;
 | |
| 	unsigned long ip;
 | |
| 	unsigned short cs, __csh;
 | |
| 	unsigned long flags;
 | |
| 	unsigned long sp_at_signal;
 | |
| 	unsigned short ss, __ssh;
 | |
| 	struct _fpstate __user * fpstate;
 | |
| 	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__ */
 | |
| 
 | |
| /* FXSAVE frame */
 | |
| /* Note: reserved1/2 may someday contain valuable data. Always save/restore
 | |
|    them when you change signal frames. */
 | |
| struct _fpstate {
 | |
| 	__u16	cwd;
 | |
| 	__u16	swd;
 | |
| 	__u16	twd;	/* Note this is not the same as the 32bit/x87/FSAVE twd */
 | |
| 	__u16	fop;
 | |
| 	__u64	rip;
 | |
| 	__u64	rdp;
 | |
| 	__u32	mxcsr;
 | |
| 	__u32	mxcsr_mask;
 | |
| 	__u32	st_space[32];	/* 8*16 bytes for each FP-reg */
 | |
| 	__u32	xmm_space[64];	/* 16*16 bytes for each XMM-reg  */
 | |
| 	__u32	reserved2[24];
 | |
| };
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| 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 di;
 | |
| 	unsigned long si;
 | |
| 	unsigned long bp;
 | |
| 	unsigned long bx;
 | |
| 	unsigned long dx;
 | |
| 	unsigned long ax;
 | |
| 	unsigned long cx;
 | |
| 	unsigned long sp;
 | |
| 	unsigned long ip;
 | |
| 	unsigned long flags;
 | |
| 	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];
 | |
| };
 | |
| #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__ */
 | |
| 
 | |
| #endif
 |