Applied, thanks! Luca Dariz, le dim. 12 févr. 2023 18:28:13 +0100, a ecrit: > * i386/intel/pmap.c: move it to pmap_bootstrap_pae() > --- > i386/intel/pmap.c | 72 ++++++++++++++++++++++++++--------------------- > 1 file changed, 40 insertions(+), 32 deletions(-) > > diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c > index 15577a09..470be744 100644 > --- a/i386/intel/pmap.c > +++ b/i386/intel/pmap.c > @@ -581,8 +581,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); > @@ -691,37 +729,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 */ > -- > 2.30.2 > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.