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
20L4_INLINE unsigned long __attribute__((pure, always_inline))
21l4_cache_arm_ctr(void);
22
23L4_INLINE unsigned long __attribute__((pure, always_inline))
24l4_cache_arm_ctr(void)
25{
26 unsigned long v;
27 asm ("mrs %0, CTR_EL0" : "=r"(v));
28 return v;
29}
30
31L4_INLINE unsigned __attribute__((pure, always_inline))
32l4_cache_dmin_line(void);
33
34L4_INLINE unsigned __attribute__((pure, always_inline))
35l4_cache_dmin_line(void)
36{
37 return 4U << ((l4_cache_arm_ctr() >> 16) & 0xf);
38}
39
40#define L4_ARM_CACHE_LOOP(op) \
41 unsigned long step; \
42 \
43 if (start > end) \
44 __builtin_unreachable(); \
45 \
46 step = l4_cache_dmin_line(); \
47 start &= ~(step - 1); \
48 end = (end + step - 1) & ~(step - 1); \
49 for (; start != end; start += step) \
50 asm volatile (op ", %0" : : "r"(start) : "memory"); \
51 asm volatile ("dsb ish");
52
53
54L4_INLINE int
55l4_cache_clean_data(unsigned long start,
56 unsigned long end) L4_NOTHROW
57{
58 L4_ARM_CACHE_LOOP("dc cvac");
59 return 0;
60}
61
62L4_INLINE int
63l4_cache_flush_data(unsigned long start,
64 unsigned long end) L4_NOTHROW
65{
66 L4_ARM_CACHE_LOOP("dc civac");
67 return 0;
68}
69
70L4_INLINE int
71l4_cache_inv_data(unsigned long start,
72 unsigned long end) L4_NOTHROW
73{
74 // DC IVAC is always privileged, use DC CIVAC instead
75 L4_ARM_CACHE_LOOP("dc civac");
76 return 0;
77}
78
79L4_INLINE int
80l4_cache_coherent(unsigned long start,
81 unsigned long end) L4_NOTHROW
82{
83 L4_ARM_CACHE_LOOP("dc cvau, %0; ic ivau");
84 asm volatile ("isb");
85 return 0;
86}
87
88L4_INLINE int
89l4_cache_dma_coherent(unsigned long start,
90 unsigned long end) L4_NOTHROW
91{
92 L4_ARM_CACHE_LOOP("dc civac");
93 return 0;
94}
95
96#undef L4_ARM_CACHE_LOOP
97
98#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:47
int l4_cache_flush_data(unsigned long start, unsigned long end) L4_NOTHROW
Cache flush a range; writes back to PoC.
Definition cache.h:23
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:39
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:15
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:31
#define L4_NOTHROW
Mark a function declaration and definition as never throwing an exception.
Definition compiler.h:161
#define L4_INLINE
L4 Inline function attribute.
Definition compiler.h:51