| .\" Written by Ralf Baechle (ralf@waldorf-gmbh.de), |
| .\" Copyright (c) 1994, 1995 Waldorf GMBH |
| .\" |
| .\" %%%LICENSE_START(GPLv2+_DOC_FULL) |
| .\" This is free documentation; you can redistribute it and/or |
| .\" modify it under the terms of the GNU General Public License as |
| .\" published by the Free Software Foundation; either version 2 of |
| .\" the License, or (at your option) any later version. |
| .\" |
| .\" The GNU General Public License's references to "object code" |
| .\" and "executables" are to be interpreted as the output of any |
| .\" document formatting or typesetting system, including |
| .\" intermediate and printed output. |
| .\" |
| .\" This manual 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 General Public License for more details. |
| .\" |
| .\" You should have received a copy of the GNU General Public |
| .\" License along with this manual; if not, see |
| .\" <http://www.gnu.org/licenses/>. |
| .\" %%%LICENSE_END |
| .\" |
| .TH CACHEFLUSH 2 2021-03-22 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| cacheflush \- flush contents of instruction and/or data cache |
| .SH SYNOPSIS |
| .nf |
| .B #include <sys/cachectl.h> |
| .PP |
| .BI "int cacheflush(void *" addr ", int "nbytes ", int "cache ); |
| .fi |
| .PP |
| .IR Note : |
| On some architectures, |
| there is no glibc wrapper for this system call; see NOTES. |
| .SH DESCRIPTION |
| .BR cacheflush () |
| flushes the contents of the indicated cache(s) for the |
| user addresses in the range |
| .I addr |
| to |
| .IR (addr+nbytes\-1) . |
| .I cache |
| may be one of: |
| .TP |
| .B ICACHE |
| Flush the instruction cache. |
| .TP |
| .B DCACHE |
| Write back to memory and invalidate the affected valid cache lines. |
| .TP |
| .B BCACHE |
| Same as |
| .BR (ICACHE|DCACHE) . |
| .SH RETURN VALUE |
| .BR cacheflush () |
| returns 0 on success. |
| On error, it returns \-1 and sets |
| .I errno |
| to indicate the error. |
| .SH ERRORS |
| .TP |
| .B EFAULT |
| Some or all of the address range |
| .I addr |
| to |
| .I (addr+nbytes\-1) |
| is not accessible. |
| .TP |
| .B EINVAL |
| .I cache |
| is not one of |
| .BR ICACHE , |
| .BR DCACHE , |
| or |
| .BR BCACHE |
| (but see BUGS). |
| .SH CONFORMING TO |
| Historically, this system call was available on all MIPS UNIX variants |
| including RISC/os, IRIX, Ultrix, NetBSD, OpenBSD, and FreeBSD |
| (and also on some non-UNIX MIPS operating systems), so that |
| the existence of this call in MIPS operating systems is a de-facto |
| standard. |
| .SS Caveat |
| .BR cacheflush () |
| should not be used in programs intended to be portable. |
| On Linux, this call first appeared on the MIPS architecture, |
| but nowadays, Linux provides a |
| .BR cacheflush () |
| system call on some other architectures, but with different arguments. |
| .SH NOTES |
| .SS Architecture-specific variants |
| Glibc provides a wrapper for this system call, |
| with the prototype shown in SYNOPSIS, |
| for the following architectures: |
| ARC, CSKY, MIPS, and NIOS2. |
| .PP |
| On some other architectures, |
| Linux provides this system call, with different arguments: |
| .TP |
| M68K: |
| .nf |
| .BI "int cacheflush(unsigned long " addr ", int " scope ", int " cache , |
| .BI " unsigned long " len ); |
| .fi |
| .TP |
| SH: |
| .nf |
| .BI "int cacheflush(unsigned long " addr ", unsigned long " len ", int " op ); |
| .fi |
| .TP |
| NDS32: |
| .nf |
| .BI "int cacheflush(unsigned int " start ", unsigned int " end ", int " cache ); |
| .fi |
| .PP |
| On the above architectures, |
| glibc does not provide a wrapper for this system call; call it using |
| .BR syscall (2). |
| .SS GCC alternative |
| Unless you need the finer grained control that this system call provides, |
| you probably want to use the GCC built-in function |
| .BR __builtin___clear_cache (), |
| which provides a portable interface |
| across platforms supported by GCC and compatible compilers: |
| .PP |
| .in +4n |
| .EX |
| .BI "void __builtin___clear_cache(void *" begin ", void *" end ); |
| .EE |
| .in |
| .PP |
| On platforms that don't require instruction cache flushes, |
| .BR __builtin___clear_cache () |
| has no effect. |
| .PP |
| .IR Note : |
| On some GCC-compatible compilers, |
| the prototype for this built-in function uses |
| .I char * |
| instead of |
| .I void * |
| for the parameters. |
| .SH BUGS |
| Linux kernels older than version 2.6.11 ignore the |
| .I addr |
| and |
| .I nbytes |
| arguments, making this function fairly expensive. |
| Therefore, the whole cache is always flushed. |
| .PP |
| This function always behaves as if |
| .BR BCACHE |
| has been passed for the |
| .I cache |
| argument and does not do any error checking on the |
| .I cache |
| argument. |