|
29 | 29 | #define SWAPPER_TABLE_SHIFT (SWAPPER_BLOCK_SHIFT + PAGE_SHIFT - 3)
|
30 | 30 |
|
31 | 31 | #define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - SWAPPER_SKIP_LEVEL)
|
| 32 | +#define INIT_IDMAP_PGTABLE_LEVELS (IDMAP_LEVELS - SWAPPER_SKIP_LEVEL) |
32 | 33 |
|
33 | 34 | #define IDMAP_VA_BITS 48
|
34 | 35 | #define IDMAP_LEVELS ARM64_HW_PGTABLE_LEVELS(IDMAP_VA_BITS)
|
|
48 | 49 | #define EARLY_ENTRIES(vstart, vend, shift, add) \
|
49 | 50 | (SPAN_NR_ENTRIES(vstart, vend, shift) + (add))
|
50 | 51 |
|
51 |
| -#define EARLY_LEVEL(lvl, vstart, vend, add) \ |
52 |
| - (SWAPPER_PGTABLE_LEVELS > lvl ? EARLY_ENTRIES(vstart, vend, SWAPPER_BLOCK_SHIFT + lvl * (PAGE_SHIFT - 3), add) : 0) |
| 52 | +#define EARLY_LEVEL(lvl, lvls, vstart, vend, add) \ |
| 53 | + (lvls > lvl ? EARLY_ENTRIES(vstart, vend, SWAPPER_BLOCK_SHIFT + lvl * (PAGE_SHIFT - 3), add) : 0) |
53 | 54 |
|
54 |
| -#define EARLY_PAGES(vstart, vend, add) (1 /* PGDIR page */ \ |
55 |
| - + EARLY_LEVEL(3, (vstart), (vend), add) /* each entry needs a next level page table */ \ |
56 |
| - + EARLY_LEVEL(2, (vstart), (vend), add) /* each entry needs a next level page table */ \ |
57 |
| - + EARLY_LEVEL(1, (vstart), (vend), add))/* each entry needs a next level page table */ |
58 |
| -#define INIT_DIR_SIZE (PAGE_SIZE * (EARLY_PAGES(KIMAGE_VADDR, _end, EXTRA_PAGE) + EARLY_SEGMENT_EXTRA_PAGES)) |
| 55 | +#define EARLY_PAGES(lvls, vstart, vend, add) (1 /* PGDIR page */ \ |
| 56 | + + EARLY_LEVEL(3, (lvls), (vstart), (vend), add) /* each entry needs a next level page table */ \ |
| 57 | + + EARLY_LEVEL(2, (lvls), (vstart), (vend), add) /* each entry needs a next level page table */ \ |
| 58 | + + EARLY_LEVEL(1, (lvls), (vstart), (vend), add))/* each entry needs a next level page table */ |
| 59 | +#define INIT_DIR_SIZE (PAGE_SIZE * (EARLY_PAGES(SWAPPER_PGTABLE_LEVELS, KIMAGE_VADDR, _end, EXTRA_PAGE) \ |
| 60 | + + EARLY_SEGMENT_EXTRA_PAGES)) |
59 | 61 |
|
60 |
| -/* the initial ID map may need two extra pages if it needs to be extended */ |
61 |
| -#if VA_BITS < 48 |
62 |
| -#define INIT_IDMAP_DIR_SIZE ((INIT_IDMAP_DIR_PAGES + 2) * PAGE_SIZE) |
63 |
| -#else |
64 |
| -#define INIT_IDMAP_DIR_SIZE (INIT_IDMAP_DIR_PAGES * PAGE_SIZE) |
65 |
| -#endif |
66 |
| -#define INIT_IDMAP_DIR_PAGES EARLY_PAGES(KIMAGE_VADDR, _end + MAX_FDT_SIZE + SWAPPER_BLOCK_SIZE, 1) |
| 62 | +#define INIT_IDMAP_DIR_PAGES (EARLY_PAGES(INIT_IDMAP_PGTABLE_LEVELS, KIMAGE_VADDR, _end, 1)) |
| 63 | +#define INIT_IDMAP_DIR_SIZE ((INIT_IDMAP_DIR_PAGES + EARLY_IDMAP_EXTRA_PAGES) * PAGE_SIZE) |
| 64 | + |
| 65 | +#define INIT_IDMAP_FDT_PAGES (EARLY_PAGES(INIT_IDMAP_PGTABLE_LEVELS, 0UL, UL(MAX_FDT_SIZE), 1) - 1) |
| 66 | +#define INIT_IDMAP_FDT_SIZE ((INIT_IDMAP_FDT_PAGES + EARLY_IDMAP_EXTRA_FDT_PAGES) * PAGE_SIZE) |
67 | 67 |
|
68 | 68 | /* The number of segments in the kernel image (text, rodata, inittext, initdata, data+bss) */
|
69 | 69 | #define KERNEL_SEGMENT_COUNT 5
|
70 | 70 |
|
71 | 71 | #if SWAPPER_BLOCK_SIZE > SEGMENT_ALIGN
|
72 | 72 | #define EARLY_SEGMENT_EXTRA_PAGES (KERNEL_SEGMENT_COUNT + 1)
|
73 |
| -#else |
74 |
| -#define EARLY_SEGMENT_EXTRA_PAGES 0 |
75 |
| -#endif |
76 |
| - |
77 | 73 | /*
|
78 |
| - * Initial memory map attributes. |
| 74 | + * The initial ID map consists of the kernel image, mapped as two separate |
| 75 | + * segments, and may appear misaligned wrt the swapper block size. This means |
| 76 | + * we need 3 additional pages. The DT could straddle a swapper block boundary, |
| 77 | + * so it may need 2. |
79 | 78 | */
|
80 |
| -#define SWAPPER_PTE_FLAGS (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED | PTE_UXN) |
81 |
| -#define SWAPPER_PMD_FLAGS (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S | PTE_UXN) |
82 |
| - |
83 |
| -#ifdef CONFIG_ARM64_4K_PAGES |
84 |
| -#define SWAPPER_RW_MMUFLAGS (PMD_ATTRINDX(MT_NORMAL) | SWAPPER_PMD_FLAGS | PTE_WRITE) |
85 |
| -#define SWAPPER_RX_MMUFLAGS (SWAPPER_RW_MMUFLAGS | PMD_SECT_RDONLY) |
| 79 | +#define EARLY_IDMAP_EXTRA_PAGES 3 |
| 80 | +#define EARLY_IDMAP_EXTRA_FDT_PAGES 2 |
86 | 81 | #else
|
87 |
| -#define SWAPPER_RW_MMUFLAGS (PTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS | PTE_WRITE) |
88 |
| -#define SWAPPER_RX_MMUFLAGS (SWAPPER_RW_MMUFLAGS | PTE_RDONLY) |
| 82 | +#define EARLY_SEGMENT_EXTRA_PAGES 0 |
| 83 | +#define EARLY_IDMAP_EXTRA_PAGES 0 |
| 84 | +#define EARLY_IDMAP_EXTRA_FDT_PAGES 0 |
89 | 85 | #endif
|
90 | 86 |
|
91 | 87 | #endif /* __ASM_KERNEL_PGTABLE_H */
|
0 commit comments