|
@@ -476,16 +476,42 @@ ENDPROC(__calc_phys_offset)
|
|
|
.quad PAGE_OFFSET
|
|
|
|
|
|
/*
|
|
|
- * Macro to populate the PGD for the corresponding block entry in the next
|
|
|
- * level (tbl) for the given virtual address.
|
|
|
+ * Macro to populate the PUD for the corresponding block entry in the next
|
|
|
+ * level (tbl) for the given virtual address in case of 4 levels.
|
|
|
*
|
|
|
- * Preserves: pgd, tbl, virt
|
|
|
- * Corrupts: tmp1, tmp2
|
|
|
+ * Preserves: pgd, virt
|
|
|
+ * Corrupts: tbl, tmp1, tmp2
|
|
|
+ * Returns: pud
|
|
|
*/
|
|
|
- .macro create_pgd_entry, pgd, tbl, virt, tmp1, tmp2
|
|
|
+ .macro create_pud_entry, pgd, tbl, virt, pud, tmp1, tmp2
|
|
|
+#ifdef CONFIG_ARM64_4_LEVELS
|
|
|
+ add \tbl, \tbl, #PAGE_SIZE // bump tbl 1 page up.
|
|
|
+ // to make room for pud
|
|
|
+ add \pud, \pgd, #PAGE_SIZE // pgd points to pud which
|
|
|
+ // follows pgd
|
|
|
+ lsr \tmp1, \virt, #PUD_SHIFT
|
|
|
+ and \tmp1, \tmp1, #PTRS_PER_PUD - 1 // PUD index
|
|
|
+ orr \tmp2, \tbl, #3 // PUD entry table type
|
|
|
+ str \tmp2, [\pud, \tmp1, lsl #3]
|
|
|
+#else
|
|
|
+ mov \pud, \tbl
|
|
|
+#endif
|
|
|
+ .endm
|
|
|
+
|
|
|
+/*
|
|
|
+ * Macro to populate the PGD (and possibily PUD) for the corresponding
|
|
|
+ * block entry in the next level (tbl) for the given virtual address.
|
|
|
+ *
|
|
|
+ * Preserves: pgd, virt
|
|
|
+ * Corrupts: tmp1, tmp2, tmp3
|
|
|
+ * Returns: tbl -> page where block mappings can be placed
|
|
|
+ * (changed to make room for pud with 4 levels, preserved otherwise)
|
|
|
+ */
|
|
|
+ .macro create_pgd_entry, pgd, tbl, virt, tmp1, tmp2, tmp3
|
|
|
+ create_pud_entry \pgd, \tbl, \virt, \tmp3, \tmp1, \tmp2
|
|
|
lsr \tmp1, \virt, #PGDIR_SHIFT
|
|
|
and \tmp1, \tmp1, #PTRS_PER_PGD - 1 // PGD index
|
|
|
- orr \tmp2, \tbl, #3 // PGD entry table type
|
|
|
+ orr \tmp2, \tmp3, #3 // PGD entry table type
|
|
|
str \tmp2, [\pgd, \tmp1, lsl #3]
|
|
|
.endm
|
|
|
|
|
@@ -550,7 +576,7 @@ __create_page_tables:
|
|
|
add x0, x25, #PAGE_SIZE // section table address
|
|
|
ldr x3, =KERNEL_START
|
|
|
add x3, x3, x28 // __pa(KERNEL_START)
|
|
|
- create_pgd_entry x25, x0, x3, x5, x6
|
|
|
+ create_pgd_entry x25, x0, x3, x1, x5, x6
|
|
|
ldr x6, =KERNEL_END
|
|
|
mov x5, x3 // __pa(KERNEL_START)
|
|
|
add x6, x6, x28 // __pa(KERNEL_END)
|
|
@@ -561,7 +587,7 @@ __create_page_tables:
|
|
|
*/
|
|
|
add x0, x26, #PAGE_SIZE // section table address
|
|
|
mov x5, #PAGE_OFFSET
|
|
|
- create_pgd_entry x26, x0, x5, x3, x6
|
|
|
+ create_pgd_entry x26, x0, x5, x1, x3, x6
|
|
|
ldr x6, =KERNEL_END
|
|
|
mov x3, x24 // phys offset
|
|
|
create_block_map x0, x7, x3, x5, x6
|