|  | 
| 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