]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/mem_unit.cpp
19ec4451f007e343e7ce7198601fbe1f67617e87
[l4.git] / kernel / fiasco / src / kern / arm / mem_unit.cpp
1 INTERFACE [arm]:
2
3 #include "mem_layout.h"
4 #include "mmu.h"
5
6 class Mem_unit : public Mmu< Mem_layout::Cache_flush_area >
7 {
8 public:
9   enum : Mword
10   {
11     Asid_invalid = ~0UL
12   };
13
14   static void tlb_flush();
15   static void dtlb_flush(void *va);
16   static void tlb_flush(unsigned long asid);
17   static void tlb_flush(void *va, unsigned long asid);
18 };
19
20 //---------------------------------------------------------------------------
21 IMPLEMENTATION [arm]:
22
23 IMPLEMENT inline
24 void Mem_unit::tlb_flush()
25 {
26   asm volatile("mcr p15, 0, %0, c8, c7, 0" // TLBIALL
27                : : "r" (0) : "memory");
28 }
29
30 IMPLEMENT inline
31 void Mem_unit::dtlb_flush(void *va)
32 {
33   asm volatile("mcr p15, 0, %0, c8, c6, 1" // DTLBIMVA
34                : : "r" ((unsigned long)va & 0xfffff000) : "memory");
35 }
36
37 //---------------------------------------------------------------------------
38 IMPLEMENTATION [arm && armv5]:
39
40 IMPLEMENT inline
41 void Mem_unit::tlb_flush(void *va, unsigned long)
42 {
43   asm volatile("mcr p15, 0, %0, c8, c7, 1"
44                : : "r" ((unsigned long)va & 0xfffff000) : "memory");
45 }
46
47 IMPLEMENT inline
48 void Mem_unit::tlb_flush(unsigned long)
49 {
50   asm volatile("mcr p15, 0, r0, c8, c7, 0" : : "r" (0) : "memory");
51 }
52
53 //---------------------------------------------------------------------------
54 IMPLEMENTATION [arm && (armv6 || armv7)]:
55
56 IMPLEMENT inline
57 void Mem_unit::tlb_flush(void *va, unsigned long asid)
58 {
59   if (asid == Asid_invalid)
60     return;
61   btc_flush();
62   Mem::dsb();
63   asm volatile("mcr p15, 0, %0, c8, c7, 1" // TLBIMVA
64                : : "r" (((unsigned long)va & 0xfffff000) | asid) : "memory");
65 }
66
67 IMPLEMENT inline
68 void Mem_unit::tlb_flush(unsigned long asid)
69 {
70   btc_flush();
71   Mem::dsb();
72   asm volatile("mcr p15, 0, %0, c8, c7, 2" // TLBIASID
73                : : "r" (asid) : "memory");
74 }