@@ -47,6 +47,16 @@ inline void mmu_dtlb_invalidate(unsigned int vaddr)
47
47
"wcsr tlbctrl, r11" :::"r11" );
48
48
}
49
49
50
+ inline void mmu_itlb_invalidate (unsigned int vaddr )
51
+ {
52
+ asm volatile ("ori %0, %0, 0\n\t"
53
+ "wcsr tlbvaddr, %0" ::"r" (vaddr ):);
54
+
55
+ asm volatile ("xor r11, r11, r11\n\t"
56
+ "ori r11, r11, 0x20\n\t"
57
+ "wcsr tlbctrl, r11" :::"r11" );
58
+ }
59
+
50
60
struct mmu_mapping mappings [MAX_MMU_SLOTS ];
51
61
52
62
@@ -102,7 +112,7 @@ unsigned int mmu_map(unsigned int vaddr, unsigned int paddr, char metadata) {
102
112
}
103
113
104
114
unsigned int get_mmu_mapping_for (unsigned int vaddr ) {
105
- int i ;
115
+ unsigned int i ;
106
116
vaddr = get_pfn (vaddr );
107
117
108
118
for (i = 0 ; i < MAX_MMU_SLOTS ; ++ i )
@@ -112,6 +122,28 @@ unsigned int get_mmu_mapping_for(unsigned int vaddr) {
112
122
return A_BAD_ADDR ;
113
123
}
114
124
125
+ unsigned char is_dtlb_mapping (unsigned int vaddr ) {
126
+ unsigned int i ;
127
+ vaddr = get_pfn (vaddr );
128
+
129
+ for (i = 0 ; i < MAX_MMU_SLOTS ; ++ i )
130
+ if ((mappings [i ].vaddr == vaddr ) && (mappings [i ].metadata & (MAPPING_IS_VALID )) && (mappings [i ].metadata & (DTLB_MAPPING )))
131
+ return 1 ;
132
+
133
+ return 0 ;
134
+ }
135
+
136
+ unsigned char is_itlb_mapping (unsigned int vaddr ) {
137
+ unsigned int i ;
138
+ vaddr = get_pfn (vaddr );
139
+
140
+ for (i = 0 ; i < MAX_MMU_SLOTS ; ++ i )
141
+ if ((mappings [i ].vaddr == vaddr ) && (mappings [i ].metadata & (MAPPING_IS_VALID )) && (mappings [i ].metadata & (ITLB_MAPPING )))
142
+ return 1 ;
143
+
144
+ return 0 ;
145
+ }
146
+
115
147
unsigned char remove_mmu_mapping_for (unsigned int vaddr ) {
116
148
int i ;
117
149
vaddr = get_pfn (vaddr );
@@ -195,6 +227,9 @@ unsigned int write_word_with_mmu_enabled(register unsigned int vaddr, register u
195
227
196
228
void call_function_with_itlb_enabled (void (* f )(void ))
197
229
{
230
+ register unsigned int stack ;
231
+ asm volatile ("mv %0, sp" : "=r" (stack ) :: );
232
+ printf ("call stack == 0x%08x\n" , stack );
198
233
asm volatile (
199
234
"xor r11, r11, r11\n\t"
200
235
"ori r11, r11, 0x10\n\t"
0 commit comments