diff options
Diffstat (limited to 'libc/sysdeps/linux/riscv64/bits')
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/atomic.h | 170 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/fcntl.h | 3 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/fenv.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/shm.h | 7 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/uClibc_arch_features.h | 4 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/uClibc_page.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/riscv64/bits/wordsize.h | 3 | 
7 files changed, 180 insertions, 11 deletions
| diff --git a/libc/sysdeps/linux/riscv64/bits/atomic.h b/libc/sysdeps/linux/riscv64/bits/atomic.h new file mode 100644 index 000000000..8bf6abfac --- /dev/null +++ b/libc/sysdeps/linux/riscv64/bits/atomic.h @@ -0,0 +1,170 @@ +/* Copyright (C) 2003-2017 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 +   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 _RISCV64_ATOMIC_MACHINE_H +#define _RISCV64_ATOMIC_MACHINE_H	1 + +#define typeof __typeof__ + +#include <stdint.h> +#include <sysdep.h> + +typedef int8_t  atomic8_t; +typedef int16_t atomic16_t; +typedef int32_t atomic32_t; +typedef int64_t atomic64_t; + +typedef uint8_t  uatomic8_t; +typedef uint16_t uatomic16_t; +typedef uint32_t uatomic32_t; +typedef uint64_t uatomic64_t; + +typedef intptr_t atomicptr_t; +typedef uintptr_t uatomicptr_t; +typedef intmax_t atomic_max_t; +typedef uintmax_t uatomic_max_t; + +#define __HAVE_64B_ATOMICS 1 +#define USE_ATOMIC_COMPILER_BUILTINS 1 + +/* Compare and exchange. +   For all "bool" routines, we return FALSE if exchange succesful.  */ + +# define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				  model, __ATOMIC_RELAXED);		\ +  }) + +# define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				  model, __ATOMIC_RELAXED);		\ +  }) + +# define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				  model, __ATOMIC_RELAXED);		\ +  }) + +#  define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				  model, __ATOMIC_RELAXED);		\ +  }) + +# define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				 model, __ATOMIC_RELAXED);		\ +    __oldval;								\ +  }) + +# define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				 model, __ATOMIC_RELAXED);		\ +    __oldval;								\ +  }) + +# define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				 model, __ATOMIC_RELAXED);		\ +    __oldval;								\ +  }) + +#  define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \ +  ({									\ +    typeof (*mem) __oldval = (oldval);					\ +    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,	\ +				 model, __ATOMIC_RELAXED);		\ +    __oldval;								\ +  }) + + +/* Compare and exchange with "acquire" semantics, ie barrier after.  */ + +# define atomic_compare_and_exchange_bool_acq(mem, new, old)	\ +  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int,	\ +			mem, new, old, __ATOMIC_ACQUIRE) + +# define atomic_compare_and_exchange_val_acq(mem, new, old)	\ +  __atomic_val_bysize (__arch_compare_and_exchange_val, int,	\ +		       mem, new, old, __ATOMIC_ACQUIRE) + +/* Compare and exchange with "release" semantics, ie barrier before.  */ + +# define atomic_compare_and_exchange_val_rel(mem, new, old)	 \ +  __atomic_val_bysize (__arch_compare_and_exchange_val, int,    \ +                       mem, new, old, __ATOMIC_RELEASE) + + +/* Atomic exchange (without compare).  */ + +# define __arch_exchange_8_int(mem, newval, model)	\ +  __atomic_exchange_n (mem, newval, model) + +# define __arch_exchange_16_int(mem, newval, model)	\ +  __atomic_exchange_n (mem, newval, model) + +# define __arch_exchange_32_int(mem, newval, model)	\ +  __atomic_exchange_n (mem, newval, model) + +#  define __arch_exchange_64_int(mem, newval, model)	\ +  __atomic_exchange_n (mem, newval, model) + +# define atomic_exchange_acq(mem, value)				\ +  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE) + +# define atomic_exchange_rel(mem, value)				\ +  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE) + + +/* Atomically add value and return the previous (unincremented) value.  */ + +# define __arch_exchange_and_add_8_int(mem, value, model)	\ +  __atomic_fetch_add (mem, value, model) + +# define __arch_exchange_and_add_16_int(mem, value, model)	\ +  __atomic_fetch_add (mem, value, model) + +# define __arch_exchange_and_add_32_int(mem, value, model)	\ +  __atomic_fetch_add (mem, value, model) + +#  define __arch_exchange_and_add_64_int(mem, value, model)	\ +  __atomic_fetch_add (mem, value, model) + +# define atomic_exchange_and_add_acq(mem, value)			\ +  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,	\ +		       __ATOMIC_ACQUIRE) + +# define atomic_exchange_and_add_rel(mem, value)			\ +  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value,	\ +		       __ATOMIC_RELEASE) + +/* Barrier macro. */ +#define atomic_full_barrier() __sync_synchronize() + +#endif diff --git a/libc/sysdeps/linux/riscv64/bits/fcntl.h b/libc/sysdeps/linux/riscv64/bits/fcntl.h index a9d7c84e0..fdfb1805d 100644 --- a/libc/sysdeps/linux/riscv64/bits/fcntl.h +++ b/libc/sysdeps/linux/riscv64/bits/fcntl.h @@ -229,3 +229,6 @@ 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/riscv64/bits/fenv.h b/libc/sysdeps/linux/riscv64/bits/fenv.h index a3f8031af..a6b828a76 100644 --- a/libc/sysdeps/linux/riscv64/bits/fenv.h +++ b/libc/sysdeps/linux/riscv64/bits/fenv.h @@ -64,10 +64,8 @@ typedef unsigned int fenv_t;  /* If the default argument is used we use this value.  */  #define FE_DFL_ENV	((__const fenv_t *) -1) -#if __GLIBC_USE (IEC_60559_BFP_EXT)  /* Type representing floating-point control modes.  */  typedef unsigned int femode_t;  /* Default floating-point control modes.  */  # define FE_DFL_MODE	((const femode_t *) -1L) -#endif diff --git a/libc/sysdeps/linux/riscv64/bits/shm.h b/libc/sysdeps/linux/riscv64/bits/shm.h index 8a11c7050..bfb603499 100644 --- a/libc/sysdeps/linux/riscv64/bits/shm.h +++ b/libc/sysdeps/linux/riscv64/bits/shm.h @@ -38,16 +38,13 @@ 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() */ -    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;      __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; +    unsigned long int __uclibc_unused1; +    unsigned long int __uclibc_unused2;    };  #ifdef __USE_MISC diff --git a/libc/sysdeps/linux/riscv64/bits/uClibc_arch_features.h b/libc/sysdeps/linux/riscv64/bits/uClibc_arch_features.h index 3b8361442..63b17770d 100644 --- a/libc/sysdeps/linux/riscv64/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/riscv64/bits/uClibc_arch_features.h @@ -5,7 +5,7 @@  #ifndef _BITS_UCLIBC_ARCH_FEATURES_H  #define _BITS_UCLIBC_ARCH_FEATURES_H -#undef __UCLIBC_ABORT_INSTRUCTION__ +#define __UCLIBC_ABORT_INSTRUCTION__ "unimp"  /* can your target use syscall6() for mmap ? */  #define __UCLIBC_MMAP_HAS_6_ARGS__ @@ -13,7 +13,7 @@  /* does your target use statx */  #undef __UCLIBC_HAVE_STATX__ -#define __UCLIBC_SYSCALL_ALIGN_64BIT__ +#undef __UCLIBC_SYSCALL_ALIGN_64BIT__  /* does your target have a broken create_module() ? */  #define __UCLIBC_BROKEN_CREATE_MODULE__ diff --git a/libc/sysdeps/linux/riscv64/bits/uClibc_page.h b/libc/sysdeps/linux/riscv64/bits/uClibc_page.h index 4792d370f..7282638ba 100644 --- a/libc/sysdeps/linux/riscv64/bits/uClibc_page.h +++ b/libc/sysdeps/linux/riscv64/bits/uClibc_page.h @@ -21,7 +21,7 @@  #define _UCLIBC_PAGE_H  /* PAGE_SHIFT determines the page size -- in this case 4096 */ -#define PAGE_SHIFT	13 +#define PAGE_SHIFT	12  #define PAGE_SIZE	(1UL << PAGE_SHIFT)  #define PAGE_MASK	(~(PAGE_SIZE-1)) diff --git a/libc/sysdeps/linux/riscv64/bits/wordsize.h b/libc/sysdeps/linux/riscv64/bits/wordsize.h index 67a16ba62..1fc649aad 100644 --- a/libc/sysdeps/linux/riscv64/bits/wordsize.h +++ b/libc/sysdeps/linux/riscv64/bits/wordsize.h @@ -25,5 +25,6 @@  #if __riscv_xlen == 64  # define __WORDSIZE_TIME64_COMPAT32 1  #else -# error "rv32i-based targets are not supported" +# define __WORDSIZE_TIME64_COMPAT32 1 +// # warning "rv32i-based targets are experimental"  #endif | 
