aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>1998-03-01 01:19:00 +0000
committerRichard Henderson <rth@redhat.com>1998-03-01 01:19:00 +0000
commit489b7d4bfcc3d87131f3110463d75cc1c4a1d742 (patch)
treeb6bd7597931ee75500b7be28c1d42e48eec334c3 /sysdeps/unix
parent41df5ed40a50159fcb3b68ad734248e73f7f70de (diff)
downloadglibc-489b7d4bfcc3d87131f3110463d75cc1c4a1d742.tar
glibc-489b7d4bfcc3d87131f3110463d75cc1c4a1d742.tar.gz
glibc-489b7d4bfcc3d87131f3110463d75cc1c4a1d742.tar.bz2
glibc-489b7d4bfcc3d87131f3110463d75cc1c4a1d742.zip
* sysdeps/unix/sysv/linux/sparc/bits/ioctls.h: Don't include kernel_termios.h. * sysdeps/unix/sysv/linux/sparc/bits/termios.h (CBAUD, CIBAUD): Fix. Clean up random whitespace. * sysdeps/unix/sysv/linux/sparc/sparc32/brk.c: Tidy the asm. * sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Use std on the args. * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S: Fix use of .bss. * sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h: New file.
1998-03-01 09:11 Richard Henderson <rth@cygnus.com> * sysdeps/unix/sysv/linux/sparc/bits/ioctls.h: Don't include kernel_termios.h. * sysdeps/unix/sysv/linux/sparc/bits/termios.h (CBAUD, CIBAUD): Fix. Clean up random whitespace. * sysdeps/unix/sysv/linux/sparc/sparc32/brk.c: Tidy the asm. * sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Use std on the args. * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S: Fix use of .bss. * sysdeps/unix/sysv/linux/sparc/sparc32/sys/ucontext.h: New file. 1998-03-01 08:31 Richard Henderson <rth@cygnus.com>
Diffstat (limited to 'sysdeps/unix')
-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