Deleted Added
full compact
pmap.c (99999) pmap.c (100718)
1/*
2 * Copyright (c) 1991 Regents of the University of California.
3 * All rights reserved.
4 * Copyright (c) 1994 John S. Dyson
5 * All rights reserved.
6 * Copyright (c) 1994 David Greenman
7 * All rights reserved.
8 *

--- 25 unchanged lines hidden (view full) ---

34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 *
41 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
1/*
2 * Copyright (c) 1991 Regents of the University of California.
3 * All rights reserved.
4 * Copyright (c) 1994 John S. Dyson
5 * All rights reserved.
6 * Copyright (c) 1994 David Greenman
7 * All rights reserved.
8 *

--- 25 unchanged lines hidden (view full) ---

34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 *
41 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
42 * $FreeBSD: head/sys/sparc64/sparc64/pmap.c 99999 2002-07-14 23:23:47Z alc $
42 * $FreeBSD: head/sys/sparc64/sparc64/pmap.c 100718 2002-07-26 15:54:04Z jake $
43 */
44
45/*
46 * Manages physical address maps.
47 *
48 * In addition to hardware address maps, this module is called upon to
49 * provide software-use-only maps which may or may not be stored in the
50 * same form as hardware maps. These pseudo-maps are used to store

--- 546 unchanged lines hidden (view full) ---

597 PMAP_STATS_INC(pmap_ncache_enter_nc);
598 if ((m->md.flags & PG_UNCACHEABLE) != 0) {
599 CTR0(KTR_PMAP, "pmap_cache_enter: already uncacheable");
600 return (0);
601 }
602 CTR0(KTR_PMAP, "pmap_cache_enter: marking uncacheable");
603 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
604 tp->tte_data &= ~TD_CV;
43 */
44
45/*
46 * Manages physical address maps.
47 *
48 * In addition to hardware address maps, this module is called upon to
49 * provide software-use-only maps which may or may not be stored in the
50 * same form as hardware maps. These pseudo-maps are used to store

--- 546 unchanged lines hidden (view full) ---

597 PMAP_STATS_INC(pmap_ncache_enter_nc);
598 if ((m->md.flags & PG_UNCACHEABLE) != 0) {
599 CTR0(KTR_PMAP, "pmap_cache_enter: already uncacheable");
600 return (0);
601 }
602 CTR0(KTR_PMAP, "pmap_cache_enter: marking uncacheable");
603 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
604 tp->tte_data &= ~TD_CV;
605 tlb_page_demap(TLB_DTLB | TLB_ITLB, TTE_GET_PMAP(tp),
606 TTE_GET_VA(tp));
605 tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
607 }
608 dcache_page_inval(VM_PAGE_TO_PHYS(m));
609 m->md.flags |= PG_UNCACHEABLE;
610 return (0);
611}
612
613void
614pmap_cache_remove(vm_page_t m, vm_offset_t va)

--- 10 unchanged lines hidden (view full) ---

625 for (i = 0, c = 0; i < DCACHE_COLORS; i++) {
626 if (m->md.colors[i] != 0)
627 c++;
628 }
629 if (c > 1 || (m->md.flags & PG_UNCACHEABLE) == 0)
630 return;
631 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
632 tp->tte_data |= TD_CV;
606 }
607 dcache_page_inval(VM_PAGE_TO_PHYS(m));
608 m->md.flags |= PG_UNCACHEABLE;
609 return (0);
610}
611
612void
613pmap_cache_remove(vm_page_t m, vm_offset_t va)

--- 10 unchanged lines hidden (view full) ---

624 for (i = 0, c = 0; i < DCACHE_COLORS; i++) {
625 if (m->md.colors[i] != 0)
626 c++;
627 }
628 if (c > 1 || (m->md.flags & PG_UNCACHEABLE) == 0)
629 return;
630 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
631 tp->tte_data |= TD_CV;
633 tlb_page_demap(TLB_DTLB | TLB_ITLB, TTE_GET_PMAP(tp),
634 TTE_GET_VA(tp));
632 tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
635 }
636 m->md.flags &= ~PG_UNCACHEABLE;
637}
638
639/*
640 * Map a wired page into kernel virtual address space.
641 */
642void

--- 10 unchanged lines hidden (view full) ---

653 CTR4(KTR_PMAP, "pmap_kenter: va=%#lx pa=%#lx tp=%p data=%#lx",
654 va, pa, tp, tp->tte_data);
655 if ((tp->tte_data & TD_V) != 0) {
656 om = PHYS_TO_VM_PAGE(TTE_GET_PA(tp));
657 ova = TTE_GET_VA(tp);
658 STAILQ_REMOVE(&om->md.tte_list, tp, tte, tte_link);
659 pmap_cache_remove(om, ova);
660 if (va != ova)
633 }
634 m->md.flags &= ~PG_UNCACHEABLE;
635}
636
637/*
638 * Map a wired page into kernel virtual address space.
639 */
640void

--- 10 unchanged lines hidden (view full) ---

651 CTR4(KTR_PMAP, "pmap_kenter: va=%#lx pa=%#lx tp=%p data=%#lx",
652 va, pa, tp, tp->tte_data);
653 if ((tp->tte_data & TD_V) != 0) {
654 om = PHYS_TO_VM_PAGE(TTE_GET_PA(tp));
655 ova = TTE_GET_VA(tp);
656 STAILQ_REMOVE(&om->md.tte_list, tp, tte, tte_link);
657 pmap_cache_remove(om, ova);
658 if (va != ova)
661 tlb_page_demap(TLB_DTLB, kernel_pmap, ova);
659 tlb_page_demap(kernel_pmap, ova);
662 }
663 data = TD_V | TD_8K | TD_PA(pa) | TD_REF | TD_SW | TD_CP | TD_P | TD_W;
664 if (pmap_cache_enter(m, va) != 0)
665 data |= TD_CV;
666 tp->tte_vpn = TV_VPN(va);
667 tp->tte_data = data;
668 STAILQ_INSERT_TAIL(&m->md.tte_list, tp, tte_link);
669 tp->tte_pmap = kernel_pmap;

--- 164 unchanged lines hidden (view full) ---

834 /*
835 * Get a kernel virtual address for the kstack for this thread.
836 */
837 ks = kmem_alloc_nofault(kernel_map,
838 (KSTACK_PAGES + KSTACK_GUARD_PAGES) * PAGE_SIZE);
839 if (ks == 0)
840 panic("pmap_new_thread: kstack allocation failed");
841 if (KSTACK_GUARD_PAGES != 0) {
660 }
661 data = TD_V | TD_8K | TD_PA(pa) | TD_REF | TD_SW | TD_CP | TD_P | TD_W;
662 if (pmap_cache_enter(m, va) != 0)
663 data |= TD_CV;
664 tp->tte_vpn = TV_VPN(va);
665 tp->tte_data = data;
666 STAILQ_INSERT_TAIL(&m->md.tte_list, tp, tte_link);
667 tp->tte_pmap = kernel_pmap;

--- 164 unchanged lines hidden (view full) ---

832 /*
833 * Get a kernel virtual address for the kstack for this thread.
834 */
835 ks = kmem_alloc_nofault(kernel_map,
836 (KSTACK_PAGES + KSTACK_GUARD_PAGES) * PAGE_SIZE);
837 if (ks == 0)
838 panic("pmap_new_thread: kstack allocation failed");
839 if (KSTACK_GUARD_PAGES != 0) {
842 tlb_page_demap(TLB_DTLB, kernel_pmap, ks);
840 tlb_page_demap(kernel_pmap, ks);
843 ks += KSTACK_GUARD_PAGES * PAGE_SIZE;
844 }
845 td->td_kstack = ks;
846
847 for (i = 0; i < KSTACK_PAGES; i++) {
848 /*
849 * Get a kernel stack page.
850 */

--- 299 unchanged lines hidden (view full) ---

1150 if ((tp->tte_data & TD_WIRED) != 0)
1151 pm->pm_stats.wired_count--;
1152 if ((tp->tte_data & TD_REF) != 0)
1153 vm_page_flag_set(m, PG_REFERENCED);
1154 if ((tp->tte_data & TD_W) != 0 &&
1155 pmap_track_modified(pm, va))
1156 vm_page_dirty(m);
1157 tp->tte_data &= ~TD_V;
841 ks += KSTACK_GUARD_PAGES * PAGE_SIZE;
842 }
843 td->td_kstack = ks;
844
845 for (i = 0; i < KSTACK_PAGES; i++) {
846 /*
847 * Get a kernel stack page.
848 */

--- 299 unchanged lines hidden (view full) ---

1148 if ((tp->tte_data & TD_WIRED) != 0)
1149 pm->pm_stats.wired_count--;
1150 if ((tp->tte_data & TD_REF) != 0)
1151 vm_page_flag_set(m, PG_REFERENCED);
1152 if ((tp->tte_data & TD_W) != 0 &&
1153 pmap_track_modified(pm, va))
1154 vm_page_dirty(m);
1155 tp->tte_data &= ~TD_V;
1158 tlb_page_demap(TLB_DTLB | TLB_ITLB, pm, va);
1156 tlb_page_demap(pm, va);
1159 STAILQ_REMOVE(&m->md.tte_list, tp, tte, tte_link);
1160 pm->pm_stats.resident_count--;
1161 pmap_cache_remove(m, va);
1162 TTE_ZERO(tp);
1163 }
1164 vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1165}
1166

--- 119 unchanged lines hidden (view full) ---

1286 icache_page_inval(pa);
1287 }
1288 tp->tte_data |= TD_EXEC;
1289 }
1290
1291 /*
1292 * Delete the old mapping.
1293 */
1157 STAILQ_REMOVE(&m->md.tte_list, tp, tte, tte_link);
1158 pm->pm_stats.resident_count--;
1159 pmap_cache_remove(m, va);
1160 TTE_ZERO(tp);
1161 }
1162 vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1163}
1164

--- 119 unchanged lines hidden (view full) ---

1284 icache_page_inval(pa);
1285 }
1286 tp->tte_data |= TD_EXEC;
1287 }
1288
1289 /*
1290 * Delete the old mapping.
1291 */
1294 tlb_tte_demap(tp, pm);
1292 tlb_page_demap(pm, TTE_GET_VA(tp));
1295 } else {
1296 /*
1297 * If there is an existing mapping, but its for a different
1298 * phsyical address, delete the old mapping.
1299 */
1300 if (tp != NULL) {
1301 CTR0(KTR_PMAP, "pmap_enter: replace");
1302 PMAP_STATS_INC(pmap_enter_nreplace);
1303 pmap_remove_tte(pm, NULL, tp, va);
1293 } else {
1294 /*
1295 * If there is an existing mapping, but its for a different
1296 * phsyical address, delete the old mapping.
1297 */
1298 if (tp != NULL) {
1299 CTR0(KTR_PMAP, "pmap_enter: replace");
1300 PMAP_STATS_INC(pmap_enter_nreplace);
1301 pmap_remove_tte(pm, NULL, tp, va);
1304 tlb_page_demap(TLB_DTLB | TLB_ITLB, pm, va);
1302 tlb_page_demap(pm, va);
1305 } else {
1306 CTR0(KTR_PMAP, "pmap_enter: new");
1307 PMAP_STATS_INC(pmap_enter_nnew);
1308 }
1309
1310 /*
1311 * Now set up the data and install the new mapping.
1312 */

--- 290 unchanged lines hidden (view full) ---

1603
1604 if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
1605 return;
1606 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
1607 if ((tp->tte_data & TD_PV) == 0)
1608 continue;
1609 if ((tp->tte_data & TD_W) != 0) {
1610 tp->tte_data &= ~TD_W;
1303 } else {
1304 CTR0(KTR_PMAP, "pmap_enter: new");
1305 PMAP_STATS_INC(pmap_enter_nnew);
1306 }
1307
1308 /*
1309 * Now set up the data and install the new mapping.
1310 */

--- 290 unchanged lines hidden (view full) ---

1601
1602 if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
1603 return;
1604 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
1605 if ((tp->tte_data & TD_PV) == 0)
1606 continue;
1607 if ((tp->tte_data & TD_W) != 0) {
1608 tp->tte_data &= ~TD_W;
1611 tlb_tte_demap(tp, TTE_GET_PMAP(tp));
1609 tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
1612 }
1613 }
1614}
1615
1616void
1617pmap_clear_reference(vm_page_t m)
1618{
1619 struct tte *tp;
1620
1621 if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
1622 return;
1623 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
1624 if ((tp->tte_data & TD_PV) == 0)
1625 continue;
1626 if ((tp->tte_data & TD_REF) != 0) {
1627 tp->tte_data &= ~TD_REF;
1610 }
1611 }
1612}
1613
1614void
1615pmap_clear_reference(vm_page_t m)
1616{
1617 struct tte *tp;
1618
1619 if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
1620 return;
1621 STAILQ_FOREACH(tp, &m->md.tte_list, tte_link) {
1622 if ((tp->tte_data & TD_PV) == 0)
1623 continue;
1624 if ((tp->tte_data & TD_REF) != 0) {
1625 tp->tte_data &= ~TD_REF;
1628 tlb_tte_demap(tp, TTE_GET_PMAP(tp));
1626 tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
1629 }
1630 }
1631}
1632
1633void
1634pmap_clear_write(vm_page_t m)
1635{
1636 struct tte *tp;

--- 4 unchanged lines hidden (view full) ---

1641 if ((tp->tte_data & TD_PV) == 0)
1642 continue;
1643 if ((tp->tte_data & (TD_SW | TD_W)) != 0) {
1644 if ((tp->tte_data & TD_W) != 0 &&
1645 pmap_track_modified(TTE_GET_PMAP(tp),
1646 TTE_GET_VA(tp)))
1647 vm_page_dirty(m);
1648 tp->tte_data &= ~(TD_SW | TD_W);
1627 }
1628 }
1629}
1630
1631void
1632pmap_clear_write(vm_page_t m)
1633{
1634 struct tte *tp;

--- 4 unchanged lines hidden (view full) ---

1639 if ((tp->tte_data & TD_PV) == 0)
1640 continue;
1641 if ((tp->tte_data & (TD_SW | TD_W)) != 0) {
1642 if ((tp->tte_data & TD_W) != 0 &&
1643 pmap_track_modified(TTE_GET_PMAP(tp),
1644 TTE_GET_VA(tp)))
1645 vm_page_dirty(m);
1646 tp->tte_data &= ~(TD_SW | TD_W);
1649 tlb_tte_demap(tp, TTE_GET_PMAP(tp));
1647 tlb_page_demap(TTE_GET_PMAP(tp), TTE_GET_VA(tp));
1650 }
1651 }
1652}
1653
1654int
1655pmap_mincore(pmap_t pm, vm_offset_t addr)
1656{
1657 TODO;

--- 46 unchanged lines hidden ---
1648 }
1649 }
1650}
1651
1652int
1653pmap_mincore(pmap_t pm, vm_offset_t addr)
1654{
1655 TODO;

--- 46 unchanged lines hidden ---