diff options
Diffstat (limited to 'libc/sysdeps/linux')
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/sigcontext.h | 84 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/sys/ucontext.h | 201 | 
2 files changed, 164 insertions, 121 deletions
diff --git a/libc/sysdeps/linux/mips/bits/sigcontext.h b/libc/sysdeps/linux/mips/bits/sigcontext.h new file mode 100644 index 000000000..99faeed39 --- /dev/null +++ b/libc/sysdeps/linux/mips/bits/sigcontext.h @@ -0,0 +1,84 @@ +/* Copyright (C) 1996, 1997, 1998, 2003, 2004, 2006 Free Software +   Foundation, Inc.  This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#ifndef _BITS_SIGCONTEXT_H +#define _BITS_SIGCONTEXT_H 1 + +#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H +# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." +#endif + +#include <sgidefs.h> + +#if _MIPS_SIM == _ABIO32 + +/* Certain unused fields were replaced with new ones in 2.6.12-rc4. +   The changes were as follows: + +   sc_cause -> sc_hi1 +   sc_badvaddr -> sc_lo1 +   sc_sigset[0] -> sc_hi2 +   sc_sigset[1] -> sc_lo2 +   sc_sigset[2] -> sc_hi3 +   sc_sigset[3] -> sc_lo3 + +   sc_regmask, sc_ownedfp and sc_fpc_eir are not used.  */ +struct sigcontext { +  unsigned int sc_regmask; +  unsigned int sc_status; +  unsigned long long sc_pc; +  unsigned long long sc_regs[32]; +  unsigned long long sc_fpregs[32]; +  unsigned int sc_ownedfp; +  unsigned int sc_fpc_csr; +  unsigned int sc_fpc_eir; +  unsigned int sc_used_math; +  unsigned int sc_dsp; +  unsigned long long sc_mdhi; +  unsigned long long sc_mdlo; +  unsigned long sc_hi1; +  unsigned long sc_lo1; +  unsigned long sc_hi2; +  unsigned long sc_lo2; +  unsigned long sc_hi3; +  unsigned long sc_lo3; +}; + +#else + +/* This structure changed in 2.6.12-rc4 when DSP support was added.  */ +struct sigcontext { +  unsigned long long sc_regs[32]; +  unsigned long long sc_fpregs[32]; +  unsigned long long sc_mdhi; +  unsigned long long sc_hi1; +  unsigned long long sc_hi2; +  unsigned long long sc_hi3; +  unsigned long long sc_mdlo; +  unsigned long long sc_lo1; +  unsigned long long sc_lo2; +  unsigned long long sc_lo3; +  unsigned long long sc_pc; +  unsigned int sc_fpc_csr; +  unsigned int sc_used_math; +  unsigned int sc_dsp; +  unsigned int sc_reserved; +}; + +#endif /* _MIPS_SIM != _ABIO32 */ +#endif diff --git a/libc/sysdeps/linux/mips/sys/ucontext.h b/libc/sysdeps/linux/mips/sys/ucontext.h index 90aa09a80..ac496f3d6 100644 --- a/libc/sysdeps/linux/mips/sys/ucontext.h +++ b/libc/sysdeps/linux/mips/sys/ucontext.h @@ -1,5 +1,5 @@ -/* Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +/* Copyright (C) 1997, 1998, 2000, 2003, 2004, 2006 Free Software +   Foundation, Inc.  This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -16,143 +16,102 @@     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA     02111-1307 USA.  */ -/* System V/mips ABI compliant context switching support.  */ - +/* Don't rely on this, the interface is currently messed up and may need to +   be broken to be fixed.  */  #ifndef _SYS_UCONTEXT_H  #define _SYS_UCONTEXT_H	1  #include <features.h> +#include <sgidefs.h>  #include <signal.h> -/* Type for general register.  */ -#if _MIPS_SIM == _MIPS_SIM_ABI32 -typedef __uint32_t greg_t; -#else -typedef __uint64_t greg_t; -#endif +/* We need the signal context definitions even if they are not used +   included in <signal.h>.  */ +#include <bits/sigcontext.h> + +/* Type for general register.  Even in o32 we assume 64-bit registers, +   like the kernel.  */ +__extension__ typedef unsigned long long int greg_t;  /* Number of general registers.  */ -#define NGREG	36 +#define NGREG	32 +#define NFPREG	32  /* Container for all general registers.  */  typedef greg_t gregset_t[NGREG]; -/* Number of each register is the `gregset_t' array.  */ -enum -{ -  CTX_R0 = 0, -#define CTX_R0	CTX_R0 -  CTX_AT = 1, -#define CTX_AT	CTX_AT -  CTX_V0 = 2, -#define CTX_V0	CTX_V0 -  CTX_V1 = 3, -#define CTX_V1	CTX_V1 -  CTX_A0 = 4, -#define CTX_A0	CTX_A0 -  CTX_A1 = 5, -#define CTX_A1	CTX_A1 -  CTX_A2 = 6, -#define CTX_A2	CTX_A2 -  CTX_A3 = 7, -#define CTX_A3	CTX_A3 -  CTX_T0 = 8, -#define CTX_T0	CTX_T0 -  CTX_T1 = 9, -#define CTX_T1	CTX_T1 -  CTX_T2 = 10, -#define CTX_T2	CTX_T2 -  CTX_T3 = 11, -#define CTX_T3	CTX_T3 -  CTX_T4 = 12, -#define CTX_T4	CTX_T4 -  CTX_T5 = 13, -#define CTX_T5	CTX_T5 -  CTX_T6 = 14, -#define CTX_T6	CTX_T6 -  CTX_T7 = 15, -#define CTX_T7	CTX_T7 -  CTX_S0 = 16, -#define CTX_S0	CTX_S0 -  CTX_S1 = 17, -#define CTX_S1	CTX_S1 -  CTX_S2 = 18, -#define CTX_S2	CTX_S2 -  CTX_S3 = 19, -#define CTX_S3	CTX_S3 -  CTX_S4 = 20, -#define CTX_S4	CTX_S4 -  CTX_S5 = 21, -#define CTX_S5	CTX_S5 -  CTX_S6 = 22, -#define CTX_S6	CTX_S6 -  CTX_S7 = 23, -#define CTX_S7	CTX_S7 -  CTX_T8 = 24, -#define CTX_T8	CTX_T8 -  CTX_T9 = 25, -#define CTX_T9	CTX_T9 -  CTX_K0 = 26, -#define CTX_K0	CTX_K0 -  CTX_K1 = 27, -#define CTX_K1	CTX_K1 -  CTX_GP = 28, -#define CTX_GP	CTX_GP -  CTX_SP = 29, -#define CTX_SP	CTX_SP -  CTX_S8 = 30, -#define CTX_S8	CTX_S8 -  CTX_RA = 31, -#define CTX_RA	CTX_RA -  CTX_MDLO = 32, -#define CTX_MDLO	CTX_MDLO -  CTX_MDHI = 33, -#define CTX_MDHI	CTX_MDHI -  CTX_CAUSE = 34, -#define CTX_CAUSE	CTX_CAUSE -  CTX_EPC = 35, -#define CTX_EPC	CTX_EPC -}; - -/* Structure to describe FPU registers.  */ -typedef struct fpregset -{ -  union -  { -#if _MIPS_SIM == _MIPS_SIM_ABI32 -    double fp_dregs[16]; -    float fp_fregs[32]; -    unsigned int fp_regs[32]; -#else -    double fp_dregs[32]; -    /* float fp_fregs[32]; */ -    __uint64_t fp_regs[32]; -#endif -  } fp_r; -  unsigned int fp_csr; -  unsigned int fp_pad; +/* Container for all FPU registers.  */ +typedef struct fpregset { +	union { +		double	fp_dregs[NFPREG]; +		struct { +			float		_fp_fregs; +			unsigned int	_fp_pad; +		} fp_fregs[NFPREG]; +	} fp_r;  } fpregset_t; +  /* Context to describe whole processor state.  */ +#if _MIPS_SIM == _ABIO32 +/* Earlier versions of glibc for mips had an entirely different +   definition of mcontext_t, that didn't even resemble the +   corresponding kernel data structure.  Since all legitimate uses of +   ucontext_t in glibc mustn't have accessed anything beyond +   uc_mcontext and, even then, taking a pointer to it, casting it to +   sigcontext_t, and accessing it as such, which is what it has always +   been, this can still be rectified.  Fortunately, makecontext, +   [gs]etcontext et all have never been implemented.  */  typedef struct -{ -  gregset_t gpregs; -  fpregset_t fpregs; -} mcontext_t; +  { +    unsigned int regmask; +    unsigned int status; +    greg_t pc; +    gregset_t gregs; +    fpregset_t fpregs; +    unsigned int fp_owned; +    unsigned int fpc_csr; +    unsigned int fpc_eir; +    unsigned int used_math; +    unsigned int dsp; +    greg_t mdhi; +    greg_t mdlo; +    unsigned long hi1; +    unsigned long lo1; +    unsigned long hi2; +    unsigned long lo2; +    unsigned long hi3; +    unsigned long lo3; +  } mcontext_t; +#else +typedef struct +  { +    gregset_t gregs; +    fpregset_t fpregs; +    greg_t mdhi; +    greg_t hi1; +    greg_t hi2; +    greg_t hi3; +    greg_t mdlo; +    greg_t lo1; +    greg_t lo2; +    greg_t lo3; +    greg_t pc; +    unsigned int fpc_csr; +    unsigned int used_math; +    unsigned int dsp; +    unsigned int reserved; +  } mcontext_t; +#endif  /* Userlevel context.  */  typedef struct ucontext -{ -#if _MIPS_SIM == _MIPS_SIM_ABI32 -  unsigned long int uc_flags; -#else -  __uint64_t uc_flags; -#endif -  struct ucontext *uc_link; -  __sigset_t uc_sigmask; -  stack_t uc_stack; -  mcontext_t uc_mcontext; -  int uc_filler[48]; -} ucontext_t; +  { +    unsigned long int uc_flags; +    struct ucontext *uc_link; +    stack_t uc_stack; +    mcontext_t uc_mcontext; +    __sigset_t uc_sigmask; +  } ucontext_t;  #endif /* sys/ucontext.h */  | 
