summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2007-02-12 18:34:57 +0000
committerMike Frysinger <vapier@gentoo.org>2007-02-12 18:34:57 +0000
commit216bfd092c46dc0479e571a37fd2fd96e47605b5 (patch)
tree5bbffacf54548c1ec88312faedccb3e074869f02
parent7e4add25abbe7f82989d156a5259b4eef08ba3be (diff)
Atsushi Nemoto writes:
Current ucontext_t does not match with kernel's definition. Also, on N32 ABI, we can not use kernel's struct sigcontext since kernel's sizeof(long) and user's sizeof(long) is differ. For both data structure, just importing header files from recent glibc fixes the mismatch. So here is a patch importing sys/ucontext.h and bits/sigcontext.t from glibc-2.5.
-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 */