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

vapier at uclibc.org vapier at uclibc.org
Wed Feb 22 05:27:40 UTC 2006


Author: vapier
Date: 2006-02-21 21:27:38 -0800 (Tue, 21 Feb 2006)
New Revision: 14189

Log:
sync headers with glibc

Modified:
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/fcntl.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/mman.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/msq.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/sem.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/shm.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/stat.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/termios.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/bits/wordsize.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/sys/procfs.h
   trunk/uClibc/libc/sysdeps/linux/powerpc/sys/ucontext.h


Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/fcntl.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/fcntl.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/fcntl.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,5 +1,6 @@
 /* O_*, F_*, FD_* bit values for Linux/PowerPC.
-   Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000, 2003, 2004
+   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
@@ -45,7 +46,7 @@
 # define O_DIRECT	0400000	/* Direct disk access.	*/
 # define O_DIRECTORY	 040000	/* Must be a directory.	 */
 # define O_NOFOLLOW	0100000	/* Do not follow links.	 */
-# define O_STREAMING	04000000 /* streaming access */
+# define O_NOATIME	01000000 /* Do not set atime.  */
 #endif
 
 #ifdef __USE_LARGEFILE64
@@ -79,7 +80,7 @@
 #define F_SETLK64	13	/* Set record locking info (non-blocking).  */
 #define F_SETLKW64	14	/* Set record locking info (blocking).	*/
 
-#if defined __USE_BSD || defined __USE_XOPEN2K
+#if defined __USE_BSD || defined __USE_UNIX98
 # define F_SETOWN	8	/* Get owner of socket (receiver of SIGIO).  */
 # define F_GETOWN	9	/* Set owner of socket (receiver of SIGIO).  */
 #endif
@@ -178,3 +179,11 @@
 # define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
 # define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
 #endif
+
+__BEGIN_DECLS
+
+/* Provide kernel hint to read ahead.  */
+extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
+    __THROW;
+
+__END_DECLS

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/mman.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/mman.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/mman.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,5 +1,5 @@
 /* Definitions for POSIX memory map interface.  Linux/PowerPC version.
-   Copyright (C) 1997, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2000, 2003, 2005, 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
@@ -34,6 +34,10 @@
 #define PROT_WRITE	0x2		/* Page can be written.  */
 #define PROT_EXEC	0x4		/* Page can be executed.  */
 #define PROT_NONE	0x0		/* Page can not be accessed.  */
+#define PROT_GROWSDOWN	0x01000000	/* Extend change to start of
+					   growsdown vma (mprotect only).  */
+#define PROT_GROWSUP	0x02000000	/* Extend change to start of
+					   growsup vma (mprotect only).  */
 
 /* Sharing types (must choose one and only one of these).  */
 #define MAP_SHARED	0x001		/* Share changes.  */
@@ -52,11 +56,13 @@
 
 /* These are Linux-specific.  */
 #ifdef __USE_MISC
-# define MAP_GROWSDOWN	0x0100		/* Stack-like segment.  */
-# define MAP_DENYWRITE	0x0800		/* ETXTBSY */
-# define MAP_EXECUTABLE	0x1000		/* Mark it as an executable.  */
-# define MAP_LOCKED	0x0080		/* Lock the mapping.  */
-# define MAP_NORESERVE	0x0040		/* Don't check for reservations.  */
+# define MAP_GROWSDOWN	0x00100		/* Stack-like segment.  */
+# define MAP_DENYWRITE	0x00800		/* ETXTBSY */
+# define MAP_EXECUTABLE	0x01000		/* Mark it as an executable.  */
+# define MAP_LOCKED	0x00080		/* Lock the mapping.  */
+# define MAP_NORESERVE	0x00040		/* Don't check for reservations.  */
+# define MAP_POPULATE	0x08000		/* Populate (prefault) pagetables.  */
+# define MAP_NONBLOCK	0x10000		/* Do not block on IO.  */
 #endif
 
 /* Flags to `msync'.  */
@@ -83,6 +89,9 @@
 # define MADV_SEQUENTIAL 2	/* Expect sequential page references.  */
 # define MADV_WILLNEED	 3	/* Will need these pages.  */
 # define MADV_DONTNEED	 4	/* Don't need these pages.  */
+# define MADV_REMOVE	 5	/* Remove these pages and resources.  */
+# define MADV_DONTFORK	 10	/* Do not inherit across fork.  */
+# define MADV_DOFORK	 11	/* Do inherit across fork.  */
 #endif
 
 /* The POSIX people had to invent similar names for the same things.  */

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/msq.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/msq.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/msq.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 2000, 2002 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
@@ -21,7 +21,6 @@
 #endif
 
 #include <bits/types.h>
-#include <bits/wordsize.h>
 
 /* Define options for message queue functions.  */
 #define MSG_NOERROR    010000  /* no error if message is too big */

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/sem.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/sem.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/sem.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -22,7 +22,6 @@
 #endif
 
 #include <sys/types.h>
-#include <bits/wordsize.h>
 
 /* Flags for `semop'.  */
 #define SEM_UNDO       0x1000          /* undo the operation on exit */
@@ -31,8 +30,8 @@
 #define GETPID         11              /* get sempid */
 #define GETVAL         12              /* get semval */
 #define GETALL         13              /* get all semval's */
-#define GETNCNT        14              /* get semncnt */
-#define GETZCNT        15              /* get semzcnt */
+#define GETNCNT                14              /* get semncnt */
+#define GETZCNT                15              /* get semzcnt */
 #define SETVAL         16              /* set semval */
 #define SETALL         17              /* set all semval's */
 
@@ -44,11 +43,11 @@
 #if __WORDSIZE == 32
   unsigned int __unused1;
 #endif
-  __time_t sem_otime;           /* last semop() time */
+  __time_t sem_otime;                  /* last semop() time */
 #if __WORDSIZE == 32
   unsigned int __unused2;
 #endif
-  __time_t sem_ctime;           /* last time changed by semctl() */
+  __time_t sem_ctime;                  /* last time changed by semctl() */
   unsigned long int sem_nsems;         /* number of semaphores in set */
   unsigned long __unused3;
   unsigned long __unused4;

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/shm.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/shm.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/shm.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -22,7 +22,6 @@
 #endif
 
 #include <bits/types.h>
-#include <bits/wordsize.h>
 
 /* Permission flag for shmget.  */
 #define SHM_R          0400            /* or S_IRUGO from <linux/stat.h> */
@@ -81,9 +80,10 @@
 # define SHM_INFO      14
 
 /* shm_mode upper byte flags */
-# define SHM_DEST      01000   /* segment will be destroyed on last detach */
-# define SHM_LOCKED    02000   /* segment will not be swapped */
+# define SHM_DEST      01000	/* segment will be destroyed on last detach */
+# define SHM_LOCKED    02000	/* segment will not be swapped */
 # define SHM_HUGETLB   04000	/* segment is mapped via hugetlb */
+# define SHM_NORESERVE 010000	/* don't check for reservations */
 
 struct shminfo
   {

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/stat.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/stat.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/stat.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -27,11 +27,11 @@
 #define _STAT_VER_LINUX_OLD	1
 #define _STAT_VER_KERNEL	1
 #define _STAT_VER_SVR4		2
+#define _STAT_VER_LINUX	  3
 #if __WORDSIZE == 32
-# define _STAT_VER_LINUX	3
-# define _STAT_VER		_STAT_VER_LINUX	/* The one defined below.  */
+# define _STAT_VER		_STAT_VER_LINUX
 #else
-# define _STAT_VER		_STAT_VER_KERNEL /* The one defined below.  */
+# define _STAT_VER		_STAT_VER_KERNEL
 #endif
 
 /* Versions of the `xmknod' interface.  */
@@ -70,11 +70,11 @@
     __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
 # endif
     __time_t st_atime;			/* Time of last access.  */
-    unsigned long int __unused1;	/* Reserved for atime.nanoseconds.  */
+    unsigned long int st_atimensec;	/* Nscecs of last access.  */
     __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int __unused2;	/* Reserved for mtime.nanoseconds.  */
+    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
     __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int __unused3;	/* Reserved for ctime.nanoseconds.  */
+    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
     unsigned long int __unused4;
     unsigned long int __unused5;
   };
@@ -95,11 +95,11 @@
     __blksize_t st_blksize;		/* Optimal block size for I/O.  */
     __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
     __time_t st_atime;			/* Time of last access.  */
-    unsigned long int __unused1;	/* Reserved for atime.nanoseconds.  */
+    unsigned long int st_atimensec;	/* Nscecs of last access.  */
     __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int __unused2;	/* Reserved for mtime.nanoseconds.  */
+    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
     __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int __unused3;	/* Reserved for ctime.nanoseconds.  */
+    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
     unsigned long int __unused4;
     unsigned long int __unused5;
   };
@@ -134,11 +134,11 @@
     __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
 # endif
     __time_t st_atime;			/* Time of last access.  */
-    unsigned long int __unused1;	/* Reserved for atime.nanoseconds.  */
+    unsigned long int st_atimensec;	/* Nscecs of last access.  */
     __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int __unused2;	/* Reserved for mtime.nanoseconds.  */
+    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
     __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int __unused3;	/* Reserved for ctime.nanoseconds.  */
+    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
     unsigned long int __unused4;
     unsigned long int __unused5;
     unsigned long int __unused6;
@@ -159,11 +159,11 @@
     __blksize_t st_blksize;		/* Optimal block size for I/O.  */
     __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */
     __time_t st_atime;			/* Time of last access.  */
-    unsigned long int __unused1;	/* Reserved for atime.nanoseconds.  */
+    unsigned long int st_atimensec;	/* Nscecs of last access.  */
     __time_t st_mtime;			/* Time of last modification.  */
-    unsigned long int __unused2;	/* Reserved for mtime.nanoseconds.  */
+    unsigned long int st_mtimensec;	/* Nsecs of last modification.  */
     __time_t st_ctime;			/* Time of last status change.  */
-    unsigned long int __unused3;	/* Reserved for ctime.nanoseconds.  */
+    unsigned long int st_ctimensec;	/* Nsecs of last status change.  */
     unsigned long int __unused4;
     unsigned long int __unused5;
     unsigned long int __unused6;
@@ -175,6 +175,8 @@
 /* Tell code we have these members.  */
 #define	_STATBUF_ST_BLKSIZE
 #define _STATBUF_ST_RDEV
+/* Nanosecond resolution time values are supported.  */
+#define _STATBUF_ST_NSEC
 
 /* Encoding of the file mode.  */
 

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/termios.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/termios.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/termios.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1999, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1997,1999,2001,2003,2004,2005 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
@@ -40,6 +40,8 @@
 	cc_t c_cc[NCCS];		/* control characters */
 	speed_t c_ispeed;		/* input speed */
 	speed_t c_ospeed;		/* output speed */
+#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
+#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
 };
 
 /* c_cc characters */
@@ -77,6 +79,7 @@
 #define IXANY	0004000
 #define IUCLC	0010000
 #define IMAXBEL	0020000
+#define IUTF8	0040000
 
 /* c_oflag bits */
 #define OPOST	0000001
@@ -89,34 +92,41 @@
 
 #define OFILL	00000100
 #define OFDEL	00000200
-#define NLDLY	00001400
-#define   NL0	00000000
-#define   NL1	00000400
-#define   NL2	00001000
-#define   NL3	00001400
-#define TABDLY	00006000
-#define   TAB0	00000000
-#define   TAB1	00002000
-#define   TAB2	00004000
-#define   TAB3	00006000
-#define CRDLY	00030000
-#define   CR0	00000000
-#define   CR1	00010000
-#define   CR2	00020000
-#define   CR3	00030000
-#define FFDLY	00040000
-#define   FF0	00000000
-#define   FF1	00040000
-#define BSDLY	00100000
-#define   BS0	00000000
-#define   BS1	00100000
+#if defined __USE_MISC || defined __USE_XOPEN
+# define NLDLY	00001400
+# define   NL0	00000000
+# define   NL1	00000400
+# define   NL2	00001000
+# define   NL3	00001400
+# define TABDLY	00006000
+# define   TAB0	00000000
+# define   TAB1	00002000
+# define   TAB2	00004000
+# define   TAB3	00006000
+# define CRDLY	00030000
+# define   CR0	00000000
+# define   CR1	00010000
+# define   CR2	00020000
+# define   CR3	00030000
+# define FFDLY	00040000
+# define   FF0	00000000
+# define   FF1	00040000
+# define BSDLY	00100000
+# define   BS0	00000000
+# define   BS1	00100000
+#endif
 #define VTDLY	00200000
 #define   VT0	00000000
 #define   VT1	00200000
-#define XTABS	01000000 /* Hmm.. Linux/i386 considers this part of TABDLY.. */
 
+#ifdef __USE_MISC
+# define XTABS	00006000
+#endif
+
 /* c_cflag bit meaning */
-#define CBAUD	0000377
+#ifdef __USE_MISC
+# define CBAUD	0000377
+#endif
 #define  B0	0000000		/* hang up */
 #define  B50	0000001
 #define  B75	0000002
@@ -133,9 +143,11 @@
 #define  B9600	0000015
 #define  B19200	0000016
 #define  B38400	0000017
-#define EXTA B19200
-#define EXTB B38400
-#define CBAUDEX 0000020
+#ifdef __USE_MISC
+# define EXTA B19200
+# define EXTB B38400
+# define CBAUDEX 0000020
+#endif
 #define  B57600   00020
 #define  B115200  00021
 #define  B230400  00022
@@ -166,23 +178,30 @@
 #define HUPCL	00040000
 
 #define CLOCAL	00100000
-#define CRTSCTS	  020000000000		/* flow control */
+#ifdef __USE_MISC
+# define CMSPAR   010000000000		/* mark or space (stick) parity */
+# define CRTSCTS  020000000000		/* flow control */
+#endif
 
 /* c_lflag bits */
 #define ISIG	0x00000080
 #define ICANON	0x00000100
-#define XCASE	0x00004000
+#if defined __USE_MISC || defined __USE_XOPEN
+# define XCASE	0x00004000
+#endif
 #define ECHO	0x00000008
 #define ECHOE	0x00000002
 #define ECHOK	0x00000004
 #define ECHONL	0x00000010
 #define NOFLSH	0x80000000
 #define TOSTOP	0x00400000
-#define ECHOCTL	0x00000040
-#define ECHOPRT	0x00000020
-#define ECHOKE	0x00000001
-#define FLUSHO	0x00800000
-#define PENDIN	0x20000000
+#ifdef __USE_MISC
+# define ECHOCTL	0x00000040
+# define ECHOPRT	0x00000020
+# define ECHOKE	0x00000001
+# define FLUSHO	0x00800000
+# define PENDIN	0x20000000
+#endif
 #define IEXTEN	0x00000400
 
 /* Values for the ACTION argument to `tcflow'.  */

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/bits/wordsize.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/bits/wordsize.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/bits/wordsize.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,19 +1,19 @@
-/* Copyright (C) 1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
+/* Determine the wordsize from the preprocessor defines.  */
 
-   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.
+#if defined __powerpc64__
+# define __WORDSIZE	64
+# define __WORDSIZE_COMPAT32	1
+#else
+# define __WORDSIZE	32
+#endif
 
-   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.
+#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL
 
-   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.  */
-
-#define __WORDSIZE	32
+/* Signal the glibc ABI didn't used to have a `long double'.
+   The changes all the `long double' function variants to be redirects
+   to the double functions.  */
+# define __LONG_DOUBLE_MATH_OPTIONAL   1
+# ifndef __LONG_DOUBLE_128__
+#  define __NO_LONG_DOUBLE_MATH        1
+# endif
+#endif

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/sys/procfs.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/sys/procfs.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/sys/procfs.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1999, 2002, 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
@@ -32,9 +32,17 @@
 
 __BEGIN_DECLS
 
+/* These definitions are normally provided by ucontext.h via 
+   asm/sigcontext.h, asm/ptrace.h, and asm/elf.h.  Otherwise we define 
+   them here.  */ 
+#ifndef __PPC64_ELF_H
 #define ELF_NGREG       48      /* includes nip, msr, lr, etc. */
 #define ELF_NFPREG      33      /* includes fpscr */
-#define ELF_NVRREG      33      /* includes vscr */
+#if __WORDSIZE == 32
+# define ELF_NVRREG      33      /* includes vscr */
+#else
+# define ELF_NVRREG      34      /* includes vscr */
+#endif
 
 typedef unsigned long elf_greg_t;
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
@@ -45,8 +53,9 @@
 /* Altivec registers */
 typedef struct {
   unsigned int u[4];
-} __attribute((aligned (16))) elf_vrreg_t;
+} __attribute__ ((aligned (16))) elf_vrreg_t;
 typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG];
+#endif
 
 struct elf_siginfo
   {

Modified: trunk/uClibc/libc/sysdeps/linux/powerpc/sys/ucontext.h
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/powerpc/sys/ucontext.h	2006-02-22 04:09:43 UTC (rev 14188)
+++ trunk/uClibc/libc/sysdeps/linux/powerpc/sys/ucontext.h	2006-02-22 05:27:38 UTC (rev 14189)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2002, 2004, 2005 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
@@ -26,16 +26,152 @@
    included in <signal.h>.  */
 #include <bits/sigcontext.h>
 
-typedef struct sigcontext mcontext_t;
+#if __WORDSIZE == 32
 
+/* Number of general registers.  */
+# define NGREG	48
+
+/* Container for all general registers.  */
+typedef unsigned long gregset_t[NGREG];
+
+/* Container for floating-point registers and status */
+typedef struct _libc_fpstate
+{
+	double fpregs[32];
+	double fpscr;
+	unsigned int _pad[2];
+} fpregset_t;
+
+/* Container for Altivec/VMX registers and status.
+   Needs to be aligned on a 16-byte boundary. */
+typedef struct _libc_vrstate
+{
+	unsigned int vrregs[32][4];
+	unsigned int vrsave;
+	unsigned int _pad[2];
+	unsigned int vscr;
+} vrregset_t;
+
+/* Context to describe whole processor state.  */
+typedef struct
+{
+	gregset_t gregs;
+	fpregset_t fpregs;
+	vrregset_t vrregs __attribute__((__aligned__(16)));
+} mcontext_t;
+
+#else
+
+/* For 64-bit kernels with Altivec support, a machine context is exactly 
+ * a sigcontext.  For older kernel (without Altivec) the sigcontext matches 
+ * the mcontext upto but not including the v_regs field.  For kernels that 
+ * don't AT_HWCAP or return AT_HWCAP without PPC_FEATURE_HAS_ALTIVEC the 
+ * v_regs field may not exit and should not be referenced.  The v_regd field
+ * can be refernced safely only after verifying that PPC_FEATURE_HAS_ALTIVEC
+ * is set in AT_HWCAP.  */
+    
+/* Number of general registers.  */
+# define NGREG	48	/* includes r0-r31, nip, msr, lr, etc.   */
+# define NFPREG	33	/* includes fp0-fp31 &fpscr.  */
+# define NVRREG	34	/* includes v0-v31, vscr, & vrsave in split vectors */
+
+typedef unsigned long gregset_t[NGREG];
+typedef double fpregset_t[NFPREG];
+
+/* Container for Altivec/VMX Vector Status and Control Register.  Only 32-bits
+   but can only be copied to/from a 128-bit vector register.  So we allocated 
+   a whole quadword speedup save/restore.  */
+typedef struct _libc_vscr
+{
+	unsigned int __pad[3];
+	unsigned int vscr_word;
+} vscr_t;
+
+/* Container for Altivec/VMX registers and status.
+   Must to be aligned on a 16-byte boundary. */
+typedef struct _libc_vrstate
+{
+	unsigned int	vrregs[32][4];
+	vscr_t		vscr;
+	unsigned int	vrsave;
+	unsigned int	__pad[3];
+} vrregset_t  __attribute__((__aligned__(16)));
+
+typedef struct {
+	unsigned long	__unused[4];
+	int		signal;
+	int		__pad0;
+	unsigned long	handler;
+	unsigned long	oldmask;
+	struct pt_regs	*regs;
+	gregset_t	gp_regs;
+	fpregset_t	fp_regs;
+/*
+ * To maintain compatibility with current implementations the sigcontext is 
+ * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t) 
+ * followed by an unstructured (vmx_reserve) field of 69 doublewords.  This 
+ * allows the array of vector registers to be quadword aligned independent of 
+ * the alignment of the containing sigcontext or ucontext. It is the 
+ * responsibility of the code setting the sigcontext to set this pointer to 
+ * either NULL (if this processor does not support the VMX feature) or the 
+ * address of the first quadword within the allocated (vmx_reserve) area.
+ *
+ * The pointer (v_regs) of vector type (elf_vrreg_t) is essentually  
+ * an array of 34 quadword entries.  The entries with 
+ * indexes 0-31 contain the corresponding vector registers.  The entry with 
+ * index 32 contains the vscr as the last word (offset 12) within the 
+ * quadword.  This allows the vscr to be stored as either a quadword (since 
+ * it must be copied via a vector register to/from storage) or as a word.  
+ * The entry with index 33 contains the vrsave as the first word (offset 0) 
+ * within the quadword.
+ */
+	vrregset_t	*v_regs;
+	long		vmx_reserve[NVRREG+NVRREG+1];
+} mcontext_t;
+
+#endif
+
 /* Userlevel context.  */
 typedef struct ucontext
   {
     unsigned long int uc_flags;
     struct ucontext *uc_link;
     stack_t uc_stack;
-    mcontext_t uc_mcontext;
-    __sigset_t uc_sigmask;
+#if __WORDSIZE == 32
+    /*
+     * These fields are set up this way to maximize source and
+     * binary compatibility with code written for the old
+     * ucontext_t definition, which didn't include space for the
+     * registers.
+     *
+     * Different versions of the kernel have stored the registers on
+     * signal delivery at different offsets from the ucontext struct.
+     * Programs should thus use the uc_mcontext.uc_regs pointer to
+     * find where the registers are actually stored.  The registers
+     * will be stored within the ucontext_t struct but not necessarily
+     * at a fixed address.  As a side-effect, this lets us achieve
+     * 16-byte alignment for the register storage space if the
+     * Altivec registers are to be saved, without requiring 16-byte
+     * alignment on the whole ucontext_t.
+     *
+     * The uc_mcontext.regs field is included for source compatibility
+     * with programs written against the older ucontext_t definition,
+     * and its name should therefore not change.  The uc_pad field
+     * is for binary compatibility with programs compiled against the
+     * old ucontext_t; it ensures that uc_mcontext.regs and uc_sigmask
+     * are at the same offset as previously.
+     */
+    int uc_pad[7];
+    union uc_regs_ptr {
+      struct pt_regs *regs;
+      mcontext_t *uc_regs;
+    } uc_mcontext;
+    sigset_t    uc_sigmask;
+    char uc_reg_space[sizeof(mcontext_t) + 12];  /* last for extensibility */
+#else /* 64-bit */
+    sigset_t    uc_sigmask;
+    mcontext_t  uc_mcontext;  /* last for extensibility */
+#endif
   } ucontext_t;
 
 #endif /* sys/ucontext.h */




More information about the uClibc-cvs mailing list