|
|
| version 1.32, 2004/03/01 06:33:16 | version 1.33, 2004/04/01 17:58:00 |
|---|---|
| Line 689 pmap_extract_vmpage(pmap_t pmap, vm_offs | Line 689 pmap_extract_vmpage(pmap_t pmap, vm_offs |
| * note that in order for the mapping to take effect -- you | * note that in order for the mapping to take effect -- you |
| * should do a invltlb after doing the pmap_kenter... | * should do a invltlb after doing the pmap_kenter... |
| */ | */ |
| PMAP_INLINE void | void |
| pmap_kenter(vm_offset_t va, vm_paddr_t pa) | pmap_kenter(vm_offset_t va, vm_paddr_t pa) |
| { | { |
| unsigned *pte; | unsigned *pte; |
| Line 704 pmap_kenter(vm_offset_t va, vm_paddr_t p | Line 704 pmap_kenter(vm_offset_t va, vm_paddr_t p |
| pmap_inval_flush(&info); | pmap_inval_flush(&info); |
| } | } |
| void | |
| pmap_kenter_quick(vm_offset_t va, vm_paddr_t pa) | |
| { | |
| unsigned *pte; | |
| unsigned npte; | |
| npte = pa | PG_RW | PG_V | pgeflag; | |
| pte = (unsigned *)vtopte(va); | |
| *pte = npte; | |
| cpu_invlpg((void *)va); | |
| } | |
| void | |
| pmap_kenter_sync(vm_offset_t va) | |
| { | |
| pmap_inval_info info; | |
| pmap_inval_init(&info); | |
| pmap_inval_add(&info, kernel_pmap, va); | |
| pmap_inval_flush(&info); | |
| } | |
| void | |
| pmap_kenter_sync_quick(vm_offset_t va) | |
| { | |
| cpu_invlpg((void *)va); | |
| } | |
| /* | /* |
| * remove a page from the kernel pagetables | * remove a page from the kernel pagetables |
| */ | */ |
| PMAP_INLINE void | void |
| pmap_kremove(vm_offset_t va) | pmap_kremove(vm_offset_t va) |
| { | { |
| unsigned *pte; | unsigned *pte; |
| Line 720 pmap_kremove(vm_offset_t va) | Line 748 pmap_kremove(vm_offset_t va) |
| pmap_inval_flush(&info); | pmap_inval_flush(&info); |
| } | } |
| void | |
| pmap_kremove_quick(vm_offset_t va) | |
| { | |
| unsigned *pte; | |
| pte = (unsigned *)vtopte(va); | |
| *pte = 0; | |
| cpu_invlpg((void *)va); | |
| } | |
| /* | /* |
| * Used to map a range of physical addresses into kernel | * Used to map a range of physical addresses into kernel |
| * virtual address space. | * virtual address space. |
| Line 870 pmap_swapout_proc(struct proc *p) | Line 907 pmap_swapout_proc(struct proc *p) |
| panic("pmap_swapout_proc: upage already missing???"); | panic("pmap_swapout_proc: upage already missing???"); |
| vm_page_dirty(m); | vm_page_dirty(m); |
| vm_page_unwire(m, 0); | vm_page_unwire(m, 0); |
| pmap_kremove( (vm_offset_t) p->p_addr + PAGE_SIZE * i); | pmap_kremove((vm_offset_t)p->p_addr + (PAGE_SIZE * i)); |
| } | } |
| #endif | #endif |
| } | } |
| Line 891 pmap_swapin_proc(struct proc *p) | Line 928 pmap_swapin_proc(struct proc *p) |
| m = vm_page_grab(upobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); | m = vm_page_grab(upobj, i, VM_ALLOC_NORMAL | VM_ALLOC_RETRY); |
| pmap_kenter(((vm_offset_t) p->p_addr) + i * PAGE_SIZE, | pmap_kenter((vm_offset_t)p->p_addr + (i * PAGE_SIZE), |
| VM_PAGE_TO_PHYS(m)); | VM_PAGE_TO_PHYS(m)); |
| if (m->valid != VM_PAGE_BITS_ALL) { | if (m->valid != VM_PAGE_BITS_ALL) { |
| Line 1001 pmap_pinit0(struct pmap *pmap) | Line 1038 pmap_pinit0(struct pmap *pmap) |
| { | { |
| pmap->pm_pdir = | pmap->pm_pdir = |
| (pd_entry_t *)kmem_alloc_pageable(kernel_map, PAGE_SIZE); | (pd_entry_t *)kmem_alloc_pageable(kernel_map, PAGE_SIZE); |
| pmap_kenter((vm_offset_t) pmap->pm_pdir, (vm_offset_t) IdlePTD); | pmap_kenter((vm_offset_t)pmap->pm_pdir, (vm_offset_t) IdlePTD); |
| pmap->pm_count = 1; | pmap->pm_count = 1; |
| pmap->pm_active = 0; | pmap->pm_active = 0; |
| pmap->pm_ptphint = NULL; | pmap->pm_ptphint = NULL; |
| Line 1046 pmap_pinit(struct pmap *pmap) | Line 1083 pmap_pinit(struct pmap *pmap) |
| vm_page_flag_clear(ptdpg, PG_MAPPED | PG_BUSY); /* not usually mapped*/ | vm_page_flag_clear(ptdpg, PG_MAPPED | PG_BUSY); /* not usually mapped*/ |
| ptdpg->valid = VM_PAGE_BITS_ALL; | ptdpg->valid = VM_PAGE_BITS_ALL; |
| pmap_kenter((vm_offset_t) pmap->pm_pdir, VM_PAGE_TO_PHYS(ptdpg)); | pmap_kenter((vm_offset_t)pmap->pm_pdir, VM_PAGE_TO_PHYS(ptdpg)); |
| if ((ptdpg->flags & PG_ZERO) == 0) | if ((ptdpg->flags & PG_ZERO) == 0) |
| bzero(pmap->pm_pdir, PAGE_SIZE); | bzero(pmap->pm_pdir, PAGE_SIZE); |
| Line 1107 pmap_release_free_page(struct pmap *pmap | Line 1144 pmap_release_free_page(struct pmap *pmap |
| bzero(pde + KPTDI, nkpt * PTESIZE); | bzero(pde + KPTDI, nkpt * PTESIZE); |
| pde[MPPTDI] = 0; | pde[MPPTDI] = 0; |
| pde[APTDPTDI] = 0; | pde[APTDPTDI] = 0; |
| pmap_kremove((vm_offset_t) pmap->pm_pdir); | pmap_kremove((vm_offset_t)pmap->pm_pdir); |
| } | } |
| if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex)) | if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex)) |