Hi Heinrich, Good. BTW, it looks like internally LLVM uses 'void *'[1], but Clang exposes 'char *'[2] in the prototype. Weird... I reported the bug yesterday: https://bugs.llvm.org/show_bug.cgi?id=48489 Thanks, Alex [1]: https://github.com/llvm/llvm-project/blob/414d3dc62c706f41226b0d552210c79f5080df43/compiler-rt/lib/builtins/clear_cache.c#L59 [2]: https://github.com/llvm/llvm-project/blob/7faf62a80bfc3a9dfe34133681fcc31f8e8d658b/clang/include/clang/Basic/Builtins.def#L583 On 12/12/20 12:52 AM, Heinrich Schuchardt wrote: > On 12/11/20 10:09 PM, Alejandro Colomar (man-pages) wrote: >> Hi Michael, >> >> Continuing with the changes in this thread: >> https://lore.kernel.org/linux-man/747d56e0-c102-ab40-add4-530a48a43a4d@xxxxxx/T/#t >> >> >> I researched the architectures that have this syscall. I found some >> that clearly provide the syscall, and some that seem to have something, >> but I didn't find a definition in the kernel (i.e., ARM, MicroBlaze >> (glibc only)?) > > arch/arm/include/uapi/asm/unistd.h:35: > #define __ARM_NR_cacheflush (__ARM_NR_BASE+2) > > arch/arm64/include/asm/unistd.h:37: > #define __ARM_NR_compat_cacheflush (__ARM_NR_COMPAT_BASE + 2) > > These syscalls are marked as private. So you should not use them from > user space. > > The compilers seem not to care about these syscalls being private: > > https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/arm/lib1funcs.S#L1512 > > https://github.com/llvm-mirror/compiler-rt/blob/master/lib/builtins/clear_cache.c > > > Best regards > > Heinrich [...] >> Rendered page (NOTES only): >> >> [ >> NOTES >> Architecture-specific variants >> Glibc provides a wrapper for this system call, with the pro‐ >> totype shown in SYNOPSIS, for the following architectures: >> ARC, CSKY, MIPS, and NIOS2. // lowercase? >> >> On some other architectures, Linux provides this system call >> with different arguments: >> >> M68K: >> >> int cacheflush(unsigned long addr, int scope, int cache, >> unsigned long len); >> >> SH: >> >> int cacheflush(unsigned long addr, unsigned long len, int >> op); >> >> NDS32: >> >> int cacheflush(unsigned int start, unsigned int end, int >> cache); >> >> GCC alternative >> Unless you need the finer grained control that this system >> call provides, you probably want to use the GCC built-in >> function __builtin___clear_cache(), which provides a portable >> interface across platforms supported by GCC and compatible >> compilers: >> >> void __builtin___clear_cache(void *begin, void *end); >> >> On platforms that don't require instruction cache flushes, >> __builtin___clear_cache() has no effect. >> >> Note: On some GCC-compatible compilers, such as clang, the >> prototype for this function uses char * instead of void * for >> the parameters. >> >> ] >> >> 'GCC alternative' is the name I gave to the NOTES from the other thread, >> which aren't yet merged (I'll send the patches after the weekend, >> probably). >> >> Subsections based on: >> fadvise64(2) >> >> Can you review this? >> >> Thanks, >> >> Alex >> >