On Sun, Jun 20, 2010 at 07:45:32PM +0200, Jean-Yves Migeon wrote:
> For convenience, here's i386_cpu_switch_pmap:

I know that a lot of legacy code uses the preprocessor the way that you
have in i386_cpu_switch_pmap(), but I don't think that the preprocessor
should be used in that way any longer.  In my experience, code that uses
the preprocessor heavily is harder to read and to change and to test.
Why don't you let config(1) and ld(1) do the work that the preprocessor
does?  For example:

file switch_pmap_pae_xen.c      pae & xen

/*
 * Switches pmap for the current CPU. Hides the implementation
 * differences between the PAE and non-PAE cases.
 */
void
i386_cpu_switch_pmap(struct pmap *pmap)
{
        int i;
        int s = splvm(); /* just to be safe */
        struct cpu_info *ci = curcpu();
        paddr_t l3_pd = xpmap_ptom_masked(ci->ci_l3_pdirpa);
        /* don't update the kernel L3 slot */
        for (i = 0 ; i < PDP_SIZE - 1; i++) {
                xpq_queue_pte_update(l3_pd + i * sizeof(pd_entry_t),
                    xpmap_ptom(pmap->pm_pdirpa[i]) | PG_V);
        }
        splx(s);

        u_int gen = uvm_emap_gen_return();
        tlbflush();
        uvm_emap_update(gen);
}

file switch_pmap_pae.c          pae & !xen
/*
 * Switches pmap for the current CPU. Hides the implementation
 * differences between the PAE and non-PAE cases.
 */
void
i386_cpu_switch_pmap(struct pmap *pmap)
{
        int i;
        int s = splvm(); /* just to be safe */
        struct cpu_info *ci = curcpu();
        pd_entry_t *l3_pd = ci->ci_l3_pdir;
        for (i = 0 ; i < PDP_SIZE; i++) {
                l3_pd[i] = pmap->pm_pdirpa[i] | PG_V;
        }
        splx(s);

        u_int gen = uvm_emap_gen_return();
        tlbflush();
        uvm_emap_update(gen);
}

file switch_pmap.c              !pae

/*
 * Switches pmap for the current CPU. Hides the implementation
 * differences between the PAE and non-PAE cases.
 */
void
i386_cpu_switch_pmap(struct pmap *pmap)
{
        u_int gen = uvm_emap_gen_return();
        lcr3(pmap_pdirpa(pmap, 0));
        uvm_emap_update(gen);
}

-- 
David Young             OJC Technologies
dyo...@ojctech.com      Urbana, IL * (217) 278-3933

Reply via email to