Changeset View
Changeset View
Standalone View
Standalone View
sys/i386/i386/copyout.c
Show First 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | if (!THREAD_CAN_SLEEP() || curthread->td_vslock_sz > 0 || | ||||
kaddr = pc->pc_copyout_maddr; | kaddr = pc->pc_copyout_maddr; | ||||
} else { | } else { | ||||
sleepable = true; | sleepable = true; | ||||
sx_xlock(&pc->pc_copyout_slock); | sx_xlock(&pc->pc_copyout_slock); | ||||
kaddr = pc->pc_copyout_saddr; | kaddr = pc->pc_copyout_saddr; | ||||
} | } | ||||
for (i = 0, pte = vtopte(kaddr); i < plen; i++, pte++) { | for (i = 0, pte = vtopte(kaddr); i < plen; i++, pte++) { | ||||
*pte = PG_V | PG_RW | PG_A | PG_M | VM_PAGE_TO_PHYS(m[i]) | | *pte = PG_V | PG_RW | PG_A | PG_M | VM_PAGE_TO_PHYS(m[i]) | | ||||
pmap_cache_bits(pmap_page_get_memattr(m[i]), FALSE); | pmap_cache_bits(kernel_pmap, pmap_page_get_memattr(m[i]), | ||||
FALSE); | |||||
invlpg(kaddr + ptoa(i)); | invlpg(kaddr + ptoa(i)); | ||||
} | } | ||||
kaddr += uva - trunc_page(uva); | kaddr += uva - trunc_page(uva); | ||||
f(kaddr, arg); | f(kaddr, arg); | ||||
sched_unpin(); | sched_unpin(); | ||||
if (sleepable) | if (sleepable) | ||||
sx_xunlock(&pc->pc_copyout_slock); | sx_xunlock(&pc->pc_copyout_slock); | ||||
else | else | ||||
▲ Show 20 Lines • Show All 348 Lines • Show Last 20 Lines |