armv5: add missing cp15_invalidate_i_and_d_caches_fast()
[barrelfish] / kernel / include / arch / armv5 / cp15.h
1 /*
2  * Copyright (c) 2009 ETH Zurich.
3  * All rights reserved.
4  *
5  * This file is distributed under the terms in the attached LICENSE file.
6  * If you do not find this file, copies can be found by writing to:
7  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8  */
9
10 #ifndef __CP15_H__
11 #define __CP15_H__
12
13 #include <kernel.h>
14
15 void cp15_invalidate_i_and_d_caches(void);
16
17 static inline void cp15_invalidate_i_and_d_caches_fast(void)
18 {
19     cp15_invalidate_i_and_d_caches();
20 }
21
22 /**
23  * \brief Read domain access control register
24  */
25 static inline uint32_t cp15_read_dacr(void)
26 {
27     uint32_t dacr;
28     __asm volatile("mrc   p15, 0, %[dacr], c3, c0, 0" : [dacr] "=r" (dacr));
29     return dacr;
30 }
31
32 /**
33  * \brief Read instruction fault status register.
34  */
35 static inline uint32_t cp15_read_ifsr(void)
36 {
37     uint32_t ifsr;
38     __asm volatile("mrc   p15, 0, %[ifsr], c5, c0, 1" : [ifsr] "=r" (ifsr));
39     return ifsr;
40 }
41
42 /**
43  * \brief Read data fault status register.
44  */
45 static inline uint32_t cp15_read_dfsr(void)
46 {
47     uint32_t dfsr;
48     __asm volatile("mrc   p15, 0, %[dfsr], c5, c0, 0" : [dfsr] "=r" (dfsr));
49     return dfsr;
50 }
51
52 /**
53  * \brief Read fault address register.
54  */
55 static inline uint32_t cp15_read_far(void)
56 {
57     uint32_t addr;
58     __asm volatile(" mrc  p15, 0, %[addr], c6, c0, 0" : [addr] "=r" (addr));
59     return addr;
60 }
61
62 static inline lpaddr_t cp15_read_ttbr(void)
63 {
64     lpaddr_t ttbr;
65     __asm volatile(" mrc  p15, 0, %[ttbr], c2, c0, 0" : [ttbr] "=r" (ttbr));
66     return ttbr;
67 }
68
69 static inline void cp15_write_ttbr(lpaddr_t ttbr)
70 {
71     __asm volatile(" mcr  p15, 0, %[ttbr], c2, c0, 0" :: [ttbr] "r" (ttbr));
72 }
73
74
75 static inline uint32_t cp15_read_cache_status(void){
76     uint32_t cache;
77     __asm volatile("mrc   p15, 0, %[cache], c1, c0, 0" : [cache] "=r" (cache));
78     return cache;
79 }
80
81
82 static inline void cp15_disable_cache(void){
83    
84     cp15_invalidate_i_and_d_caches();
85     
86     __asm volatile(
87                    //     "ldr r1, =0x3 \n\t"
88                    "mrc p15, 0, r1, c1, c0, 0 \n\t" //read
89                    "bic r1, #4 \n\t"
90                    "mcr p15, 0, r1, c1, c0, 0 \n\t"
91                    :::"r1");
92
93     printf("WARNING! Caching has been disabled, configuration is: %"PRIx32"\n", cp15_read_cache_status());
94
95 }
96
97 static inline void cp15_invalidate_tlb(void)
98 {
99     __asm volatile(" mcr  p15, 0, r0, c8, c7, 0");
100 }
101
102 #endif // __CP15_H__