- maps = (struct ksecmap*)to_kphysical(__far(ksection_maps));
- ktep += pfn(to_kphysical(__far(__kexec_text_start)));
-
- // Ensure the size of kernel is within the reservation
- if (leaf_count(maps->ksize) > KEXEC_RSVD * _PAGE_LEVEL_SIZE)
- {
- // ERROR: require more pages
- // here should do something else other than head into blocking
- asm("ud2");
- }
-
- // Now, map the sections
-
- for (unsigned int i = 0; i < maps->num; i++)
- {
- section = &maps->secs[i];
-
- if (section->va < KERNEL_RESIDENT) {
- continue;
- }
-
- pte = mkpte_prot(KERNEL_RDONLY);
- if ((section->flags & PF_X)) {
- pte = pte_mkexec(pte);
- }
- if ((section->flags & PF_W)) {
- pte = pte_mkwritable(pte);
- }
-
- pgs = leaf_count(section->size);
- for (pfn_t j = 0; j < pgs; j++)
- {
- pte = pte_setpaddr(pte, section->pa + page_addr(j));
- set_pte(ktep, pte);
-
- ktep++;
- }
- }
-
- // set mount point
- kmntep = (pte_t*) &kpt_pa->l0t[pfn_at(PG_MOUNT_1, L0T_SIZE)];
- set_pte(kmntep, mkpte((ptr_t)kpt_pa->pg_mnt, KERNEL_PGTAB));
-
- // Build up self-reference
- int level = (VMS_SELF / L0T_SIZE) & _PAGE_LEVEL_MASK;
-
- pte = mkpte_root((ptr_t)kpt_pa, KERNEL_PGTAB);
- set_pte(&boot_l0tep[level], pte);