Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src/sys/arch
On 06.11.2011 16:18, Cherry G. Mathew wrote:
> Module Name: src
> Committed By: cherry
> Date: Sun Nov 6 15:18:19 UTC 2011
>
> Modified Files:
> src/sys/arch/amd64/include: pmap.h
> src/sys/arch/i386/include: pmap.h
> src/sys/arch/x86/include: cpu.h
> src/sys/arch/x86/x86: pmap.c
> src/sys/arch/xen/x86: cpu.c x86_xpmap.c
>
> Log Message:
> [merging from cherry-xenmp] make pmap_kernel() shadow PMD per-cpu and
MP aware.
Some comments.
> -#ifdef PAE
> -/* Address of the static kernel's L2 page */
> -pd_entry_t *pmap_kl2pd;
> -paddr_t pmap_kl2paddr;
> -#endif
> -
> -
[snip]
> #ifdef PAE
> - uint32_t ci_pae_l3_pdirpa; /* PA of L3 PD */
> + paddr_t ci_pae_l3_pdirpa; /* PA of L3 PD */
> pd_entry_t * ci_pae_l3_pdir; /* VA pointer to L3 PD */
> #endif
>
[snip]
> +
> +#if defined(PAE)
> + ci->ci_pae_l3_pdir = (paddr_t *)uvm_km_alloc(kernel_map, PAGE_SIZE, 0,
> + UVM_KMF_WIRED | UVM_KMF_ZERO | UVM_KMF_NOWAIT);
> +
> + if (ci->ci_pae_l3_pdir == NULL) {
> + panic("%s: failed to allocate L3 per-cpu PD for CPU %d\n",
> + __func__, cpu_index(ci));
> + }
Please keep ci_pae_l3_pdir to a uint32_t and back out its paddr_t type.
Unless you can convince me that your code will do the right thing(tm),
the PDP for PAE should to be allocated below the 4GiB physical boundary;
unless mistaken, the uvm_km_alloc(kernel_map, ...) does not enforce
that. Besides, %cr3 is still a 32 bits entity under PAE. Trying to stash
a 64 bits paddr_t in %cr3 is a really bad idea.
See comments http://nxr.netbsd.org/xref/src/sys/arch/x86/x86/pmap.c#1588
> -/* flag to be used for kernel mappings: PG_u on Xen/amd64, 0
otherwise */
> -#if defined(XEN)&& defined(__x86_64__)
> -#define PG_k PG_u
> -#else
> -#define PG_k 0
> -#endif
> -
Are you sure that all the mapping sites are safe (PT/PD bits), given the
pmap split between pmap/xen_xpmap.c?
On a side note, please stick to KNF especially for 80 columns.
[snip]
> +void
> +pmap_cpu_init_late(struct cpu_info *ci)
> +{
> +#if defined(PAE) || defined(__x86_64__)
> + /*
> + * The BP has already its own PD page allocated during early
> + * MD startup.
> + */
> +
> + if (ci ==&cpu_info_primary)
> + return;
> +
> + KASSERT(ci != NULL);
> + ci->ci_pae_l3_pdirpa = vtophys((vaddr_t) ci->ci_pae_l3_pdir);
> + KASSERT(ci->ci_pae_l3_pdirpa != 0);
> +
> + /* Initialise L2 entries 0 - 2: Point them to pmap_kernel() */
> + ci->ci_pae_l3_pdir[0] =
> + xpmap_ptom_masked(pmap_kernel()->pm_pdirpa[0]) | PG_V;
> + ci->ci_pae_l3_pdir[1] =
> + xpmap_ptom_masked(pmap_kernel()->pm_pdirpa[1]) | PG_V;
> + ci->ci_pae_l3_pdir[2] =
> + xpmap_ptom_masked(pmap_kernel()->pm_pdirpa[2]) | PG_V;
> +#endif /* PAE */
- are you sure that these have to be
"defined(PAE) || defined(__x86_64__)" ?
- please use "for (i = 0; i < PTP_LEVELS - 1; i++ ) { ... }". I will
have to identify these blocks later when GENERIC will include both PAE
and !PAE pmaps. PTP_LEVELS makes it a lot easier.
That's all for the first quick review :) Thanks for starting the merge
of your branch.
--
Jean-Yves Migeon
jeanyves.migeon%free.fr@localhost
Home |
Main Index |
Thread Index |
Old Index