diff options
Diffstat (limited to 'libc/sysdeps/linux/mips')
| -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 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/crt1.S | 23 | ||||
| -rw-r--r-- | libc/sysdeps/linux/mips/fpu_control.h | 68 | 
12 files changed, 288 insertions, 95 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__ diff --git a/libc/sysdeps/linux/mips/crt1.S b/libc/sysdeps/linux/mips/crt1.S index 083615515..7c4db447c 100644 --- a/libc/sysdeps/linux/mips/crt1.S +++ b/libc/sysdeps/linux/mips/crt1.S @@ -78,6 +78,10 @@  	.weak	_init  	.weak	_fini  #endif +#ifdef L_rcrt1 +	.type	reloc_static_pie,@function +	.hidden	.L0 +#endif  	.type	    main,@function  	.type	    __uClibc_main,@function  	.ent	__start @@ -90,6 +94,25 @@ __start:  	PTR_LA $28, _gp             /* Setup GP correctly if we're non-PIC.  */  	move $31, $0  #endif +#ifdef L_rcrt1 +	PTR_LA $4, _DYNAMIC           /* Place _DYNAMIC into the GOT */ +	REG_S $4, -0x7ff0($28)        /* offset to GOT stolen from dl-startup */ +	jal .L0                       /* Get the current $pc address */ +.L0: +	PTR_SUBU $4, $31, $25         /* Calculate load addr */ +	move $31, $0                  /* Clear ra */ +	and $29, -2 * SZREG           /* Ensure stack is aligned */ +	PTR_ADDIU $29, (-2 * SZREG)   /* Allocate 2 register spaces on stack */ +	REG_S $2, SZREG($29)          /* Store atexit in case it exists */ +	PTR_LA $5, reloc_static_pie   /* function calls before relocation +	                                 don't work unless we set $t9 manually */ +	PTR_ADDU $25, $4, $5          /* store reloc_static_pie in $t9 */ +	jalr $25                      /* call reloc_static_pie */ +	nop							  /* delay slot, just in case */ +	REG_L $2, SZREG($29)          /* cleanup stack */ +	PTR_ADDIU $29, $29, (2 * SZREG) + +#endif  	PTR_LA $4, main		/* main */  	PTR_L $5, 0($29)		/* argc */ diff --git a/libc/sysdeps/linux/mips/fpu_control.h b/libc/sysdeps/linux/mips/fpu_control.h index f855af506..6aa05e4cf 100644 --- a/libc/sysdeps/linux/mips/fpu_control.h +++ b/libc/sysdeps/linux/mips/fpu_control.h @@ -1,7 +1,5 @@  /* FPU control word bits.  Mips version. -   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Olaf Flebbe and Ralf Baechle. +   Copyright (C) 1996-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 @@ -14,8 +12,8 @@     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 _FPU_CONTROL_H  #define _FPU_CONTROL_H @@ -28,7 +26,10 @@   *           causing unimplemented operation exception.  This bit is only   *           available for MIPS III and newer.   * 23     -> Condition bit - * 22-18  -> reserved (read as 0, write with 0) + * 22-21  -> reserved for architecture implementers + * 20     -> reserved (read as 0, write with 0) + * 19     -> IEEE 754-2008 non-arithmetic ABS.fmt and NEG.fmt enable + * 18     -> IEEE 754-2008 recommended NaN encoding enable   * 17     -> cause bit for unimplemented operation   * 16     -> cause bit for invalid exception   * 15     -> cause bit for division by zero exception @@ -57,43 +58,74 @@  #include <features.h> -/* masking of interrupts */ +#ifdef __mips_soft_float + +#define _FPU_RESERVED 0xffffffff +#define _FPU_DEFAULT  0x00000000 +typedef unsigned int fpu_control_t; +#define _FPU_GETCW(cw) (cw) = 0 +#define _FPU_SETCW(cw) (void) (cw) +extern fpu_control_t __fpu_control; + +#else /* __mips_soft_float */ + +/* Masks for interrupts.  */  #define _FPU_MASK_V     0x0800  /* Invalid operation */  #define _FPU_MASK_Z     0x0400  /* Division by zero  */  #define _FPU_MASK_O     0x0200  /* Overflow          */  #define _FPU_MASK_U     0x0100  /* Underflow         */  #define _FPU_MASK_I     0x0080  /* Inexact operation */ -/* flush denormalized numbers to zero */ +/* Flush denormalized numbers to zero.  */  #define _FPU_FLUSH_TZ   0x1000000 -/* rounding control */ +/* IEEE 754-2008 compliance control.  */ +#define _FPU_ABS2008    0x80000 +#define _FPU_NAN2008    0x40000 + +/* Rounding control.  */  #define _FPU_RC_NEAREST 0x0     /* RECOMMENDED */  #define _FPU_RC_ZERO    0x1  #define _FPU_RC_UP      0x2  #define _FPU_RC_DOWN    0x3 +/* Mask for rounding control.  */ +#define _FPU_RC_MASK	0x3 -#define _FPU_RESERVED 0xfe3c0000  /* Reserved bits in cw */ +#define _FPU_RESERVED 0xfe8c0000  /* Reserved bits in cw, incl ABS/NAN2008.  */  /* The fdlibm code requires strict IEEE double precision arithmetic,     and no interrupts for exceptions, rounding to nearest.  */ +#ifdef __mips_nan2008 +# define _FPU_DEFAULT 0x000C0000 +#else +# define _FPU_DEFAULT 0x00000000 +#endif -#define _FPU_DEFAULT  0x00000000 - -/* IEEE:  same as above, but exceptions */ -#define _FPU_IEEE     0x00000F80 +/* IEEE: same as above, but exceptions.  */ +#ifdef __mips_nan2008 +# define _FPU_IEEE    0x000C0F80 +#else +# define _FPU_IEEE    0x00000F80 +#endif  /* Type of the control word.  */  typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));  /* Macros for accessing the hardware control word.  */ -#define _FPU_GETCW(cw) __asm__ ("cfc1 %0,$31" : "=r" (cw)) -#define _FPU_SETCW(cw) __asm__ ("ctc1 %0,$31" : : "r" (cw)) +extern fpu_control_t __mips_fpu_getcw (void) __THROW; +extern void __mips_fpu_setcw (fpu_control_t) __THROW; +#ifdef __mips16 +# define _FPU_GETCW(cw) do { (cw) = __mips_fpu_getcw (); } while (0) +# define _FPU_SETCW(cw) __mips_fpu_setcw (cw) +#else +# define _FPU_GETCW(cw) __asm__ volatile ("cfc1 %0,$31" : "=r" (cw)) +# define _FPU_SETCW(cw) __asm__ volatile ("ctc1 %0,$31" : : "r" (cw)) +#endif -#if 0  /* Default control word set at startup.  */  extern fpu_control_t __fpu_control; -#endif + +#endif /* __mips_soft_float */  #endif	/* fpu_control.h */ | 
