CACHE_INVAL()
Invalidate cache lines associated with a data buffer
Synopsis:
#include <sys/cache.h>
CACHE_INVAL(struct cache_ctrl *cinfo,
void *vaddr,
uint64_t paddr,
size_t len);
Arguments:
- cinfo
- A pointer to the structure that was initially passed to cache_init().
- vaddr
- The virtual address of the buffer; this is a pointer to the data in the driver's virtual address space.
- paddr
- The physical address of the buffer: this is
typically in the same address space that the external device will use to reference the data.
The physical address is obtained by calling mem_offset64().
Since this function is fairly costly, drivers typically allocate a pool
of data buffers at initialization (e.g., by calling mmap()
with the
MAP_SHARED | MAP_PHYS | MAP_ANON
flags), and predetermine the physical addresses of the data. - len
- The number of bytes in the buffer for which the associated cache lines should be invalidated.
Library:
libcache
Use the -l cache option to qcc to link against this library.
Description:
This macro is used to invalidate any cache lines associated with a data buffer. This routine ensures that any subsequent modifications that are made to the data by an external device will be not be corrupted by the CPU writing back cached data to the memory, and ensures that once the data has been modified, the CPU will fetch the updated data from memory, instead of retrieving stale data from the cache.
Depending on the architecture and the cache callouts (see
Cache control
in the Kernel Callouts
chapter of Building Embedded Systems),
the calling thread might need to obtain I/O privileges before using the CACHE_*() macros.
If so, then:
- The process must have the PROCMGR_AID_IO ability enabled. For more information, see procmgr_ability().
- The thread must call
ThreadCtl() as follows:
ThreadCtl( _NTO_TCTL_IO_LEVEL, (void*)_NTO_IO_LEVEL_1 );
Failing to do so may result in a SIGILL (illegal instruction) signal.
Environment variables:
The following environment variables, if they exist, affect the behavior of this function:
- CACHE_NOP
- Instructs the library that the CACHE_FLUSH() and CACHE_INVAL() macros should have no effect.
- CACHE_MSYNC
- Instructs the library that the CACHE_FLUSH() and CACHE_INVAL() macros should use the msync() C library call to perform cache synchronization.
Classification:
Safety: | |
---|---|
Cancellation point | No |
Signal handler | Yes |
Thread | Yes |
Caveats:
CACHE_INVAL() is implemented as a macro.