- prealloc_pt(&alloc, PMAP, KERNEL_DATA, gran);
- klptep = prealloc_pt(&alloc, kstart, KERNEL_DATA, gran);
- klptep += va_level_index(kstart, gran);
-
- pte = mkpte(0, KERNEL_DATA);
- for (int i = alloc.pt_usage; i < KEXEC_RSVD; i++)
- {
- pte = pte_setpaddr(pte, (ptr_t)&kpt_pa->krsvd[i]);
- set_pte(klptep++, pte);
- }
-
- // this is the first LFT we hooked on.
- // all these LFT are contig in physical address
- klptep = (pte_t*) &kpt_pa->krsvd[alloc.pt_usage];
-
- // Ensure the size of kernel is within the reservation
- int remain = KEXEC_RSVD - table_usage;
- pfn_t kimg_pagecount =
- pfn(__far(__kexec_end) - __far(__kexec_start));
- if (kimg_pagecount > remain * _PAGE_LEVEL_SIZE) {
- // ERROR: require more pages
- // here should do something else other than head into blocking
- asm("ud2");
- }
-
- // kernel .text
- pfn_t ktext_end = pfn(to_kphysical(__far(__kexec_text_end)));
- pfn_t i = pfn(to_kphysical(kstart));
-
- klptep += i;
- pte = pte_setprot(pte, KERNEL_EXEC);
- for (; i < ktext_end; i++) {
- pte = pte_setpaddr(pte, page_addr(i));
- set_pte(klptep, pte);
+ kpt_mktable_at(&ptw, KMAP, gran);
+ kpt_mktable_at(&ptw, PMAP, gran);