Lines Matching defs:pvo

178  * Lock for the pteg and pvo tables.
196 struct pvo_head *moea_pvo_table; /* pvo entries by pteg index */
202 uma_zone_t moea_upvo_zone; /* zone for pvo entries for unmanaged pages */
203 uma_zone_t moea_mpvo_zone; /* zone for pvo entries for managed pages */
847 * Initialize the lock that synchronizes access to the pteg and pvo
857 * Initialise the unmanaged pvo pool.
1020 struct pvo_entry key, *pvo;
1024 for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
1025 pvo != NULL && PVO_VADDR(pvo) < eva;
1026 pvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo)) {
1027 if ((pvo->pvo_vaddr & PVO_WIRED) == 0)
1028 panic("moea_unwire: pvo %p is missing PVO_WIRED", pvo);
1029 pvo->pvo_vaddr &= ~PVO_WIRED;
1159 /* XXX change the pvo head for fake pages */
1245 struct pvo_entry *pvo;
1249 pvo = moea_pvo_find_va(pm, va & ~ADDR_POFF, NULL);
1250 if (pvo == NULL)
1253 pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) | (va & ADDR_POFF);
1266 struct pvo_entry *pvo;
1274 pvo = moea_pvo_find_va(pmap, va & ~ADDR_POFF, NULL);
1275 if (pvo != NULL && (pvo->pvo_pte.pte.pte_hi & PTE_VALID) &&
1276 ((pvo->pvo_pte.pte.pte_lo & PTE_PP) == PTE_RW ||
1278 if (vm_page_pa_tryrelock(pmap, pvo->pvo_pte.pte.pte_lo & PTE_RPGN, &pa))
1280 m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN);
1339 struct pvo_entry *pvo;
1343 pvo = moea_pvo_find_va(pmap, va & ~ADDR_POFF, NULL);
1344 rv = pvo == NULL || (pvo->pvo_pte.pte.pte_hi & PTE_VALID) == 0;
1377 struct pvo_entry *pvo;
1396 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
1397 pmap = pvo->pvo_pmap;
1399 if ((pvo->pvo_pte.pte.pte_lo & PTE_PP) != PTE_BR) {
1400 pt = moea_pvo_to_pte(pvo, -1);
1401 pvo->pvo_pte.pte.pte_lo &= ~PTE_PP;
1402 pvo->pvo_pte.pte.pte_lo |= PTE_BR;
1404 moea_pte_synch(pt, &pvo->pvo_pte.pte);
1405 lo |= pvo->pvo_pte.pte.pte_lo;
1406 pvo->pvo_pte.pte.pte_lo &= ~PTE_CHG;
1407 moea_pte_change(pt, &pvo->pvo_pte.pte,
1408 pvo->pvo_vaddr);
1453 struct pvo_entry *pvo;
1468 LIST_FOREACH(pvo, pvo_head, pvo_vlink) {
1469 pmap = pvo->pvo_pmap;
1471 pt = moea_pvo_to_pte(pvo, -1);
1472 pvo->pvo_pte.pte.pte_lo &= ~PTE_WIMG;
1473 pvo->pvo_pte.pte.pte_lo |= lo;
1475 moea_pte_change(pt, &pvo->pvo_pte.pte,
1476 pvo->pvo_vaddr);
1477 if (pvo->pvo_pmap == kernel_pmap)
1529 struct pvo_entry *pvo;
1540 pvo = moea_pvo_find_va(kernel_pmap, va & ~ADDR_POFF, NULL);
1541 KASSERT(pvo != NULL, ("moea_kextract: no addr found"));
1542 pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) | (va & ADDR_POFF);
1591 struct pvo_entry *pvo;
1599 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
1600 if (pvo->pvo_pmap == pmap) {
1618 struct pvo_entry *pvo;
1625 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink)
1626 if ((pvo->pvo_vaddr & PVO_WIRED) != 0)
1716 struct pvo_entry *pvo, *tpvo, key;
1730 for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
1731 pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) {
1732 tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo);
1738 pt = moea_pvo_to_pte(pvo, -1);
1742 pvo->pvo_pte.pte.pte_lo &= ~PTE_PP;
1743 pvo->pvo_pte.pte.pte_lo |= PTE_BR;
1749 moea_pte_change(pt, &pvo->pvo_pte.pte, pvo->pvo_vaddr);
1816 struct pvo_entry *pvo, *tpvo, key;
1821 for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
1822 pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) {
1823 tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo);
1824 moea_pvo_remove(pvo, -1);
1838 struct pvo_entry *pvo, *next_pvo;
1843 for (pvo = LIST_FIRST(pvo_head); pvo != NULL; pvo = next_pvo) {
1844 next_pvo = LIST_NEXT(pvo, pvo_vlink);
1846 pmap = pvo->pvo_pmap;
1848 moea_pvo_remove(pvo, -1);
1912 struct pvo_entry *pvo;
1931 * Remove any existing mapping for this page. Reuse the pvo entry if
1935 LIST_FOREACH(pvo, &moea_pvo_table[ptegidx], pvo_olink) {
1936 if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) {
1937 if ((pvo->pvo_pte.pte.pte_lo & PTE_RPGN) == pa &&
1938 (pvo->pvo_pte.pte.pte_lo & PTE_PP) ==
1947 (pvo->pvo_vaddr & PVO_WIRED) == 0) {
1948 pvo->pvo_vaddr |= PVO_WIRED;
1951 (pvo->pvo_vaddr & PVO_WIRED) != 0) {
1952 pvo->pvo_vaddr &= ~PVO_WIRED;
1957 moea_pvo_remove(pvo, -1);
1966 pvo = uma_zalloc(zone, M_NOWAIT);
1973 pvo = &moea_bpvo_pool[moea_bpvo_pool_index];
1978 if (pvo == NULL) {
1984 pvo->pvo_vaddr = va;
1985 pvo->pvo_pmap = pm;
1986 LIST_INSERT_HEAD(&moea_pvo_table[ptegidx], pvo, pvo_olink);
1987 pvo->pvo_vaddr &= ~ADDR_POFF;
1989 pvo->pvo_vaddr |= PVO_WIRED;
1991 pvo->pvo_vaddr |= PVO_MANAGED;
1993 pvo->pvo_vaddr |= PVO_BOOTSTRAP;
1995 moea_pte_create(&pvo->pvo_pte.pte, sr, va, pa | pte_lo);
2000 RB_INSERT(pvo_tree, &pm->pmap_pvo, pvo);
2008 LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink);
2010 if (pvo->pvo_pte.pte.pte_lo & PVO_WIRED)
2014 i = moea_pte_insert(ptegidx, &pvo->pvo_pte.pte);
2017 PVO_PTEGIDX_SET(pvo, i);
2028 moea_pvo_remove(struct pvo_entry *pvo, int pteidx)
2036 pt = moea_pvo_to_pte(pvo, pteidx);
2038 moea_pte_unset(pt, &pvo->pvo_pte.pte, pvo->pvo_vaddr);
2040 PVO_PTEGIDX_CLR(pvo);
2048 pvo->pvo_pmap->pm_stats.resident_count--;
2049 if (pvo->pvo_pte.pte.pte_lo & PVO_WIRED)
2050 pvo->pvo_pmap->pm_stats.wired_count--;
2055 if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED) {
2058 pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN);
2060 moea_attr_save(pg, pvo->pvo_pte.pte.pte_lo &
2068 LIST_REMOVE(pvo, pvo_vlink);
2069 RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo);
2075 LIST_REMOVE(pvo, pvo_olink);
2076 if (!(pvo->pvo_vaddr & PVO_BOOTSTRAP))
2077 uma_zfree(pvo->pvo_vaddr & PVO_MANAGED ? moea_mpvo_zone :
2078 moea_upvo_zone, pvo);
2084 moea_pvo_pte_index(const struct pvo_entry *pvo, int ptegidx)
2093 pteidx = ptegidx * 8 + PVO_PTEGIDX_GET(pvo);
2094 if (pvo->pvo_pte.pte.pte_hi & PTE_HID)
2103 struct pvo_entry *pvo;
2112 LIST_FOREACH(pvo, &moea_pvo_table[ptegidx], pvo_olink) {
2113 if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) {
2115 *pteidx_p = moea_pvo_pte_index(pvo, ptegidx);
2121 return (pvo);
2125 moea_pvo_to_pte(const struct pvo_entry *pvo, int pteidx)
2136 sr = va_to_sr(pvo->pvo_pmap->pm_sr, pvo->pvo_vaddr);
2137 ptegidx = va_to_pteg(sr, pvo->pvo_vaddr);
2138 pteidx = moea_pvo_pte_index(pvo, ptegidx);
2144 if ((pvo->pvo_pte.pte.pte_hi & PTE_VALID) && !PVO_PTEGIDX_ISSET(pvo)) {
2145 panic("moea_pvo_to_pte: pvo %p has valid pte in pvo but no "
2146 "valid pte index", pvo);
2149 if ((pvo->pvo_pte.pte.pte_hi & PTE_VALID) == 0 && PVO_PTEGIDX_ISSET(pvo)) {
2150 panic("moea_pvo_to_pte: pvo %p has valid pte index in pvo "
2151 "pvo but no valid pte", pvo);
2154 if ((pt->pte_hi ^ (pvo->pvo_pte.pte.pte_hi & ~PTE_VALID)) == PTE_VALID) {
2155 if ((pvo->pvo_pte.pte.pte_hi & PTE_VALID) == 0) {
2156 panic("moea_pvo_to_pte: pvo %p has valid pte in "
2157 "moea_pteg_table %p but invalid in pvo", pvo, pt);
2160 if (((pt->pte_lo ^ pvo->pvo_pte.pte.pte_lo) & ~(PTE_CHG|PTE_REF))
2162 panic("moea_pvo_to_pte: pvo %p pte does not match "
2163 "pte %p in moea_pteg_table", pvo, pt);
2170 if (pvo->pvo_pte.pte.pte_hi & PTE_VALID) {
2171 panic("moea_pvo_to_pte: pvo %p has invalid pte %p in "
2172 "moea_pteg_table but valid in pvo: %8x, %8x", pvo, pt, pvo->pvo_pte.pte.pte_hi, pt->pte_hi);
2186 struct pvo_entry *pvo;
2209 LIST_FOREACH(pvo, &moea_pvo_table[ptegidx], pvo_olink) {
2211 * We need to find a pvo entry for this address.
2214 moea_pte_match(&pvo->pvo_pte.pte, sr, addr,
2215 pvo->pvo_pte.pte.pte_hi & PTE_HID)) {
2220 j = moea_pte_insert(ptegidx, &pvo->pvo_pte.pte);
2223 PVO_PTEGIDX_SET(pvo, j);
2229 source_pvo = pvo;
2236 * We also need the pvo entry of the victim we are replacing
2240 moea_pte_compare(pt, &pvo->pvo_pte.pte)) {
2241 victim_pvo = pvo;
2254 panic("moea_pte_spill: victim p-pte (%p) has no pvo"
2259 * pvo bucket for the matching PVO.
2261 LIST_FOREACH(pvo, &moea_pvo_table[ptegidx ^ moea_pteg_mask],
2264 * We also need the pvo entry of the victim we are
2267 if (moea_pte_compare(pt, &pvo->pvo_pte.pte)) {
2268 victim_pvo = pvo;
2274 panic("moea_pte_spill: victim s-pte (%p) has no pvo"
2300 struct pvo_entry *pvo_walk, *pvo = NULL;
2314 pvo = pvo_walk;
2321 return (pvo);
2404 struct pvo_entry *pvo;
2411 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
2417 if (pvo->pvo_pte.pte.pte_lo & ptebit) {
2429 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
2432 * See if this pvo has a valid PTE. if so, fetch the
2436 pt = moea_pvo_to_pte(pvo, -1);
2438 moea_pte_synch(pt, &pvo->pvo_pte.pte);
2440 if (pvo->pvo_pte.pte.pte_lo & ptebit) {
2454 struct pvo_entry *pvo;
2466 * we can reset the right ones). note that since the pvo entries and
2474 * For each pvo entry, clear the pvo's ptebit. If this pvo has a
2478 LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
2479 pt = moea_pvo_to_pte(pvo, -1);
2481 moea_pte_synch(pt, &pvo->pvo_pte.pte);
2482 if (pvo->pvo_pte.pte.pte_lo & ptebit) {
2484 moea_pte_clear(pt, PVO_VADDR(pvo), ptebit);
2488 pvo->pvo_pte.pte.pte_lo &= ~ptebit;
2619 struct pvo_entry *pvo;
2628 pvo = moea_pvo_find_va(pm, va & ~ADDR_POFF, NULL);
2629 if (pvo != NULL) {
2630 pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) |
2654 struct pvo_entry *pvo;
2684 pvo = moea_pvo_find_va(kernel_pmap,
2686 if (pvo != NULL &&
2687 (pvo->pvo_pte.pte.pte_hi & PTE_VALID))
2699 pvo = moea_pvo_find_va(kernel_pmap,
2701 if (pvo == NULL ||
2702 !(pvo->pvo_pte.pte.pte_hi & PTE_VALID))