11/*
2- * Copyright (c) 2006-2019 , RT-Thread Development Team
2+ * Copyright (c) 2006-2020 , RT-Thread Development Team
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 *
66 * Change Logs:
77 * Date Author Notes
88 * 2020-02-20 bigmagic first version
99 */
10-
1110#include <mmu.h>
1211#include <stddef.h>
1312
@@ -19,21 +18,20 @@ static unsigned long main_tbl[512 * 20] __attribute__((aligned (4096)));
1918
2019#define IS_ALIGNED (x , a ) (((x) & ((typeof(x))(a) - 1)) == 0)
2120
22- //映射方式
2321#define PMD_TYPE_SECT (1 << 0)
2422
2523#define PMD_TYPE_TABLE (3 << 0)
2624
2725#define PTE_TYPE_PAGE (3 << 0)
2826
29- #define BITS_PER_VA 39
27+ #define BITS_PER_VA 39
3028
3129/* Granule size of 4KB is being used */
3230#define GRANULE_SIZE_SHIFT 12
3331#define GRANULE_SIZE (1 << GRANULE_SIZE_SHIFT)
3432#define XLAT_ADDR_MASK ((1UL << BITS_PER_VA) - GRANULE_SIZE)
3533
36- #define PMD_TYPE_MASK (3 << 0)
34+ #define PMD_TYPE_MASK (3 << 0)
3735
3836int free_idx = 1 ;
3937
@@ -46,25 +44,26 @@ void mmu_memset(char *dst, char v, size_t len)
4644}
4745
4846static unsigned long __page_off = 0 ;
49- static unsigned long get_free_page (void ) {
47+ static unsigned long get_free_page (void )
48+ {
5049 __page_off += 512 ;
5150 return (unsigned long )(main_tbl + __page_off );
5251}
5352
5453void mmu_init (void )
5554{
5655 unsigned long val64 ;
57- unsigned long val32 ; //val32不是uint32_t,val32只是表示相关的那个寄存器是32位的
56+ unsigned long val32 ;
5857
5958 val64 = 0x007f6eUL ;
6059 __asm__ volatile ("msr MAIR_EL1, %0\n dsb sy\n" ::"r" (val64 ));
6160 __asm__ volatile ("mrs %0, MAIR_EL1\n dsb sy\n" :"=r" (val64 ));
6261
6362 //TCR_EL1
64- val32 = (16UL << 0 )//48 位
65- | (0x0UL << 6 )//没有用到
66- | (0x0UL << 7 )//使能enable lower half
67- | (0x3UL << 8 )//写回模式,没有cahce访问
63+ val32 = (16UL << 0 )//48bit
64+ | (0x0UL << 6 )
65+ | (0x0UL << 7 )
66+ | (0x3UL << 8 )
6867 | (0x3UL << 10 )//Inner Shareable
6968 | (0x2UL << 12 )
7069 | (0x0UL << 14 )//4K
@@ -91,14 +90,11 @@ void mmu_enable(void)
9190 unsigned long val64 ;
9291 unsigned long val32 ;
9392
94- //关闭指令cache
9593 __asm__ volatile ("mrs %0, SCTLR_EL1\n" :"=r" (val64 ));
9694 val64 &= ~0x1000 ; //disable I
9795 __asm__ volatile ("dmb sy\n msr SCTLR_EL1, %0\n isb sy\n" ::"r" (val64 ));
9896
99- //清除指令cache
10097 __asm__ volatile ("IC IALLUIS\n dsb sy\n isb sy\n" );
101- //清除tlb
10298 __asm__ volatile ("tlbi vmalle1\n dsb sy\n isb sy\n" );
10399
104100 //SCTLR_EL1, turn on mmu
@@ -107,32 +103,39 @@ void mmu_enable(void)
107103 __asm__ volatile ("dmb sy\n msr SCTLR_EL1, %0\nisb sy\n" ::"r" (val32 ));
108104}
109105
110- static int map_single_page_2M (unsigned long * lv0_tbl , unsigned long va , unsigned long pa , unsigned long attr ) {
106+ static int map_single_page_2M (unsigned long * lv0_tbl , unsigned long va , unsigned long pa , unsigned long attr )
107+ {
111108 int level ;
112109 unsigned long * cur_lv_tbl = lv0_tbl ;
113110 unsigned long page ;
114111 unsigned long off ;
115112 int level_shift = 39 ;
116113
117- if (va & (0x200000UL - 1 )) {
114+ if (va & (0x200000UL - 1 ))
115+ {
118116 return MMU_MAP_ERROR_VANOTALIGN ;
119117 }
120- if (pa & (0x200000UL - 1 )) {
118+ if (pa & (0x200000UL - 1 ))
119+ {
121120 return MMU_MAP_ERROR_PANOTALIGN ;
122121 }
123- for (level = 0 ; level < 2 ; level ++ ) {
122+ for (level = 0 ; level < 2 ; level ++ )
123+ {
124124 off = (va >> level_shift );
125125 off &= MMU_LEVEL_MASK ;
126- if ((cur_lv_tbl [off ] & 1 ) == 0 ) {
126+ if ((cur_lv_tbl [off ] & 1 ) == 0 )
127+ {
127128 page = get_free_page ();
128- if (!page ) {
129+ if (!page )
130+ {
129131 return MMU_MAP_ERROR_NOPAGE ;
130132 }
131133 mmu_memset ((char * )page , 0 , 4096 );
132134 cur_lv_tbl [off ] = page | 0x3UL ;
133135 }
134136 page = cur_lv_tbl [off ];
135- if (!(page & 0x2 )) {
137+ if (!(page & 0x2 ))
138+ {
136139 //is block! error!
137140 return MMU_MAP_ERROR_CONFLICT ;
138141 }
@@ -173,13 +176,10 @@ int armv8_map_2M(unsigned long va, unsigned long pa, int count, unsigned long at
173176 return 0 ;
174177}
175178
176- //将表的地址映射到其他的地方去
177179static void set_table (uint64_t * pt , uint64_t * table_addr )
178180{
179181 uint64_t val ;
180- //0x607
181-
182- val = (0x3UL | (uint64_t )table_addr );//(0x3UL | (uint64_t)table_addr);
182+ val = (0x3UL | (uint64_t )table_addr );
183183 * pt = val ;
184184}
185185
@@ -208,28 +208,21 @@ static int pte_type(uint64_t *pte)
208208static int level2shift (int level )
209209{
210210 /* Page is 12 bits wide, every level translates 9 bits */
211- //
212211 return (12 + 9 * (3 - level ));
213212}
214213
215-
216- uint64_t * test_table = 0 ;
217-
218-
219-
220- //根据表映射
221214static uint64_t * get_level_table (uint64_t * pte )
222215{
223216 uint64_t * table = (uint64_t * )(* pte & XLAT_ADDR_MASK );
224217
225- if (pte_type (pte ) != PMD_TYPE_TABLE ) {
218+ if (pte_type (pte ) != PMD_TYPE_TABLE )
219+ {
226220 table = create_table ();
227221 set_table (pte , table );
228222 }
229223 return table ;
230224}
231225
232-
233226static void map_region (uint64_t virt , uint64_t phys , uint64_t size , uint64_t attr )
234227{
235228 uint64_t block_size = 0 ;
@@ -241,16 +234,19 @@ static void map_region(uint64_t virt, uint64_t phys, uint64_t size, uint64_t att
241234 int level = 0 ;
242235
243236 addr = virt ;
244- while (size ) {
245- table = & main_tbl [0 ];//将一级页表的地址赋值
246- for (level = 0 ; level < 4 ; level ++ ) {
237+ while (size )
238+ {
239+ table = & main_tbl [0 ];
240+ for (level = 0 ; level < 4 ; level ++ )
241+ {
247242 block_shift = level2shift (level );
248243 idx = addr >> block_shift ;
249244 idx = idx %512 ;
250245 block_size = (uint64_t )(1L << block_shift );
251246 pte = table + idx ;
252247
253- if (size >= block_size && IS_ALIGNED (addr , block_size )) {
248+ if (size >= block_size && IS_ALIGNED (addr , block_size ))
249+ {
254250 attr &= 0xfff0000000000ffcUL ;
255251 if (level != 3 )
256252 {
0 commit comments