svn commit: trunk/uClibc/libc/sysdeps/linux/mips: bits sys

vapier at uclibc.org vapier at uclibc.org
Mon Feb 12 18:34:58 UTC 2007


Author: vapier
Date: 2007-02-12 10:34:57 -0800 (Mon, 12 Feb 2007)
New Revision: 17867

Log:
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.


Added:
   trunk/uClibc/libc/sysdeps/linux/mips/bits/sigcontext.h

Modified:
   trunk/uClibc/libc/sysdeps/linux/mips/sys/ucontext.h


Changeset:
Added: trunk/uClibc/libc/sysdeps/linux/mips/bits/sigcontext.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/mips/bits/sigcontext.h	                        (rev 0)
+++ trunk/uClibc/libc/sysdeps/linux/mips/bits/sigcontext.h	2007-02-12 18:34:57 UTC (rev 17867)
@@ -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

Modified: trunk/uClibc/libc/sysdeps/linux/mips/sys/ucontext.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/mips/sys/ucontext.h	2007-02-12 17:42:18 UTC (rev 17866)
+++ trunk/uClibc/libc/sysdeps/linux/mips/sys/ucontext.h	2007-02-12 18:34:57 UTC (rev 17867)
@@ -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
-};
+/* 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;
 
-/* Structure to describe FPU registers.  */
-typedef struct fpregset
-{
-  union
+
+/* 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
   {
-#if _MIPS_SIM == _MIPS_SIM_ABI32
-    double fp_dregs[16];
-    float fp_fregs[32];
-    unsigned int fp_regs[32];
+    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
-    double fp_dregs[32];
-    /* float fp_fregs[32]; */
-    __uint64_t fp_regs[32];
+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
-  } fp_r;
-  unsigned int fp_csr;
-  unsigned int fp_pad;
-} fpregset_t;
 
-/* Context to describe whole processor state.  */
-typedef struct
-{
-  gregset_t gpregs;
-  fpregset_t fpregs;
-} mcontext_t;
-
 /* 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 */




More information about the uClibc-cvs mailing list