6767/** Construct a page table entry (PTE) */
6868#define PTE (paddr , ring , attr ) PTE_WITH_BCKUP(paddr, ring, attr, RING_KERNEL, PTE_ATTR_ILLEGAL)
6969
70+ /** Get the Physical Page Number from a PTE */
71+ #define PTE_PPN_GET (pte ) ((pte) & XTENSA_MMU_PTE_PPN_MASK)
72+
73+ /** Set the Physical Page Number in a PTE */
74+ #define PTE_PPN_SET (pte , ppn ) \
75+ (((pte) & ~XTENSA_MMU_PTE_PPN_MASK) | ((ppn) & XTENSA_MMU_PTE_PPN_MASK))
76+
7077/** Get the attributes from a PTE */
7178#define PTE_ATTR_GET (pte ) (((pte) & PTE_ATTR_MASK) >> PTE_ATTR_SHIFT)
7279
@@ -388,7 +395,7 @@ static void map_memory_range(const uint32_t start, const uint32_t end,
388395 PTE ((uint32_t )l2_table , RING_KERNEL , XTENSA_MMU_PAGE_TABLE_ATTR );
389396 }
390397
391- l2_table = (uint32_t * )(xtensa_kernel_ptables [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
398+ l2_table = (uint32_t * )PTE_PPN_GET (xtensa_kernel_ptables [l1_pos ]);
392399 l2_table [l2_pos ] = pte ;
393400 }
394401}
@@ -552,7 +559,7 @@ static bool l2_page_table_map(uint32_t *l1_table, void *vaddr, uintptr_t phys,
552559 }
553560#endif
554561
555- l2_table = (uint32_t * )(l1_table [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
562+ l2_table = (uint32_t * )PTE_PPN_GET (l1_table [l1_pos ]);
556563 l2_table [l2_pos ] = PTE (phys , is_user ? RING_USER : RING_KERNEL , attrs );
557564
558565 if (IS_ENABLED (PAGE_TABLE_IS_CACHED )) {
@@ -732,7 +739,7 @@ static void l2_page_table_unmap(uint32_t *l1_table, void *vaddr)
732739 dup_l2_table_if_needed (l1_table , l1_pos );
733740#endif
734741
735- l2_table = (uint32_t * )(l1_table [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
742+ l2_table = (uint32_t * )PTE_PPN_GET (l1_table [l1_pos ]);
736743
737744 if (IS_ENABLED (PAGE_TABLE_IS_CACHED )) {
738745 sys_cache_data_invd_range ((void * )& l2_table [l2_pos ], sizeof (l2_table [0 ]));
@@ -1072,8 +1079,7 @@ static uint32_t *dup_l1_table(void)
10721079 uint32_t * l2_table , * src_l2_table ;
10731080 bool l2_need_dup = false;
10741081
1075- src_l2_table = (uint32_t * )(xtensa_kernel_ptables [l1_pos ] &
1076- XTENSA_MMU_PTE_PPN_MASK );
1082+ src_l2_table = (uint32_t * )PTE_PPN_GET (xtensa_kernel_ptables [l1_pos ]);
10771083
10781084 /* Need to check if the L2 table has been modified between boot and
10791085 * this function call. We do not want to inherit any changes in
@@ -1097,7 +1103,7 @@ static uint32_t *dup_l1_table(void)
10971103 * duplicate the L2 table.
10981104 */
10991105 vaddr = vaddr_from_pt_pos (l1_pos , l2_pos );
1100- if ((src_l2_table [l2_pos ] & XTENSA_MMU_PTE_PPN_MASK ) != vaddr ) {
1106+ if (PTE_PPN_GET (src_l2_table [l2_pos ]) != vaddr ) {
11011107 l2_need_dup = true;
11021108 break ;
11031109 }
@@ -1129,7 +1135,7 @@ static void dup_l2_table_if_needed(uint32_t *l1_table, uint32_t l1_pos)
11291135{
11301136 uint32_t * l2_table , * src_l2_table ;
11311137
1132- src_l2_table = (uint32_t * )(l1_table [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
1138+ src_l2_table = (uint32_t * )PTE_PPN_GET (l1_table [l1_pos ]);
11331139
11341140 if (l2_page_tables_counter [l2_table_to_counter_pos (src_l2_table )] == 1 ) {
11351141 /* Only one user of L2 table, no need to duplicate. */
@@ -1214,13 +1220,14 @@ static void region_map_update(uint32_t *l1_table, uintptr_t start,
12141220 dup_l2_table_if_needed (l1_table , l1_pos );
12151221#endif
12161222
1217- l2_table = (uint32_t * )(l1_table [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
1223+ l2_table = (uint32_t * )PTE_PPN_GET (l1_table [l1_pos ]);
12181224
12191225 if (IS_ENABLED (PAGE_TABLE_IS_CACHED )) {
12201226 sys_cache_data_invd_range ((void * )& l2_table [l2_pos ], sizeof (l2_table [0 ]));
12211227 }
12221228
12231229 pte = l2_table [l2_pos ];
1230+ pte = PTE_PPN_SET (pte , start + offset );
12241231
12251232 if ((option & OPTION_RESTORE_ATTRS ) == OPTION_RESTORE_ATTRS ) {
12261233 new_attrs = PTE_BCKUP_ATTR_GET (pte );
@@ -1430,7 +1437,7 @@ static bool page_validate(uint32_t *ptables, uint32_t page, uint8_t ring, bool w
14301437 return false;
14311438 }
14321439
1433- l2_table = (uint32_t * )(ptables [l1_pos ] & XTENSA_MMU_PTE_PPN_MASK );
1440+ l2_table = (uint32_t * )PTE_PPN_GET (ptables [l1_pos ]);
14341441 pte = l2_table [l2_pos ];
14351442
14361443 if (is_pte_illegal (pte )) {
0 commit comments