Lines Matching refs:ppd

99 static void __init sme_clear_pgd(struct sme_populate_pgd_data *ppd)
104 pgd_start = ppd->vaddr & PGDIR_MASK;
105 pgd_end = ppd->vaddr_end & PGDIR_MASK;
109 pgd_p = ppd->pgd + pgd_index(ppd->vaddr);
114 static pud_t __init *sme_prepare_pgd(struct sme_populate_pgd_data *ppd)
121 pgd = ppd->pgd + pgd_index(ppd->vaddr);
123 p4d = ppd->pgtable_area;
125 ppd->pgtable_area += sizeof(*p4d) * PTRS_PER_P4D;
129 p4d = p4d_offset(pgd, ppd->vaddr);
131 pud = ppd->pgtable_area;
133 ppd->pgtable_area += sizeof(*pud) * PTRS_PER_PUD;
137 pud = pud_offset(p4d, ppd->vaddr);
139 pmd = ppd->pgtable_area;
141 ppd->pgtable_area += sizeof(*pmd) * PTRS_PER_PMD;
151 static void __init sme_populate_pgd_large(struct sme_populate_pgd_data *ppd)
156 pud = sme_prepare_pgd(ppd);
160 pmd = pmd_offset(pud, ppd->vaddr);
164 set_pmd(pmd, __pmd(ppd->paddr | ppd->pmd_flags));
167 static void __init sme_populate_pgd(struct sme_populate_pgd_data *ppd)
173 pud = sme_prepare_pgd(ppd);
177 pmd = pmd_offset(pud, ppd->vaddr);
179 pte = ppd->pgtable_area;
181 ppd->pgtable_area += sizeof(*pte) * PTRS_PER_PTE;
188 pte = pte_offset_map(pmd, ppd->vaddr);
190 set_pte(pte, __pte(ppd->paddr | ppd->pte_flags));
193 static void __init __sme_map_range_pmd(struct sme_populate_pgd_data *ppd)
195 while (ppd->vaddr < ppd->vaddr_end) {
196 sme_populate_pgd_large(ppd);
198 ppd->vaddr += PMD_PAGE_SIZE;
199 ppd->paddr += PMD_PAGE_SIZE;
203 static void __init __sme_map_range_pte(struct sme_populate_pgd_data *ppd)
205 while (ppd->vaddr < ppd->vaddr_end) {
206 sme_populate_pgd(ppd);
208 ppd->vaddr += PAGE_SIZE;
209 ppd->paddr += PAGE_SIZE;
213 static void __init __sme_map_range(struct sme_populate_pgd_data *ppd,
218 ppd->pmd_flags = pmd_flags;
219 ppd->pte_flags = pte_flags;
222 vaddr_end = ppd->vaddr_end;
225 ppd->vaddr_end = ALIGN(ppd->vaddr, PMD_PAGE_SIZE);
226 __sme_map_range_pte(ppd);
229 ppd->vaddr_end = vaddr_end & PMD_PAGE_MASK;
230 __sme_map_range_pmd(ppd);
233 ppd->vaddr_end = vaddr_end;
234 __sme_map_range_pte(ppd);
237 static void __init sme_map_range_encrypted(struct sme_populate_pgd_data *ppd)
239 __sme_map_range(ppd, PMD_FLAGS_ENC, PTE_FLAGS_ENC);
242 static void __init sme_map_range_decrypted(struct sme_populate_pgd_data *ppd)
244 __sme_map_range(ppd, PMD_FLAGS_DEC, PTE_FLAGS_DEC);
247 static void __init sme_map_range_decrypted_wp(struct sme_populate_pgd_data *ppd)
249 __sme_map_range(ppd, PMD_FLAGS_DEC_WP, PTE_FLAGS_DEC_WP);
295 struct sme_populate_pgd_data ppd;
386 ppd.pgtable_area = (void *)execute_end;
392 ppd.pgd = (pgd_t *)native_read_cr3_pa();
393 ppd.paddr = workarea_start;
394 ppd.vaddr = workarea_start;
395 ppd.vaddr_end = workarea_end;
396 sme_map_range_decrypted(&ppd);
407 ppd.pgd = ppd.pgtable_area;
408 memset(ppd.pgd, 0, sizeof(pgd_t) * PTRS_PER_PGD);
409 ppd.pgtable_area += sizeof(pgd_t) * PTRS_PER_PGD;
427 ppd.paddr = kernel_start;
428 ppd.vaddr = kernel_start;
429 ppd.vaddr_end = kernel_end;
430 sme_map_range_encrypted(&ppd);
433 ppd.paddr = kernel_start;
434 ppd.vaddr = kernel_start + decrypted_base;
435 ppd.vaddr_end = kernel_end + decrypted_base;
436 sme_map_range_decrypted_wp(&ppd);
440 ppd.paddr = initrd_start;
441 ppd.vaddr = initrd_start;
442 ppd.vaddr_end = initrd_end;
443 sme_map_range_encrypted(&ppd);
447 ppd.paddr = initrd_start;
448 ppd.vaddr = initrd_start + decrypted_base;
449 ppd.vaddr_end = initrd_end + decrypted_base;
450 sme_map_range_decrypted_wp(&ppd);
454 ppd.paddr = workarea_start;
455 ppd.vaddr = workarea_start;
456 ppd.vaddr_end = workarea_end;
457 sme_map_range_decrypted(&ppd);
459 ppd.paddr = workarea_start;
460 ppd.vaddr = workarea_start + decrypted_base;
461 ppd.vaddr_end = workarea_end + decrypted_base;
462 sme_map_range_decrypted(&ppd);
466 kernel_len, workarea_start, (unsigned long)ppd.pgd);
471 (unsigned long)ppd.pgd);
478 ppd.vaddr = kernel_start + decrypted_base;
479 ppd.vaddr_end = kernel_end + decrypted_base;
480 sme_clear_pgd(&ppd);
483 ppd.vaddr = initrd_start + decrypted_base;
484 ppd.vaddr_end = initrd_end + decrypted_base;
485 sme_clear_pgd(&ppd);
488 ppd.vaddr = workarea_start + decrypted_base;
489 ppd.vaddr_end = workarea_end + decrypted_base;
490 sme_clear_pgd(&ppd);