summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/sysdeps/linux/mips/bits/sigcontext.h84
-rw-r--r--libc/sysdeps/linux/mips/sys/ucontext.h201
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 */