bda6b54b0213de734528da9b12dc62aef03dbd74
[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 /**
18  * \brief Read domain access control register
19  */
20 static inline uint32_t cp15_read_dacr(void)
21 {
22     uint32_t dacr;
23     __asm volatile("mrc   p15, 0, %[dacr], c3, c0, 0" : [dacr] "=r" (dacr));
24     return dacr;
25 }
26
27 /**
28  * \brief Read instruction fault status register.
29  */
30 static inline uint32_t cp15_read_ifsr(void)
31 {
32     uint32_t ifsr;
33     __asm volatile("mrc   p15, 0, %[ifsr], c5, c0, 1" : [ifsr] "=r" (ifsr));
34     return ifsr;
35 }
36
37 /**
38  * \brief Read data fault status register.
39  */
40 static inline uint32_t cp15_read_dfsr(void)
41 {
42     uint32_t dfsr;
43     __asm volatile("mrc   p15, 0, %[dfsr], c5, c0, 0" : [dfsr] "=r" (dfsr));
44     return dfsr;
45 }
46
47 /**
48  * \brief Read fault address register.
49  */
50 static inline uint32_t cp15_read_far(void)
51 {
52     uint32_t addr;
53     __asm volatile(" mrc  p15, 0, %[addr], c6, c0, 0" : [addr] "=r" (addr));
54     return addr;
55 }
56
57 static inline lpaddr_t cp15_read_ttbr(void)
58 {
59     lpaddr_t ttbr;
60     __asm volatile(" mrc  p15, 0, %[ttbr], c2, c0, 0" : [ttbr] "=r" (ttbr));
61     return ttbr;
62 }
63
64 static inline void cp15_write_ttbr(lpaddr_t ttbr)
65 {
66     __asm volatile(" mcr  p15, 0, %[ttbr], c2, c0, 0" :: [ttbr] "r" (ttbr));
67 }
68
69
70 static inline uint32_t cp15_read_cache_status(void){
71     uint32_t cache;
72     __asm volatile("mrc   p15, 0, %[cache], c1, c0, 0" : [cache] "=r" (cache));
73     return cache;
74 }
75
76
77 static inline void cp15_disable_cache(void){
78    
79     cp15_invalidate_i_and_d_caches();
80     
81     __asm volatile(
82                    //     "ldr r1, =0x3 \n\t"
83                    "mrc p15, 0, r1, c1, c0, 0 \n\t" //read
84                    "bic r1, #4 \n\t"
85                    "mcr p15, 0, r1, c1, c0, 0 \n\t"
86                    :::"r1");
87
88     printf("WARNING! Caching has been disabled, configuration is: %"PRIx32"\n", cp15_read_cache_status());
89
90 }
91
92 static inline void cp15_invalidate_tlb(void)
93 {
94     __asm volatile(" mcr  p15, 0, r0, c8, c7, 0");
95 }
96
97 #endif // __CP15_H__