aboutsummaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorLuca Dariz <luca@orpolo.org>2023-02-12 18:28:13 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-12 18:47:42 +0100
commitfccebe66ff8cbcae6e30f6c1cfbff34d9e2a151e (patch)
treeeb0202a7d7cc9d7e2c848bab52467dd6fc0e2ac9 /i386
parentb2f97efa25a71e4d3a4eff7b02544e4c20fac6f2 (diff)
downloadgnumach-fccebe66ff8cbcae6e30f6c1cfbff34d9e2a151e.tar.gz
gnumach-fccebe66ff8cbcae6e30f6c1cfbff34d9e2a151e.tar.bz2
gnumach-fccebe66ff8cbcae6e30f6c1cfbff34d9e2a151e.zip
factor out PAE-specific bootstrap
* i386/intel/pmap.c: move it to pmap_bootstrap_pae() Message-Id: <20230212172818.1511405-5-luca@orpolo.org>
Diffstat (limited to 'i386')
-rw-r--r--i386/intel/pmap.c72
1 files changed, 40 insertions, 32 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 1361da34..a448361d 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -582,8 +582,46 @@ vm_offset_t pmap_map_bd(
return(virt);
}
+#ifdef PAE
+static void pmap_bootstrap_pae(void)
+{
+ vm_offset_t addr;
+
+#ifdef __x86_64__
+#ifdef MACH_HYP
+ kernel_pmap->user_l4base = NULL;
+ kernel_pmap->user_pdpbase = NULL;
+#endif
+ kernel_pmap->l4base = (pt_entry_t*)phystokv(pmap_grab_page());
+ memset(kernel_pmap->l4base, 0, INTEL_PGBYTES);
+#endif /* x86_64 */
+
+ init_alloc_aligned(PDPNUM * INTEL_PGBYTES, &addr);
+ kernel_page_dir = (pt_entry_t*)phystokv(addr);
+
+ kernel_pmap->pdpbase = (pt_entry_t*)phystokv(pmap_grab_page());
+ memset(kernel_pmap->pdpbase, 0, INTEL_PGBYTES);
+ for (int i = 0; i < PDPNUM; i++)
+ WRITE_PTE(&kernel_pmap->pdpbase[i],
+ pa_to_pte(_kvtophys((void *) kernel_page_dir
+ + i * INTEL_PGBYTES))
+ | INTEL_PTE_VALID
+#if (defined(__x86_64__) && !defined(MACH_HYP)) || defined(MACH_PV_PAGETABLES)
+ | INTEL_PTE_WRITE
+#endif
+ );
+
+#ifdef __x86_64__
+ WRITE_PTE(&kernel_pmap->l4base[0], pa_to_pte(_kvtophys(kernel_pmap->pdpbase)) | INTEL_PTE_VALID | INTEL_PTE_WRITE);
+#ifdef MACH_PV_PAGETABLES
+ pmap_set_page_readonly_init(kernel_pmap->l4base);
+#endif
+#endif /* x86_64 */
+}
+#endif /* PAE */
+
#ifdef MACH_PV_PAGETABLES
-void pmap_bootstrap_xen()
+static void pmap_bootstrap_xen(void)
{
/* We don't actually deal with the CR3 register content at all */
hyp_vm_assist(VMASST_CMD_enable, VMASST_TYPE_pae_extended_cr3);
@@ -692,37 +730,7 @@ void pmap_bootstrap(void)
/* Note: initial Xen mapping holds at least 512kB free mapped page.
* We use that for directly building our linear mapping. */
#if PAE
- {
- vm_offset_t addr;
- init_alloc_aligned(PDPNUM * INTEL_PGBYTES, &addr);
- kernel_page_dir = (pt_entry_t*)phystokv(addr);
- }
- kernel_pmap->pdpbase = (pt_entry_t*)phystokv(pmap_grab_page());
- memset(kernel_pmap->pdpbase, 0, INTEL_PGBYTES);
- {
- int i;
- for (i = 0; i < PDPNUM; i++)
- WRITE_PTE(&kernel_pmap->pdpbase[i],
- pa_to_pte(_kvtophys((void *) kernel_page_dir
- + i * INTEL_PGBYTES))
- | INTEL_PTE_VALID
-#if (defined(__x86_64__) && !defined(MACH_HYP)) || defined(MACH_PV_PAGETABLES)
- | INTEL_PTE_WRITE
-#endif
- );
- }
-#ifdef __x86_64__
-#ifdef MACH_HYP
- kernel_pmap->user_l4base = NULL;
- kernel_pmap->user_pdpbase = NULL;
-#endif
- kernel_pmap->l4base = (pt_entry_t*)phystokv(pmap_grab_page());
- memset(kernel_pmap->l4base, 0, INTEL_PGBYTES);
- WRITE_PTE(&kernel_pmap->l4base[0], pa_to_pte(_kvtophys(kernel_pmap->pdpbase)) | INTEL_PTE_VALID | INTEL_PTE_WRITE);
-#ifdef MACH_PV_PAGETABLES
- pmap_set_page_readonly_init(kernel_pmap->l4base);
-#endif
-#endif /* x86_64 */
+ pmap_bootstrap_pae();
#else /* PAE */
kernel_pmap->dirbase = kernel_page_dir = (pt_entry_t*)phystokv(pmap_grab_page());
#endif /* PAE */