about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/configure10
-rw-r--r--sysdeps/unix/sysv/linux/configure.in10
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h23
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h67
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h50
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h179
6 files changed, 306 insertions, 33 deletions
diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
index ffaedc93c2..bf5e797d31 100644
--- a/sysdeps/unix/sysv/linux/configure
+++ b/sysdeps/unix/sysv/linux/configure
@@ -57,7 +57,15 @@ fi
 # shared library objects and the configuration files on the root partition
 # in /lib and /etc.
 if test "$prefix" = "/usr"; then
-  libc_cv_slibdir="/lib"
+  # 64bit libraries on sparc go to /lib64 and not /lib
+  if test "$machine" = "sparc/sparc64"; then
+    libc_cv_slibdir="/lib64"
+    if test "$libdir" = '${exec_prefix}/lib'; then
+      libdir='${exec_prefix}/lib64';
+    fi
+  else
+    libc_cv_slibdir="/lib"
+  fi
   libc_cv_sysconfdir="/etc"
   libc_cv_rootsbindir="/sbin"
 fi
diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in
index 4f116b57cb..2c425c5f25 100644
--- a/sysdeps/unix/sysv/linux/configure.in
+++ b/sysdeps/unix/sysv/linux/configure.in
@@ -42,7 +42,15 @@ fi
 # shared library objects and the configuration files on the root partition
 # in /lib and /etc.
 if test "$prefix" = "/usr"; then
-  libc_cv_slibdir="/lib"
+  # 64bit libraries on sparc go to /lib64 and not /lib
+  if test "$machine" = "sparc/sparc64"; then
+    libc_cv_slibdir="/lib64"
+    if test "$libdir" = '${exec_prefix}/lib'; then
+      libdir='${exec_prefix}/lib64';
+    fi
+  else
+    libc_cv_slibdir="/lib"
+  fi
   libc_cv_sysconfdir="/etc"
   libc_cv_rootsbindir="/sbin"
 fi
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h
index e51f81a5a0..b15fc5e90b 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h
@@ -21,6 +21,10 @@
 # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
 #endif
 
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+
 #include <sys/ucontext.h>
 
 typedef ucontext_t __jmp_buf[1];
@@ -29,3 +33,22 @@ typedef ucontext_t __jmp_buf[1];
    containing a local variable at ADDRESS.  */
 #define _JMPBUF_UNWINDS(jmpbuf, address) \
   ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp)
+
+#else
+
+#if defined __USE_MISC || defined _ASM
+# define JB_SP  0
+# define JB_FP  1
+# define JB_PC  2
+#endif
+
+#ifndef _ASM
+typedef int __jmp_buf[3];
+#endif
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+  ((int) (address) < (jmpbuf)[JB_SP])
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h
index b6178f5a8e..6f094bc391 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999 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
@@ -16,43 +16,66 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/*
- * Never include this file directly; use <sys/statfs.h> instead.
- */
+#ifndef _SYS_STATFS_H
+# error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead."
+#endif
 
-#ifndef _BITS_STATFS_H
-#define _BITS_STATFS_H
-
-#include <bits/types.h>  /* for __fsid_t */
+#include <bits/types.h>  /* for __fsid_t and __fsblkcnt_t*/
 
 struct statfs
   {
+#if __WORDSIZE == 64
     long int f_type;
     long int f_bsize;
-    long int f_blocks;
-    long int f_bfree;
-    long int f_bavail;
-    long int f_files;
-    long int f_ffree;
+#else
+    int f_type;
+    int f_bsize;
+#endif
+#ifndef __USE_FILE_OFFSET64
+    __fsblkcnt_t f_blocks;
+    __fsblkcnt_t f_bfree;
+    __fsblkcnt_t f_bavail;
+    __fsfilcnt_t f_files;
+    __fsfilcnt_t f_ffree;
+#else
+    __fsblkcnt64_t f_blocks;
+    __fsblkcnt64_t f_bfree;
+    __fsblkcnt64_t f_bavail;
+    __fsfilcnt64_t f_files;
+    __fsfilcnt64_t f_ffree;
+#endif
     __fsid_t f_fsid;
+#if __WORDSIZE == 64
     long int f_namelen;
     long int f_spare[6];
+#else    
+    int f_namelen;
+    int f_spare[6];
+#endif
   };
 
-/* We already use 64-bit types in the normal structure,
-   so this is the same as the above.  */
+#ifdef __USE_LARGEFILE64
 struct statfs64
   {
+#if __WORDSIZE == 64
     long int f_type;
     long int f_bsize;
-    long int f_blocks;
-    long int f_bfree;
-    long int f_bavail;
-    long int f_files;
-    long int f_ffree;
+#else
+    int f_type;
+    int f_bsize;
+#endif
+    __fsblkcnt64_t f_blocks;
+    __fsblkcnt64_t f_bfree;
+    __fsblkcnt64_t f_bavail;
+    __fsfilcnt64_t f_files;
+    __fsfilcnt64_t f_ffree;
     __fsid_t f_fsid;
+#if __WORDSIZE == 64
     long int f_namelen;
     long int f_spare[6];
+#else    
+    int f_namelen;
+    int f_spare[6];
+#endif
   };
-
-#endif	/* bits/statfs.h */
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
index b6d98853ea..9ecba2ddcf 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98, 99 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
@@ -27,38 +27,66 @@
 
 #define __need_size_t
 #include <stddef.h>
+#include <bits/wordsize.h>
 
 /* Convenience types.  */
 typedef unsigned char __u_char;
 typedef unsigned short int __u_short;
 typedef unsigned int __u_int;
 typedef unsigned long int __u_long;
+#if __WORDSIZE == 64
 typedef unsigned long int __u_quad_t;
 typedef long int __quad_t;
+#else
+#ifdef __GNUC__
+__extension__ typedef unsigned long long int __u_quad_t;
+__extension__ typedef long long int __quad_t;
+#else
+typedef struct
+  {
+    long int __val[2];
+  } __quad_t;
+typedef struct
+  {
+    __u_long __val[2];
+  } __u_quad_t;
+#endif
+#endif
 typedef signed char __int8_t;
 typedef unsigned char __uint8_t;
 typedef signed short int __int16_t;
 typedef unsigned short int __uint16_t;
 typedef signed int __int32_t;
 typedef unsigned int __uint32_t;
+#if __WORDSIZE == 64
 typedef signed long int __int64_t;
 typedef unsigned long int __uint64_t;
 typedef __quad_t *__qaddr_t;
+#else
+#ifdef __GNUC__
+__extension__ typedef signed long long int __int64_t;
+__extension__ typedef unsigned long long int __uint64_t;
+#endif
+#endif
 
-typedef __u_long __dev_t;		/* Type of device numbers.  */
+typedef __u_quad_t __dev_t;		/* Type of device numbers.  */
 typedef __u_int __uid_t;		/* Type of user identifications.  */
 typedef __u_int __gid_t;		/* Type of group identifications.  */
 typedef __u_long __ino_t;		/* Type of file serial numbers.  */
-typedef __u_long __ino64_t;		/* Type of file serial numbers.  */
+typedef __uint64_t __ino64_t;		/* Type of file serial numbers.  */
 typedef __u_int __mode_t;		/* Type of file attribute bitmasks.  */
 typedef __u_int __nlink_t; 		/* Type of file link counts.  */
 typedef long int __off_t;		/* Type of file sizes and offsets.  */
 typedef __int64_t  __off64_t;		/*  "" (LFS) */
 typedef __quad_t __loff_t;		/* Type of file sizes and offsets.  */
 typedef int __pid_t;			/* Type of process identifications.  */
+#if __WORDSIZE == 64
 typedef long long int __ssize_t;	/* Type of a byte count, or error.  */
+#else
+typedef int __ssize_t;			/* Type of a byte count, or error.  */
+#endif
 typedef long int __rlim_t;		/* Type of resource counts.  */
-typedef long int __rlim64_t;		/* Type of resource counts (LFS).  */
+typedef __quad_t __rlim64_t;		/* Type of resource counts (LFS).  */
 typedef __u_int __id_t;			/* General type for IDs.  */
 
 typedef struct
@@ -108,7 +136,11 @@ typedef struct
 typedef int __key_t;
 
 /* Used in `struct shmid_ds'.  */
-typedef int __ipc_pid_t;
+#if __WORDSIZE == 64
+typedef int       __ipc_pid_t;
+#else
+typedef short int __ipc_pid_t;
+#endif
 
 
 /* Types from the Large File Support interface.  */
@@ -118,7 +150,11 @@ typedef long int __blkcnt_t;
 typedef __quad_t __blkcnt64_t;
 
 /* Type to count file system blocks.  */
+#if __WORDSIZE == 64
+typedef __u_long     __fsblkcnt_t;
+#else
 typedef unsigned int __fsblkcnt_t;
+#endif
 typedef __u_quad_t __fsblkcnt64_t;
 
 /* Type to count file system inodes.  */
@@ -130,7 +166,11 @@ typedef int __t_scalar_t;
 typedef unsigned int __t_uscalar_t;
 
 /* Duplicates info from stdint.h but this is used in unistd.h.  */
+#if __WORDSIZE == 64
 typedef long int __intptr_t;
+#else
+typedef int      __intptr_t;
+#endif
 
 
 /* Now add the thread types.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h
index f62b542b2f..03ec8ae791 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sys/ucontext.h
@@ -1,7 +1,29 @@
+/* Copyright (C) 1998, 1999 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
+#define _SYS_UCONTEXT_H	1
 
+#include <features.h>
 #include <signal.h>
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
 
 #define MC_TSTATE	0
 #define MC_PC		1
@@ -56,12 +78,161 @@ typedef struct {
 	mc_fpu_t	mc_fpregs;
 } mcontext_t;
 
-struct ucontext {
+typedef struct ucontext {
 	struct ucontext		*uc_link;
 	unsigned long		uc_flags;
 	unsigned long		uc_sigmask;
 	mcontext_t		uc_mcontext;
-};
-typedef struct ucontext ucontext_t;
+} ucontext_t;
+
+#else /* __WORDSIZE == 32 */
+
+/*
+ * 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 /* __WORDSIZE == 32 */
 #endif /* sys/ucontext.h */