In message <[EMAIL PROTECTED]>, Matthew Dillon w rites: > I'm trying to figure out how the acpi_sleep_machdep() code works and > there are a couple of lines I just don't understand: > > pm = vmspace_pmap(p->p_vmspace); > cr3 = rcr3(); >#ifdef PAE > load_cr3(vtophys(pm->pm_pdpt)); >#else > load_cr3(vtophys(pm->pm_pdir)); >#endif > > page = PHYS_TO_VM_PAGE(sc->acpi_wakephys); > pmap_enter(pm, sc->acpi_wakephys, page, > VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE, 1); > > First, why isn't it just using kernel_pmap ? What's all the load_cr3() > stuff for ? > > Second, why is it entering the physical address sc->acpi_wakephys > as the virtual address in the pmap ? Shouldn't it be using > sc->acpi_wakeaddr there? > > Anybody know ?
I don't know the details, but acpi_sleep_machdep() sets up an identity mapping in the current process's vmspace (hence using virtual = physical). Lazy switching of address spaces means that cr3 may not currently refer to the same vmspace, which would break the identity mapping, so that's the reason for the load_cr3() calls. See revision 1.22 for a bit more information. Ian _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"