From 8b1f6b2e08ed3c15484c2ca0c3f0a45125c559c1 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Mon, 17 Aug 2020 15:44:58 +0200 Subject: riscv64: add __riscv_flush_icache Always use the systemcall as uClibc-ng has no vdso support. Tested with libffi and python in qemu-system-riscv64. --- libc/sysdeps/linux/riscv64/Makefile.arch | 2 +- libc/sysdeps/linux/riscv64/cache.c | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 libc/sysdeps/linux/riscv64/cache.c diff --git a/libc/sysdeps/linux/riscv64/Makefile.arch b/libc/sysdeps/linux/riscv64/Makefile.arch index 74c074852..21ecaa65b 100644 --- a/libc/sysdeps/linux/riscv64/Makefile.arch +++ b/libc/sysdeps/linux/riscv64/Makefile.arch @@ -1,2 +1,2 @@ -CSRC-y := __syscall_error.c +CSRC-y := __syscall_error.c cache.c SSRC-y := __longjmp.S setjmp.S vfork.S clone.S diff --git a/libc/sysdeps/linux/riscv64/cache.c b/libc/sysdeps/linux/riscv64/cache.c new file mode 100644 index 000000000..216b333f3 --- /dev/null +++ b/libc/sysdeps/linux/riscv64/cache.c @@ -0,0 +1,51 @@ +/* RISC-V instruction cache flushing VDSO calls + Copyright (C) 2017-2020 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 + . */ + +#include +#include +#include + +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) +{ + /* always call the system call directly.*/ + return &__riscv_flush_icache_syscall; +} + +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); +} -- cgit v1.2.3