diff options
Diffstat (limited to 'libc/sysdeps/linux/m68k')
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/fcntl.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/fenv.h | 98 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/shm.h | 108 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/stat.h | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h | 3 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bsd-_setjmp.S | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/bsd-setjmp.S | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/clone.S | 12 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/crt1.S | 10 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/fpu_control.h | 77 | ||||
| -rw-r--r-- | libc/sysdeps/linux/m68k/setjmp.S | 4 | 
11 files changed, 255 insertions, 71 deletions
| diff --git a/libc/sysdeps/linux/m68k/bits/fcntl.h b/libc/sysdeps/linux/m68k/bits/fcntl.h index 5a56c8781..92c0964d9 100644 --- a/libc/sysdeps/linux/m68k/bits/fcntl.h +++ b/libc/sysdeps/linux/m68k/bits/fcntl.h @@ -244,3 +244,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/m68k/bits/fenv.h b/libc/sysdeps/linux/m68k/bits/fenv.h index b07f0ab51..37c5fe829 100644 --- a/libc/sysdeps/linux/m68k/bits/fenv.h +++ b/libc/sysdeps/linux/m68k/bits/fenv.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +/* Copyright (C) 1997-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 +#if defined __HAVE_68881__ || defined __HAVE_FPU__ || defined __mcffpu__ +  /* Define bits representing the exception.  We use the bit positions of     the appropriate bits in the FPSR Accrued Exception Byte.  */  enum    { -    FE_INEXACT = 1 << 3, -#define FE_INEXACT	FE_INEXACT -    FE_DIVBYZERO = 1 << 4, -#define FE_DIVBYZERO	FE_DIVBYZERO -    FE_UNDERFLOW = 1 << 5, -#define FE_UNDERFLOW	FE_UNDERFLOW -    FE_OVERFLOW = 1 << 6, -#define FE_OVERFLOW	FE_OVERFLOW -    FE_INVALID = 1 << 7 -#define FE_INVALID	FE_INVALID +    FE_INEXACT = +# define FE_INEXACT	(1 << 3) +      FE_INEXACT, +    FE_DIVBYZERO = +# define FE_DIVBYZERO	(1 << 4) +      FE_DIVBYZERO, +    FE_UNDERFLOW = +# define FE_UNDERFLOW	(1 << 5) +      FE_UNDERFLOW, +    FE_OVERFLOW = +# define FE_OVERFLOW	(1 << 6) +      FE_OVERFLOW, +    FE_INVALID = +# define FE_INVALID	(1 << 7) +      FE_INVALID    }; -#define FE_ALL_EXCEPT \ +# define FE_ALL_EXCEPT \  	(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)  /* The m68k FPU supports all of the four defined rounding modes.  We use @@ -44,21 +50,45 @@ enum     appropriate macros.  */  enum    { -    FE_TONEAREST = 0, -#define FE_TONEAREST	FE_TONEAREST -    FE_TOWARDZERO = 1 << 4, -#define FE_TOWARDZERO	FE_TOWARDZERO -    FE_DOWNWARD = 2 << 4, -#define FE_DOWNWARD	FE_DOWNWARD -    FE_UPWARD = 3 << 4 -#define FE_UPWARD	FE_UPWARD +    FE_TONEAREST = +# define FE_TONEAREST	0 +      FE_TONEAREST, +    FE_TOWARDZERO = +# define FE_TOWARDZERO	(1 << 4) +      FE_TOWARDZERO, +    FE_DOWNWARD = +# define FE_DOWNWARD	(2 << 4) +      FE_DOWNWARD, +    FE_UPWARD = +# define FE_UPWARD	(3 << 4) +      FE_UPWARD    }; +#else + +/* In the soft-float case, only rounding to nearest is supported, with +   no exceptions.  */ + +# define FE_ALL_EXCEPT 0 + +enum +  { +    __FE_UNDEFINED = -1, + +    FE_TONEAREST = +# define FE_TONEAREST	0 +      FE_TONEAREST +  }; + +#endif +  /* Type representing exception flags.  */  typedef unsigned int fexcept_t; +#if defined __HAVE_68881__ || defined __HAVE_FPU__ || defined __mcffpu__ +  /* Type representing floating-point environment.  This structure     corresponds to the layout of the block written by `fmovem'.  */  typedef struct @@ -69,10 +99,30 @@ typedef struct    }  fenv_t; +#else + +/* Keep ABI compatibility with the type used in the generic +   bits/fenv.h, formerly used for no-FPU ColdFire.  */ +typedef struct +  { +    fexcept_t __excepts; +  } +fenv_t; + +#endif +  /* 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 __HAVE_68881__	\ +			  || defined __HAVE_FPU__	\ +			  || defined __mcffpu__)  /* Floating-point environment where none of the exceptions are 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/m68k/bits/shm.h b/libc/sysdeps/linux/m68k/bits/shm.h new file mode 100644 index 000000000..aa1a72e54 --- /dev/null +++ b/libc/sysdeps/linux/m68k/bits/shm.h @@ -0,0 +1,108 @@ +/* Copyright (C) 1995,1996,1997,2000,2002,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 +   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. + +   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. + +   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/>.  */ + +#ifndef _SYS_SHM_H +# error "Never include <bits/shm.h> directly; use <sys/shm.h> instead." +#endif + +#include <bits/types.h> + +/* Permission flag for shmget.  */ +#define SHM_R		0400		/* or S_IRUGO from <linux/stat.h> */ +#define SHM_W		0200		/* or S_IWUGO from <linux/stat.h> */ + +/* Flags for `shmat'.  */ +#define SHM_RDONLY	010000		/* attach read-only else read-write */ +#define SHM_RND		020000		/* round attach address to SHMLBA */ +#define SHM_REMAP	040000		/* take-over region on attach */ + +/* Commands for `shmctl'.  */ +#define SHM_LOCK	11		/* lock segment (root only) */ +#define SHM_UNLOCK	12		/* unlock segment (root only) */ + +__BEGIN_DECLS + +/* Segment low boundary address multiple.  */ +#define SHMLBA		(__getpagesize () << 2) +extern int __getpagesize (void) __THROW __attribute__ ((__const__)); + + +/* Type to count number of attaches.  */ +typedef unsigned long int shmatt_t; + +/* Data structure describing a set of semaphores.  */ +struct shmid_ds +  { +    struct ipc_perm shm_perm;		/* operation permission struct */ +    size_t shm_segsz;			/* size of segment in bytes */ +#if defined(__UCLIBC_USE_TIME64__) +    __time_t shm_atime; +    __time_t shm_dtime; +    __time_t shm_ctime; +#else +    __time_t shm_atime;			/* time of last shmat() */ +    unsigned long int __uclibc_unused1; +    __time_t shm_dtime;			/* time of last shmdt() */ +    unsigned long int __uclibc_unused2; +    __time_t shm_ctime;			/* time of last change by shmctl() */ +    unsigned long int __uclibc_unused3; +#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_unused4; +    unsigned long int __uclibc_unused5; +  }; + +#ifdef __USE_MISC + +/* ipcs ctl commands */ +# define SHM_STAT 	13 +# 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_HUGETLB	04000	/* segment is mapped via hugetlb */ +# define SHM_NORESERVE	010000	/* don't check for reservations */ + +struct	shminfo +  { +    unsigned long int shmmax; +    unsigned long int shmmin; +    unsigned long int shmmni; +    unsigned long int shmseg; +    unsigned long int shmall; +    unsigned long int __uclibc_unused1; +    unsigned long int __uclibc_unused2; +    unsigned long int __uclibc_unused3; +    unsigned long int __uclibc_unused4; +  }; + +struct shm_info +  { +    int used_ids; +    unsigned long int shm_tot;	/* total allocated shm */ +    unsigned long int shm_rss;	/* total resident shm */ +    unsigned long int shm_swp;	/* total swapped shm */ +    unsigned long int swap_attempts; +    unsigned long int swap_successes; +  }; + +#endif /* __USE_MISC */ + +__END_DECLS diff --git a/libc/sysdeps/linux/m68k/bits/stat.h b/libc/sysdeps/linux/m68k/bits/stat.h index 7b9c3d144..70da1b384 100644 --- a/libc/sysdeps/linux/m68k/bits/stat.h +++ b/libc/sysdeps/linux/m68k/bits/stat.h @@ -60,7 +60,7 @@ struct stat  #else      __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */  #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 @@ -106,7 +106,7 @@ struct stat64      __blksize_t st_blksize;		/* Optimal block size for I/O.  */      __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */ -#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/m68k/bits/uClibc_arch_features.h b/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h index 7baae5007..5cfaa4343 100644 --- a/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h @@ -15,9 +15,6 @@  /* can your target use syscall6() for mmap ? */  #undef __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) */  #undef __UCLIBC_SYSCALL_ALIGN_64BIT__ diff --git a/libc/sysdeps/linux/m68k/bsd-_setjmp.S b/libc/sysdeps/linux/m68k/bsd-_setjmp.S index c963cccf5..eaabce8ed 100644 --- a/libc/sysdeps/linux/m68k/bsd-_setjmp.S +++ b/libc/sysdeps/linux/m68k/bsd-_setjmp.S @@ -13,7 +13,9 @@ _setjmp:  	moveal	%sp@(4), %a0  	movel	%sp@(0), %a0@(JB_PC)  	moveml	%d2-%d7/%a2-%a7, %a0@(JB_REGS) -#if defined __HAVE_68881__ || defined __UCLIBC_HAS_FPU__ +#if defined(__mcffpu__) && defined(__UCLIBC_HAS_FPU__) +	fmovemd %fp2-%fp7, %a0@(JB_FPREGS) +#elif defined(__HAVE_68881__)  	fmovemx %fp2-%fp7, %a0@(JB_FPREGS)  #endif  	clrl	%d0 diff --git a/libc/sysdeps/linux/m68k/bsd-setjmp.S b/libc/sysdeps/linux/m68k/bsd-setjmp.S index 9daf27713..7d76d192b 100644 --- a/libc/sysdeps/linux/m68k/bsd-setjmp.S +++ b/libc/sysdeps/linux/m68k/bsd-setjmp.S @@ -14,7 +14,9 @@ setjmp:  	moveal	%sp@(4), %a0  	movel	%sp@(0), %a0@(JB_PC)  	moveml	%d2-%d7/%a2-%a7, %a0@(JB_REGS) -#if defined __HAVE_68881__ || defined __UCLIBC_HAS_FPU__ +#if defined(__mcffpu__) && defined(__UCLIBC_HAS_FPU__) +	fmovemd %fp2-%fp7, %a0@(JB_FPREGS) +#elif defined(__HAVE_68881__)  	fmovemx %fp2-%fp7, %a0@(JB_FPREGS)  #endif  	clrl	%d0 diff --git a/libc/sysdeps/linux/m68k/clone.S b/libc/sysdeps/linux/m68k/clone.S index 24071235b..a83d90a98 100644 --- a/libc/sysdeps/linux/m68k/clone.S +++ b/libc/sysdeps/linux/m68k/clone.S @@ -35,12 +35,14 @@  __clone:  	/* Sanity check arguments.  */ -	movel	#-EINVAL, %d0 -	movel	4(%sp), %a0		/* no NULL function pointers */ -	tstl	%a0 +	movel   #-EINVAL, %d0 +	movel   4(%sp), %d1             /* no NULL function pointers */ +	movel   %d1, %a0 +	tstl    %d1  	beq.w	__syscall_error_trampoline -	movel	8(%sp), %a1		/* no NULL stack pointers */ -	tstl	%a1 +	movel   8(%sp), %d1             /* no NULL stack pointers */ +	movel   %d1, %a1 +	tstl    %d1  	beq.w   __syscall_error_trampoline  	/* Allocate space and copy the argument onto the new stack.  */ diff --git a/libc/sysdeps/linux/m68k/crt1.S b/libc/sysdeps/linux/m68k/crt1.S index 815a6076f..e7292682b 100644 --- a/libc/sysdeps/linux/m68k/crt1.S +++ b/libc/sysdeps/linux/m68k/crt1.S @@ -78,9 +78,13 @@ _start:  	sub.l %fp, %fp  #if !defined __ARCH_USE_MMU__ && defined __PIC__ +#ifdef UCLIBC_FORMAT_ELF +	move.l #_GLOBAL_OFFSET_TABLE_, %a5 +#else  	/* Set up the global pointer.  The GOT is at the beginning of the  	   data segment, whose address is in %d5.  */  	move.l %d5,%a5 +#endif  	.equ have_current_got, 1  #endif @@ -92,11 +96,11 @@ _start:  	   arguments for `main': argc, argv.  envp will be determined  	   later in __libc_start_main.  */  	move.l (%sp)+, %d0	/* Pop the argument count.  */ -#ifndef __ARCH_USE_MMU__ -	move.l (%sp)+, %a0 -#else +#if defined(__ARCH_USE_MMU__) || defined(__UCLIBC_FORMAT_ELF__)  	move.l %sp, %a0		/* The argument vector starts just at the  				   current stack top.  */ +#else +	move.l (%sp)+, %a0  #endif  	/* Provide the highest stack address to the user code (for stacks diff --git a/libc/sysdeps/linux/m68k/fpu_control.h b/libc/sysdeps/linux/m68k/fpu_control.h index 35ad95e6d..c3a9c6326 100644 --- a/libc/sysdeps/linux/m68k/fpu_control.h +++ b/libc/sysdeps/linux/m68k/fpu_control.h @@ -1,6 +1,5 @@  /* 68k FPU control word definitions. -   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. -   This file is part of the GNU C Library. +   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 @@ -13,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 @@ -29,9 +28,9 @@   * 12     -> enable trap for OVFL exception   * 11     -> enable trap for UNFL exception   * 10     -> enable trap for DZ exception - *  9     -> enable trap for INEX2 exception - *  8     -> enable trap for INEX1 exception - *  7-6   -> Precision Control + *  9     -> enable trap for INEX2 exception (INEX on Coldfire) + *  8     -> enable trap for INEX1 exception (IDE on Coldfire) + *  7-6   -> Precision Control (only bit 6 is used on Coldfire)   *  5-4   -> Rounding Control   *  3-0   -> zero (read as 0, write as 0)   * @@ -53,50 +52,66 @@  #include <features.h> +#if defined (__mcoldfire__) && !defined (__mcffpu__) + +# define _FPU_RESERVED 0xffffffff +# define _FPU_DEFAULT  0x00000000 +# define _FPU_GETCW(cw) ((cw) = 0) +# define _FPU_SETCW(cw) ((void) (cw)) + +#else +  /* masking of interrupts */ -#define _FPU_MASK_BSUN  0x8000 -#define _FPU_MASK_SNAN  0x4000 -#define _FPU_MASK_OPERR 0x2000 -#define _FPU_MASK_OVFL  0x1000 -#define _FPU_MASK_UNFL  0x0800 -#define _FPU_MASK_DZ    0x0400 -#define _FPU_MASK_INEX1 0x0200 -#define _FPU_MASK_INEX2 0x0100 +# define _FPU_MASK_BSUN  0x8000 +# define _FPU_MASK_SNAN  0x4000 +# define _FPU_MASK_OPERR 0x2000 +# define _FPU_MASK_OVFL  0x1000 +# define _FPU_MASK_UNFL  0x0800 +# define _FPU_MASK_DZ    0x0400 +# define _FPU_MASK_INEX1 0x0200 +# define _FPU_MASK_INEX2 0x0100  /* precision control */ -#define _FPU_EXTENDED 0x00   /* RECOMMENDED */ -#define _FPU_DOUBLE   0x80 -#define _FPU_SINGLE   0x40     /* DO NOT USE */ +# ifdef __mcoldfire__ +#  define _FPU_DOUBLE   0x00 +# else +#  define _FPU_EXTENDED 0x00   /* RECOMMENDED */ +#  define _FPU_DOUBLE   0x80 +# endif +# define _FPU_SINGLE   0x40     /* DO NOT USE */  /* rounding control */ -#define _FPU_RC_NEAREST 0x00    /* RECOMMENDED */ -#define _FPU_RC_ZERO    0x10 -#define _FPU_RC_DOWN    0x20 -#define _FPU_RC_UP      0x30 +# define _FPU_RC_NEAREST 0x00    /* RECOMMENDED */ +# define _FPU_RC_ZERO    0x10 +# define _FPU_RC_DOWN    0x20 +# define _FPU_RC_UP      0x30 -#define _FPU_RESERVED 0xFFFF000F  /* Reserved bits in fpucr */ +# ifdef __mcoldfire__ +#  define _FPU_RESERVED 0xFFFF800F +# else +#  define _FPU_RESERVED 0xFFFF000F  /* Reserved bits in fpucr */ +# endif  /* Now two recommended fpucr */  /* The fdlibm code requires no interrupts for exceptions.  Don't     change the rounding mode, it would break long double I/O!  */ -#define _FPU_DEFAULT  0x00000000 +# define _FPU_DEFAULT  0x00000000  /* IEEE:  same as above, but exceptions.  We must make it non-zero so     that __setfpucw works.  This bit will be ignored.  */ -#define _FPU_IEEE     0x00000001 +# define _FPU_IEEE     0x00000001 + +/* Macros for accessing the hardware control word.  */ +# define _FPU_GETCW(cw) __asm__ ("fmove%.l %!, %0" : "=dm" (cw)) +# define _FPU_SETCW(cw) __asm__ volatile ("fmove%.l %0, %!" : : "dm" (cw)) +#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__ ("fmove%.l %!, %0" : "=dm" (cw)) -#define _FPU_SETCW(cw) __asm__ __volatile__ ("fmove%.l %0, %!" : : "dm" (cw)) - -#if 0  /* Default control word set at startup.  */  extern fpu_control_t __fpu_control; -#endif  #endif /* _M68K_FPU_CONTROL_H */ diff --git a/libc/sysdeps/linux/m68k/setjmp.S b/libc/sysdeps/linux/m68k/setjmp.S index 5f05b8591..d10163ec6 100644 --- a/libc/sysdeps/linux/m68k/setjmp.S +++ b/libc/sysdeps/linux/m68k/setjmp.S @@ -14,7 +14,9 @@ __sigsetjmp:  	moveal	%sp@(4), %a0  	movel	%sp@(0), %a0@(JB_PC)  	moveml	%d2-%d7/%a2-%a7, %a0@(JB_REGS) -#if defined __HAVE_68881__ || defined __UCLIBC_HAS_FPU__ +#if defined(__mcffpu__) && defined (__UCLIBC_HAS_FPU__) +	fmovemd %fp2-%fp7, %a0@(JB_FPREGS) +#elif defined(__HAVE_68881__)  	fmovemx %fp2-%fp7, %a0@(JB_FPREGS)  #endif  	clrl	%d0 | 
