diff options
Diffstat (limited to 'libc/sysdeps/linux/mips/bits')
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/fcntl.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/fenv.h | 82 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/kernel_stat.h | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/msq.h | 94 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/resource.h | 21 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/sem.h | 14 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/shm.h | 28 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/stat.h | 8 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/syscalls.h | 36 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/uClibc_arch_features.h | 3 | 
10 files changed, 215 insertions, 77 deletions
| diff --git a/libc/sysdeps/linux/mips/bits/fcntl.h b/libc/sysdeps/linux/mips/bits/fcntl.h index 33251c74d..a98b8c2e5 100644 --- a/libc/sysdeps/linux/mips/bits/fcntl.h +++ b/libc/sysdeps/linux/mips/bits/fcntl.h @@ -268,3 +268,5 @@ extern ssize_t tee (int __fdin, int __fdout, size_t __len,  #endif  __END_DECLS +/* Include generic Linux declarations.  */ +#include <bits/fcntl-linux.h> diff --git a/libc/sysdeps/linux/mips/bits/fenv.h b/libc/sysdeps/linux/mips/bits/fenv.h index 944101f75..25ae4d9ca 100644 --- a/libc/sysdeps/linux/mips/bits/fenv.h +++ b/libc/sysdeps/linux/mips/bits/fenv.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +/* Copyright (C) 1998-2025 Free Software Foundation, Inc.     The GNU C Library is free software; you can redistribute it and/or     modify it under the terms of the GNU Lesser General Public @@ -12,31 +11,38 @@     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, see -   <http://www.gnu.org/licenses/>.  */ +   License along with the GNU C Library.  If not, see +   <https://www.gnu.org/licenses/>.  */  #ifndef _FENV_H  # error "Never use <bits/fenv.h> directly; include <fenv.h> instead."  #endif +#ifdef __mips_hard_float +  /* Define bits representing the exception.  We use the bit positions     of the appropriate bits in the FPU control word.  */  enum    { -    FE_INEXACT = 0x04, -#define FE_INEXACT	FE_INEXACT -    FE_UNDERFLOW = 0x08, -#define FE_UNDERFLOW	FE_UNDERFLOW -    FE_OVERFLOW = 0x10, -#define FE_OVERFLOW	FE_OVERFLOW -    FE_DIVBYZERO = 0x20, -#define FE_DIVBYZERO	FE_DIVBYZERO -    FE_INVALID = 0x40, -#define FE_INVALID	FE_INVALID +    FE_INEXACT = +# define FE_INEXACT	0x04 +      FE_INEXACT, +    FE_UNDERFLOW = +# define FE_UNDERFLOW	0x08 +      FE_UNDERFLOW, +    FE_OVERFLOW = +# define FE_OVERFLOW	0x10 +      FE_OVERFLOW, +    FE_DIVBYZERO = +# define FE_DIVBYZERO	0x20 +      FE_DIVBYZERO, +    FE_INVALID = +# define FE_INVALID	0x40 +      FE_INVALID,    }; -#define FE_ALL_EXCEPT \ +# define FE_ALL_EXCEPT \  	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)  /* The MIPS FPU supports all of the four defined rounding modes.  We @@ -44,16 +50,38 @@ enum     for the appropriate macros.  */  enum    { -    FE_TONEAREST = 0x0, -#define FE_TONEAREST	FE_TONEAREST -    FE_TOWARDZERO = 0x1, -#define FE_TOWARDZERO	FE_TOWARDZERO -    FE_UPWARD = 0x2, -#define FE_UPWARD	FE_UPWARD -    FE_DOWNWARD = 0x3 -#define FE_DOWNWARD	FE_DOWNWARD +    FE_TONEAREST = +# define FE_TONEAREST	0x0 +      FE_TONEAREST, +    FE_TOWARDZERO = +# define FE_TOWARDZERO	0x1 +      FE_TOWARDZERO, +    FE_UPWARD = +# define FE_UPWARD	0x2 +      FE_UPWARD, +    FE_DOWNWARD = +# define FE_DOWNWARD	0x3 +      FE_DOWNWARD    }; +#else + +/* In the soft-float case, only rounding to nearest is supported, with +   no exceptions.  */ + +enum +  { +    __FE_UNDEFINED = -1, + +    FE_TONEAREST = +# define FE_TONEAREST	0x0 +      FE_TONEAREST +  }; + +# define FE_ALL_EXCEPT 0 + +#endif +  /* Type representing exception flags.  */  typedef unsigned short int fexcept_t; @@ -70,7 +98,13 @@ fenv_t;  /* If the default argument is used we use this value.  */  #define FE_DFL_ENV	((const fenv_t *) -1) -#ifdef __USE_GNU +#if defined __USE_GNU && defined __mips_hard_float  /* Floating-point environment where none of the exception is masked.  */  # define FE_NOMASK_ENV  ((const fenv_t *) -2)  #endif + +/* Type representing floating-point control modes.  */ +typedef unsigned int femode_t; + +/* Default floating-point control modes.  */ +# define FE_DFL_MODE	((const femode_t *) -1L) diff --git a/libc/sysdeps/linux/mips/bits/kernel_stat.h b/libc/sysdeps/linux/mips/bits/kernel_stat.h index a2a6169a3..23a6ce61a 100644 --- a/libc/sysdeps/linux/mips/bits/kernel_stat.h +++ b/libc/sysdeps/linux/mips/bits/kernel_stat.h @@ -14,7 +14,11 @@ typedef struct {  } __ktimespec_t;  #else  typedef struct { +#if defined(__UCLIBC_USE_TIME64__) +	__S32_TYPE tv_sec; +#else  	time_t tv_sec; +#endif  	unsigned long tv_nsec;  } __ktimespec_t;  #endif diff --git a/libc/sysdeps/linux/mips/bits/msq.h b/libc/sysdeps/linux/mips/bits/msq.h index bcf1073e8..141b1ff9f 100644 --- a/libc/sysdeps/linux/mips/bits/msq.h +++ b/libc/sysdeps/linux/mips/bits/msq.h @@ -35,30 +35,58 @@ typedef unsigned long int msglen_t;  /* Structure of record for one message inside the kernel.     The type `struct msg' is opaque.  */ +#if (__WORDSIZE == 32) && defined(__MIPSEL__)  struct msqid_ds  {    struct ipc_perm msg_perm;	/* structure describing operation permission */ -#if (__WORDSIZE == 32) && !defined(__MIPSEL__) -	unsigned long	__unused1; -#endif -  __time_t msg_stime;		/* time of last msgsnd command */ -#if (__WORDSIZE == 32) && defined(__MIPSEL__) -	unsigned long	__unused1; -#endif -#if (__WORDSIZE == 32) && !defined(__MIPSEL__) -	unsigned long	__unused2; -#endif -  __time_t msg_rtime;		/* time of last msgrcv command */ -#if (__WORDSIZE == 32) && defined(__MIPSEL__) -	unsigned long	__unused2; -#endif -#if (__WORDSIZE == 32) && !defined(__MIPSEL__) -	unsigned long	__unused3; -#endif -  __time_t msg_ctime;		/* time of last change */ -#if (__WORDSIZE == 32) && defined(__MIPSEL__) -	unsigned long	__unused3; -#endif +#  if defined(__UCLIBC_USE_TIME64__) +  unsigned long msg_stime_internal_1;		/* time of last msgsnd command */ +  unsigned long msg_stime_internal_2; +  unsigned long msg_rtime_internal_1;		/* time of last msgrcv command */ +  unsigned long msg_rtime_internal_2; +  unsigned long msg_ctime_internal_1;		/* time of last change */ +  unsigned long msg_ctime_internal_2; +#  else +  __time_t msg_stime; +  unsigned long int __uclibc_unused1; +  __time_t msg_rtime; +  unsigned long int __uclibc_unused2; +  __time_t msg_ctime; +  unsigned long int __uclibc_unused3; +#  endif +  unsigned long int __msg_cbytes; /* current number of bytes on queue */ +  msgqnum_t msg_qnum;		/* number of messages currently on queue */ +  msglen_t msg_qbytes;		/* max number of bytes allowed on queue */ +  __pid_t msg_lspid;		/* pid of last msgsnd() */ +  __pid_t msg_lrpid;		/* pid of last msgrcv() */ +  unsigned long int __uclibc_unused4; +  unsigned long int __uclibc_unused5; +#  if defined(__UCLIBC_USE_TIME64__) +  __time_t msg_stime; +  __time_t msg_rtime; +  __time_t msg_ctime; +#  endif +}; + +#elif (__WORDSIZE == 32) && defined(__MIPSEB__) +struct msqid_ds +{ +  struct ipc_perm msg_perm;	/* structure describing operation permission */ +#  if defined(__UCLIBC_USE_TIME64__) +  unsigned long msg_stime_internal_2;		/* time of last msgsnd command */ +  unsigned long msg_stime_internal_1; +  unsigned long msg_rtime_internal_2;		/* time of last msgrcv command */ +  unsigned long msg_rtime_internal_1; +  unsigned long msg_ctime_internal_2;		/* time of last change */ +  unsigned long msg_ctime_internal_1; +#  else +  unsigned long int __uclibc_unused1; +  __time_t msg_stime; +  unsigned long int __uclibc_unused2; +  __time_t msg_rtime; +  unsigned long int __uclibc_unused3; +  __time_t msg_ctime; +#  endif    unsigned long int __msg_cbytes; /* current number of bytes on queue */    msgqnum_t msg_qnum;		/* number of messages currently on queue */    msglen_t msg_qbytes;		/* max number of bytes allowed on queue */ @@ -66,8 +94,32 @@ struct msqid_ds    __pid_t msg_lrpid;		/* pid of last msgrcv() */    unsigned long int __uclibc_unused4;    unsigned long int __uclibc_unused5; +#  if defined(__UCLIBC_USE_TIME64__) +  __time_t msg_stime; +  __time_t msg_rtime; +  __time_t msg_ctime; +#  endif +}; + +#else + +struct msqid_ds +{ +  struct ipc_perm msg_perm;     /* structure describing operation permission */ +  __time_t msg_stime;           /* time of last msgsnd command */ +  __time_t msg_rtime;           /* time of last msgrcv command */ +  __time_t msg_ctime;           /* time of last change */ +  unsigned long int __msg_cbytes; /* current number of bytes on queue */ +  msgqnum_t msg_qnum;           /* number of messages currently on queue */ +  msglen_t msg_qbytes;          /* max number of bytes allowed on queue */ +  __pid_t msg_lspid;            /* pid of last msgsnd() */ +  __pid_t msg_lrpid;            /* pid of last msgrcv() */ +  unsigned long int __uclibc_unused4; +  unsigned long int __uclibc_unused5;  }; +#endif +  #ifdef __USE_MISC  # define msg_cbytes	__msg_cbytes diff --git a/libc/sysdeps/linux/mips/bits/resource.h b/libc/sysdeps/linux/mips/bits/resource.h index b204aefd6..97487d274 100644 --- a/libc/sysdeps/linux/mips/bits/resource.h +++ b/libc/sysdeps/linux/mips/bits/resource.h @@ -99,7 +99,13 @@ enum __rlimit_resource    __RLIMIT_RTPRIO = 14,  #define RLIMIT_RTPRIO __RLIMIT_RTPRIO -  __RLIMIT_NLIMITS = 15, +  /* Maximum CPU time in µs that a process scheduled under a real-time +     scheduling policy may consume without making a blocking system +     call before being forcibly descheduled.  */ +  __RLIMIT_RTTIME = 15, +#define RLIMIT_RTTIME __RLIMIT_RTTIME + +  __RLIMIT_NLIMITS = 16,    __RLIM_NLIMITS = __RLIMIT_NLIMITS  #define RLIMIT_NLIMITS __RLIMIT_NLIMITS  #define RLIM_NLIMITS __RLIM_NLIMITS @@ -117,10 +123,10 @@ enum __rlimit_resource  # ifndef __USE_FILE_OFFSET64  #  define RLIM_INFINITY ((long int)(~0UL >> 1))  # else -#  define RLIM_INFINITY 0x7fffffffffffffffULL +#  define RLIM_INFINITY 0xffffffffffffffffULL  # endif  # ifdef __USE_LARGEFILE64 -#  define RLIM64_INFINITY 0x7fffffffffffffffULL +#  define RLIM64_INFINITY 0xffffffffffffffffULL  # endif  #endif @@ -167,6 +173,15 @@ enum __rusage_who    /* All of its terminated child processes.  */    RUSAGE_CHILDREN = -1  #define RUSAGE_CHILDREN RUSAGE_CHILDREN + +#ifdef __USE_GNU +  , +  /* The calling thread.  */ +  RUSAGE_THREAD = 1 +# define RUSAGE_THREAD RUSAGE_THREAD +  /* Name for the same functionality on Solaris.  */ +# define RUSAGE_LWP RUSAGE_THREAD +#endif  };  #define __need_timeval diff --git a/libc/sysdeps/linux/mips/bits/sem.h b/libc/sysdeps/linux/mips/bits/sem.h index 3e4e9682b..230d04868 100644 --- a/libc/sysdeps/linux/mips/bits/sem.h +++ b/libc/sysdeps/linux/mips/bits/sem.h @@ -38,11 +38,23 @@  struct semid_ds  {    struct ipc_perm sem_perm;		/* operation permission struct */ -  __time_t sem_otime;			/* last semop() time */ +#if (__WORDSIZE == 32) && defined(__UCLIBC_USE_TIME64__) +  unsigned long int __sem_otime_internal_1; /* last semop() time */ +  unsigned long int __sem_ctime_internal_1; /* last time changed by semctl() */ +#else +  __time_t sem_otime;                  /* last semop() time */    __time_t sem_ctime;			/* last time changed by semctl() */ +#endif    unsigned long int sem_nsems;		/* number of semaphores in set */ +#if (__WORDSIZE == 32) && defined(__UCLIBC_USE_TIME64__) +  unsigned long int __sem_otime_internal_2; +  unsigned long int __sem_ctime_internal_2; +  __time_t sem_otime; +  __time_t sem_ctime; +#else    unsigned long int __uclibc_unused1;    unsigned long int __uclibc_unused2; +#endif  };  /* The user should define a union like the following to use it for arguments diff --git a/libc/sysdeps/linux/mips/bits/shm.h b/libc/sysdeps/linux/mips/bits/shm.h index bb87ba13d..1855a50b2 100644 --- a/libc/sysdeps/linux/mips/bits/shm.h +++ b/libc/sysdeps/linux/mips/bits/shm.h @@ -46,14 +46,32 @@ struct shmid_ds    {      struct ipc_perm shm_perm;		/* operation permission struct */      size_t shm_segsz;			/* size of segment in bytes */ -    __time_t shm_atime;			/* time of last shmat() */ -    __time_t shm_dtime;			/* time of last shmdt() */ -    __time_t shm_ctime;			/* time of last change by shmctl() */ +#if (__WORDSIZE == 32) && defined(__UCLIBC_USE_TIME64__) +    unsigned long int shm_atime_internal_1;		/* time of last shmat() */ +    unsigned long int shm_dtime_internal_1;		/* time of last shmdt() */ +    unsigned long int shm_ctime_internal_1;		/* time of last change by shmctl() */ +#else +    __time_t shm_atime; +    __time_t shm_dtime; +    __time_t shm_ctime; +#endif      __pid_t shm_cpid;			/* pid of creator */      __pid_t shm_lpid;			/* pid of last shmop */      shmatt_t shm_nattch;		/* number of current attaches */ -    unsigned long int __uclibc_unused1; -    unsigned long int __uclibc_unused2; +#if (__WORDSIZE == 32) && defined(__UCLIBC_USE_TIME64__) +    unsigned short int shm_atime_internal_2;		/* time of last shmat() */ +    unsigned short int shm_dtime_internal_2;		/* time of last shmdt() */ +    unsigned short int shm_ctime_internal_2;		/* time of last change by shmctl() */ +    unsigned short int __uclibc_unused1; +    __time_t shm_atime; +    __time_t shm_dtime; +    __time_t shm_ctime; +#else +    unsigned short int __uclibc_unused1; +    unsigned short int __uclibc_unused2; +    unsigned short int __uclibc_unused3; +    unsigned short int __uclibc_unused4; +#endif    };  #ifdef __USE_MISC diff --git a/libc/sysdeps/linux/mips/bits/stat.h b/libc/sysdeps/linux/mips/bits/stat.h index 539fa33d2..81d2e4687 100644 --- a/libc/sysdeps/linux/mips/bits/stat.h +++ b/libc/sysdeps/linux/mips/bits/stat.h @@ -60,7 +60,7 @@ struct stat      long int st_pad2[2];      __off64_t st_size;		/* Size of file, in bytes.  */  #endif -#ifdef __USE_MISC +#if defined(__USE_MISC) || defined(__USE_XOPEN2K8)      /* Nanosecond resolution timestamps are stored in a format         equivalent to 'struct timespec'.  This is the type used         whenever possible but the Unix namespace rules do not allow the @@ -103,7 +103,7 @@ struct stat {      unsigned int st_rdev;	/* Device number, if device.  */      int st_pad2[3];      __off_t st_size;		/* Size of file, in bytes.  */ -#ifdef __USE_MISC +#if defined(__USE_MISC) || defined(__USE_XOPEN2K8)      /* Nanosecond resolution timestamps are stored in a format         equivalent to 'struct timespec'.  This is the type used         whenever possible but the Unix namespace rules do not allow the @@ -145,7 +145,7 @@ struct stat64      __dev_t st_rdev;	/* Device number, if device.  */      long int st_pad2[2];      __off64_t st_size;		/* Size of file, in bytes.  */ -#ifdef __USE_MISC +#if defined(__USE_MISC) || defined(__USE_XOPEN2K8)      /* Nanosecond resolution timestamps are stored in a format         equivalent to 'struct timespec'.  This is the type used         whenever possible but the Unix namespace rules do not allow the @@ -184,7 +184,7 @@ struct stat64 {      unsigned int st_rdev;	/* Device number, if device.  */      int st_pad2[3];      __off_t st_size;		/* Size of file, in bytes.  */ -#ifdef __USE_MISC +#if defined(__USE_MISC) || defined(__USE_XOPEN2K8)      /* Nanosecond resolution timestamps are stored in a format         equivalent to 'struct timespec'.  This is the type used         whenever possible but the Unix namespace rules do not allow the diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h index 13728ac55..64b42ffb1 100644 --- a/libc/sysdeps/linux/mips/bits/syscalls.h +++ b/libc/sysdeps/linux/mips/bits/syscalls.h @@ -184,7 +184,7 @@  ({									\  	long _sys_result;						\  									\ -	FORCE_FRAME_POINTER;						\ +	int* array = FORCE_FRAME_POINTER;				\  	{								\  	register long __v0 __asm__("$2") ncs_init;			\  	register long __a0 __asm__("$4") = (long) arg1;			\ @@ -193,15 +193,16 @@  	register long __a3 __asm__("$7") = (long) arg4;			\  	__asm__ __volatile__ (						\  	".set\tnoreorder\n\t"						\ -	"subu\t$29, 32\n\t"						\ +	"subu\t$29, 32\n\t"                                             \  	"sw\t%6, 16($29)\n\t"						\  	cs_init								\  	"syscall\n\t"							\ -	"addiu\t$29, 32\n\t"						\ -	".set\treorder"						\ +	"addiu\t$29, 32\n\t"                                            \ +	"addiu\t%7, %7, 0\n\t"						\ +	".set\treorder"						        \  	: "=r" (__v0), "+r" (__a3)					\  	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\ -	  "r" ((long)arg5)						\ +	  "r" ((long)arg5), "r" (array)					\  	: __SYSCALL_CLOBBERS);						\  	err = __a3;							\  	_sys_result = __v0;						\ @@ -213,7 +214,7 @@  ({									\  	long _sys_result;						\  									\ -	FORCE_FRAME_POINTER;						\ +	int* array = FORCE_FRAME_POINTER;				\  	{								\  	register long __v0 __asm__("$2") ncs_init;			\  	register long __a0 __asm__("$4") = (long) arg1;			\ @@ -221,17 +222,18 @@  	register long __a2 __asm__("$6") = (long) arg3;			\  	register long __a3 __asm__("$7") = (long) arg4;			\  	__asm__ __volatile__ (						\ -	".set\tnoreorder\n\t"						\ -	"subu\t$29, 32\n\t"						\ +	".set\tnoreorder\n\t"                                           \ +	"subu\t$29, 32\n\t"                                             \  	"sw\t%6, 16($29)\n\t"						\  	"sw\t%7, 20($29)\n\t"						\  	cs_init								\  	"syscall\n\t"							\ -	"addiu\t$29, 32\n\t"						\ -	".set\treorder"						\ +	"addiu\t$29, 32\n\t"                                            \ +	"addiu\t%8, %8, 0\n\t"						\ +	".set\treorder"						        \  	: "=r" (__v0), "+r" (__a3)					\  	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\ -	  "r" ((long)arg5), "r" ((long)arg6)				\ +	  "r" ((long)arg5), "r" ((long)arg6), "r" (array)		\  	: __SYSCALL_CLOBBERS);						\  	err = __a3;							\  	_sys_result = __v0;						\ @@ -243,7 +245,7 @@  ({									\  	long _sys_result;						\  									\ -	FORCE_FRAME_POINTER;						\ +	int* array = FORCE_FRAME_POINTER;				\  	{								\  	register long __v0 __asm__("$2") ncs_init;			\  	register long __a0 __asm__("$4") = (long) arg1;			\ @@ -252,17 +254,19 @@  	register long __a3 __asm__("$7") = (long) arg4;			\  	__asm__ __volatile__ (						\  	".set\tnoreorder\n\t"						\ -	"subu\t$29, 32\n\t"						\ +	"subu\t$29, 32\n\t"                                             \  	"sw\t%6, 16($29)\n\t"						\  	"sw\t%7, 20($29)\n\t"						\  	"sw\t%8, 24($29)\n\t"						\  	cs_init								\  	"syscall\n\t"							\ -	"addiu\t$29, 32\n\t"						\ -	".set\treorder"						\ +	"addiu\t$29, 32\n\t"                                            \ +	"addiu\t%9, %9, 0\n\t"						\ +	".set\treorder"							\  	: "=r" (__v0), "+r" (__a3)					\  	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\ -	  "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7)		\ +	  "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7),		\ +	  "r" (array)							\  	: __SYSCALL_CLOBBERS);						\  	err = __a3;							\  	_sys_result = __v0;						\ diff --git a/libc/sysdeps/linux/mips/bits/uClibc_arch_features.h b/libc/sysdeps/linux/mips/bits/uClibc_arch_features.h index 59d9f0807..bcdf124a4 100644 --- a/libc/sysdeps/linux/mips/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/mips/bits/uClibc_arch_features.h @@ -12,9 +12,6 @@  /* can your target use syscall6() for mmap ? */  #define __UCLIBC_MMAP_HAS_6_ARGS__ -/* does your target use statx */ -#undef __UCLIBC_HAVE_STATX__ -  /* does your target align 64bit values in register pairs ? (32bit arches only) */  #if _MIPS_SIM == _ABIO32  #define __UCLIBC_SYSCALL_ALIGN_64BIT__ | 
