L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
cache.h
Go to the documentation of this file.
1
9/*
10 * (c) 2007-2009 Author(s)
11 * economic rights: Technische Universität Dresden (Germany)
12 *
13 * License: see LICENSE.spdx (in this directory or the directories above)
14 */
15#ifndef __L4SYS__INCLUDE__ARCH_ARM__CACHE_H__
16#define __L4SYS__INCLUDE__ARCH_ARM__CACHE_H__
17
18#include <l4/sys/compiler.h>
19
20#include_next <l4/sys/cache.h>
21
22L4_INLINE unsigned long __attribute__((pure, always_inline))
23l4_cache_arm_ctr(void);
24
25L4_INLINE unsigned long __attribute__((pure, always_inline))
26l4_cache_arm_ctr(void)
27{
28 unsigned long v;
29 asm ("mrs %0, CTR_EL0" : "=r"(v));
30 return v;
31}
32
33L4_INLINE unsigned __attribute__((pure, always_inline))
34l4_cache_dmin_line(void);
35
36L4_INLINE unsigned __attribute__((pure, always_inline))
37l4_cache_dmin_line(void)
38{
39 return 4U << ((l4_cache_arm_ctr() >> 16) & 0xf);
40}
41
42#define L4_ARM_CACHE_LOOP(op) \
43 unsigned long step; \
44 \
45 if (start > end) \
46 __builtin_unreachable(); \
47 \
48 step = l4_cache_dmin_line(); \
49 start &= ~(step - 1); \
50 end = (end + step - 1) & ~(step - 1); \
51 for (; start != end; start += step) \
52 asm volatile (op ", %0" : : "r"(start) : "memory"); \
53 asm volatile ("dsb ish");
54
55
56L4_INLINE int
57l4_cache_clean_data(unsigned long start,
58 unsigned long end) L4_NOTHROW
59{
60 L4_ARM_CACHE_LOOP("dc cvac");
61 return 0;
62}
63
64L4_INLINE int
65l4_cache_flush_data(unsigned long start,
66 unsigned long end) L4_NOTHROW
67{
68 L4_ARM_CACHE_LOOP("dc civac");
69 return 0;
70}
71
72L4_INLINE int
73l4_cache_inv_data(unsigned long start,
74 unsigned long end) L4_NOTHROW
75{
76 // DC IVAC is always privileged, use DC CIVAC instead
77 L4_ARM_CACHE_LOOP("dc civac");
78 return 0;
79}
80
81L4_INLINE int
82l4_cache_coherent(unsigned long start,
83 unsigned long end) L4_NOTHROW
84{
85 L4_ARM_CACHE_LOOP("dc cvau, %0; ic ivau");
86 asm volatile ("isb");
87 return 0;
88}
89
90L4_INLINE int
91l4_cache_dma_coherent(unsigned long start,
92 unsigned long end) L4_NOTHROW
93{
94 L4_ARM_CACHE_LOOP("dc civac");
95 return 0;
96}
97
98#undef L4_ARM_CACHE_LOOP
99
100#endif /* ! __L4SYS__INCLUDE__ARCH_ARM__CACHE_H__ */
L4 compiler related defines.
int l4_cache_dma_coherent(unsigned long start, unsigned long end) L4_NOTHROW
Make memory coherent for use with external memory; writes back to PoC.
Definition cache.h:49
int l4_cache_flush_data(unsigned long start, unsigned long end) L4_NOTHROW
Cache flush a range; writes back to PoC.
Definition cache.h:25
int l4_cache_coherent(unsigned long start, unsigned long end) L4_NOTHROW
Make memory coherent between I-cache and D-cache; writes back to PoU.
Definition cache.h:41
int l4_cache_clean_data(unsigned long start, unsigned long end) L4_NOTHROW
Cache clean a range in D-cache; writes back to PoC.
Definition cache.h:17
int l4_cache_inv_data(unsigned long start, unsigned long end) L4_NOTHROW
Cache invalidate a range; might write back to PoC.
Definition cache.h:33
#define L4_NOTHROW
Mark a function declaration and definition as never throwing an exception.
Definition compiler.h:159
#define L4_INLINE
L4 Inline function attribute.
Definition compiler.h:51