about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/ioctls.h1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/termios.h22
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/brk.c15
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/socket.S13
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h172
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S2
6 files changed, 192 insertions, 33 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
index 1a8d5f6f81..b0759ef297 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
@@ -22,7 +22,6 @@
 
 /* Use the definitions from the kernel header files.  */
 #include <asm/ioctls.h>
-#include <kernel_termios.h>
 
 /* Oh well, this is necessary since the kernel data structure is
    different from the user-level version.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/termios.h b/sysdeps/unix/sysv/linux/sparc/bits/termios.h
index c797f49a84..9b2cd48a1a 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/termios.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/termios.h
@@ -47,11 +47,8 @@ struct termios
 #define VSWTC    7
 #define VSTART   8
 #define VSTOP    9
-
-
-
 #define VSUSP    10
-#define VDSUSP   11  /* SunOS POSIX nicety I do believe... */
+#define VDSUSP   11		/* SunOS POSIX nicety I do believe... */
 #define VREPRINT 12
 #define VDISCARD 13
 #define VWERASE  14
@@ -109,12 +106,12 @@ struct termios
 #define FFDLY	0x00008000
 #define   FF0	0x00000000
 #define   FF1	0x00008000
-#define PAGEOUT 0x00010000  /* SUNOS specific */
-#define WRAP    0x00020000  /* SUNOS specific */
+#define PAGEOUT 0x00010000	/* SUNOS specific */
+#define WRAP    0x00020000	/* SUNOS specific */
 
 /* c_cflag bit meaning */
-#define CBAUD	0x0000000f
-#define  B0	0x00000000   /* hang up */
+#define CBAUD	0x0000100f
+#define  B0	0x00000000	/* hang up */
 #define  B50	0x00000001
 #define  B75	0x00000002
 #define  B110	0x00000003
@@ -143,15 +140,14 @@ struct termios
 #define PARODD	0x00000200
 #define HUPCL	0x00000400
 #define CLOCAL	0x00000800
-/* We'll never see these speeds with the Zilogs' but for completeness... */
 #define CBAUDEX 0x00010000
 #define  B57600  0x00010001
 #define  B115200 0x00010002
 #define  B230400 0x00010003
 #define  B460800 0x00010004
-#define CIBAUD	  0x000f0000  /* input baud rate (not used) */
-#define CMSPAR	  010000000000		/* mark or space (stick) parity */
-#define CRTSCTS	  0x80000000  /* flow control */
+#define CIBAUD	0x100f0000	/* input baud rate (not used) */
+#define CMSPAR	0x40000000	/* mark or space (stick) parity */
+#define CRTSCTS	0x80000000	/* flow control */
 
 /* c_lflag bits */
 #define ISIG	0x00000001
@@ -166,7 +162,7 @@ struct termios
 #define ECHOCTL	0x00000200
 #define ECHOPRT	0x00000400
 #define ECHOKE	0x00000800
-#define DEFECHO 0x00001000  /* SUNOS thing, what is it? */
+#define DEFECHO 0x00001000	/* SUNOS thing, what is it? */
 #define FLUSHO	0x00002000
 #define PENDIN	0x00004000
 #define IEXTEN	0x00008000
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
index 8f079bf444..7e784cab8f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
@@ -1,5 +1,5 @@
 /* brk system call for Linux/SPARC.
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx)
 
@@ -35,13 +35,12 @@ __brk (void *addr)
 {
   void *newbrk, *scratch;
 
-  asm ("mov %1, %%g1\n\t"
-       "mov %2, %%o0\n\t"
-       "t 0x10\n\t"
-       "mov %%o0, %0\n\t"
-       : "=r" (newbrk)
-       : "0" (__NR_brk), "r" (addr)
-       : "g1", "o0");
+  {
+    register void *o0 __asm__("%o0") = addr;
+    register int g1 __asm__("%g1") = __NR_brk;
+    __asm ("t 0x10" : "=r"(o0) : "r"(g1), "0"(o0) : "cc");
+    newbrk = o0;
+  }
 
   __curbrk = newbrk;
 
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
index 8d6fd77c10..db8eb4e8bb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
@@ -48,18 +48,11 @@ ENTRY (__socket)
 
 	/* Drop up to 6 arguments (recvfrom) into the memory allocated by
 	   the caller for varargs, since that's really what we have.  */
-	st %o0, [%sp + 68 + 0]
-	st %o1, [%sp + 68 + 4]
+	std %o0, [%sp + 68 + 0]
 #if NARGS > 2
-	st %o2, [%sp + 68 + 8]
-#if NARGS > 3
-	st %o3, [%sp + 68 + 12]
+	std %o2, [%sp + 68 + 8]
 #if NARGS > 4
-	st %o4, [%sp + 68 + 16]
-#if NARGS > 5
-	st %o5, [%sp + 68 + 20]
-#endif
-#endif
+	std %o4, [%sp + 68 + 16]
 #endif
 #endif
 
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h
new file mode 100644
index 0000000000..d672a94d41
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h
@@ -0,0 +1,172 @@
+/* Copyright (C) 1998 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 Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H	1
+
+#include <features.h>
+#include <signal.h>
+
+/*
+ * Location of the users' stored registers relative to R0.
+ * Usage is as an index into a gregset_t array or as u.u_ar0[XX].
+ */
+#define REG_PSR (0)
+#define REG_PC  (1)
+#define REG_nPC (2)
+#define REG_Y   (3)
+#define REG_G1  (4)
+#define REG_G2  (5)
+#define REG_G3  (6)
+#define REG_G4  (7)
+#define REG_G5  (8)
+#define REG_G6  (9)
+#define REG_G7  (10)
+#define REG_O0  (11)
+#define REG_O1  (12)
+#define REG_O2  (13)
+#define REG_O3  (14)
+#define REG_O4  (15)
+#define REG_O5  (16)
+#define REG_O6  (17)
+#define REG_O7  (18)
+
+/*
+ * A gregset_t is defined as an array type for compatibility with the reference
+ * source. This is important due to differences in the way the C language
+ * treats arrays and structures as parameters.
+ *
+ * Note that NGREG is really (sizeof (struct regs) / sizeof (greg_t)),
+ * but that the ABI defines it absolutely to be 19.
+ */
+#define NGREG   19
+
+typedef int greg_t;
+typedef greg_t  gregset_t[NGREG];
+
+/*
+ * The following structures define how a register window can appear on the
+ * stack. This structure is available (when required) through the `gwins'
+ * field of an mcontext (nested within ucontext). SPARC_MAXWINDOW is the
+ * maximum number of outstanding regiters window defined in the SPARC
+ * architecture (*not* implementation).
+ */
+#define SPARC_MAXREGWINDOW	31	/* max windows in SPARC arch. */
+struct  rwindow
+  {
+    greg_t rw_local[8];			/* locals */
+    greg_t rw_in[8];			/* ins */
+  };
+
+#define rw_fp   rw_in[6]		/* frame pointer */
+#define rw_rtn  rw_in[7]		/* return address */
+
+typedef struct gwindows
+  {
+    int            wbcnt;
+    int           *spbuf[SPARC_MAXREGWINDOW];
+    struct rwindow wbuf[SPARC_MAXREGWINDOW];
+  } gwindows_t;
+
+/*
+ * Floating point definitions.
+ */
+
+#define MAXFPQ	16	/* max # of fpu queue entries currently supported */
+
+/*
+ * struct fq defines the minimal format of a floating point instruction queue
+ * entry. The size of entries in the floating point queue are implementation
+ * dependent. The union FQu is guarenteed to be the first field in any ABI
+ * conformant system implementation. Any additional fields provided by an
+ * implementation should not be used applications designed to be ABI conformant. */
+
+struct fpq
+  {
+    unsigned long *fpq_addr;		/* address */
+    unsigned long fpq_instr;		/* instruction */
+  };
+
+struct fq
+  {
+    union				/* FPU inst/addr queue */
+      {
+        double whole;
+        struct fpq fpq;
+      } FQu;
+  };
+
+#define FPU_REGS_TYPE           unsigned
+#define FPU_DREGS_TYPE          unsigned long long
+#define V7_FPU_FSR_TYPE         unsigned
+#define V9_FPU_FSR_TYPE         unsigned long long
+#define V9_FPU_FPRS_TYPE        unsigned
+
+typedef struct fpu
+  {
+    union {				/* FPU floating point regs */
+      unsigned long long fpu_regs[32];	/* 32 singles */
+      double             fpu_dregs[16];	/* 16 doubles */
+    } fpu_fr;
+    struct fq       *fpu_q;		/* ptr to array of FQ entries */
+    unsigned        fpu_fsr;		/* FPU status register */
+    unsigned char   fpu_qcnt;		/* # of entries in saved FQ */
+    unsigned char   fpu_q_entrysize;	/* # of bytes per FQ entry */
+    unsigned char   fpu_en;		/* flag signifying fpu in use */
+  } fpregset_t;
+
+/*
+ * The following structure is for associating extra register state with
+ * the ucontext structure and is kept within the uc_mcontext filler area.
+ *
+ * If (xrs_id == XRS_ID) then the xrs_ptr field is a valid pointer to
+ * extra register state. The exact format of the extra register state
+ * pointed to by xrs_ptr is platform-dependent.
+ *
+ * Note: a platform may or may not manage extra register state.
+ */
+typedef struct
+  {
+    unsigned int xrs_id;		/* indicates xrs_ptr validity */
+    void *       xrs_ptr;		/* ptr to extra reg state */
+  } xrs_t;
+
+#define XRS_ID	0x78727300		/* the string "xrs" */
+
+typedef struct
+  {
+    gregset_t   gregs;		/* general register set */
+    gwindows_t  *gwins;		/* POSSIBLE pointer to register windows */
+    fpregset_t  fpregs;		/* floating point register set */
+    xrs_t       xrs;		/* POSSIBLE extra register state association */
+    long        filler[19];
+  } mcontext_t;
+
+
+/* Userlevel context.  */
+typedef struct ucontext
+  {
+    unsigned long   uc_flags;
+    struct ucontext *uc_link;
+    unsigned long   uc_sigmask[4];	/* a svr4 sigset_t */
+    stack_t         uc_stack;
+    mcontext_t      uc_mcontext;
+    long            uc_filler[23];
+  } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S
index d62a28f7b5..e871e1ece0 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S
@@ -1,6 +1,6 @@
 /* Define errno */
 
-	.bss
+.section .bss
 	.globl	errno
 	.align	4
 errno:	.space	4