diff options
author | Palmer Dabbelt <palmer@dabbelt.com> | 2018-01-29 10:28:32 -0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2018-01-29 10:37:27 -0800 |
commit | 7f33b09c65e3fdb6b6a1af8816918bcce977b38a (patch) | |
tree | 820a99249081334d21f7a4eb7fa621c05d2337ca /sysdeps/unix/sysv/linux/riscv/flush-icache.c | |
parent | 36960f0c763a904d6d1f028e2c33b7bbe43c2a3a (diff) | |
download | glibc-7f33b09c65e3fdb6b6a1af8816918bcce977b38a.tar glibc-7f33b09c65e3fdb6b6a1af8816918bcce977b38a.tar.gz glibc-7f33b09c65e3fdb6b6a1af8816918bcce977b38a.tar.bz2 glibc-7f33b09c65e3fdb6b6a1af8816918bcce977b38a.zip |
RISC-V: Linux ABI
Linux-specific code that is required for maintaining ABI compatibility.
This doesn't contain the actual system call interface, that is split out
in order to avoid having a patch that's too big.
2018-01-29 Palmer Dabbelt <palmer@sifive.com>
* sysdeps/riscv/nptl/pthread-offsets.h: New file.
* sysdeps/riscv/nptl/pthreaddef.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/bits/mman.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/dl-cache.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/flush-icache.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/getcontext.S: Likewise.
* sysdeps/unix/sysv/linux/riscv/init-first.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/libc-vdso.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/makecontext.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/readelflib.c: Likewise.
* sysdeps/unix/sysv/linux/riscv/register-dump.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/setcontext.S: Likewise.
* sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/swapcontext.S: Likewise.
* sysdeps/unix/sysv/linux/riscv/sys/cachectl.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/sys/ucontext.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/sys/user.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/ucontext-macros.h: Likewise.
* sysdeps/unix/sysv/linux/riscv/ucontext_i.sym: Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/riscv/flush-icache.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/riscv/flush-icache.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/riscv/flush-icache.c b/sysdeps/unix/sysv/linux/riscv/flush-icache.c new file mode 100644 index 0000000000..d612ef4c6c --- /dev/null +++ b/sysdeps/unix/sysv/linux/riscv/flush-icache.c @@ -0,0 +1,73 @@ +/* RISC-V instruction cache flushing VDSO calls + Copyright (C) 2017-2018 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/>. */ + +#include <dl-vdso.h> +#include <stdlib.h> +#include <atomic.h> +#include <sys/cachectl.h> +#include <asm/syscalls.h> + +typedef int (*func_type) (void *, void *, unsigned long int); + +static int +__riscv_flush_icache_syscall (void *start, void *end, unsigned long int flags) +{ + return INLINE_SYSCALL (riscv_flush_icache, 3, start, end, flags); +} + +static func_type +__lookup_riscv_flush_icache (void) +{ + PREPARE_VERSION_KNOWN (linux_version, LINUX_4_15); + + func_type func = _dl_vdso_vsym ("__vdso_flush_icache", &linux_version); + + /* If there is no vDSO entry then call the system call directly. All Linux + versions provide the vDSO entry, but QEMU's user-mode emulation doesn't + provide a vDSO. */ + if (!func) + func = &__riscv_flush_icache_syscall; + + return func; +} + +#ifdef SHARED + +# define INIT_ARCH() +libc_ifunc (__riscv_flush_icache, __lookup_riscv_flush_icache ()) + +#else + +int +__riscv_flush_icache (void *start, void *end, unsigned long int flags) +{ + static volatile func_type cached_func; + + func_type func = atomic_load_relaxed (&cached_func); + + if (!func) + { + func = __lookup_riscv_flush_icache (); + atomic_store_relaxed (&cached_func, func); + } + + return func (start, end, flags); +} + +#endif |