Deleted Added
full compact
pmap.c (113238) pmap.c (113453)
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 113238 2003-04-08 06:35:09Z jake $
42 * $FreeBSD: head/sys/sparc64/sparc64/pmap.c 113453 2003-04-13 21:54:58Z 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

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

553 continue;
554 pa = phys_avail[i];
555 phys_avail[i] += size;
556 return (pa);
557 }
558 panic("pmap_bootstrap_alloc");
559}
560
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

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

553 continue;
554 pa = phys_avail[i];
555 phys_avail[i] += size;
556 return (pa);
557 }
558 panic("pmap_bootstrap_alloc");
559}
560
561void
562pmap_context_rollover(void)
563{
564 u_long data;
565 u_long tag;
566 int i;
567
568 mtx_assert(&sched_lock, MA_OWNED);
569 CTR0(KTR_PMAP, "pmap_context_rollover");
570 for (i = 0; i < tlb_dtlb_entries; i++) {
571 /* XXX - cheetah */
572 data = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG);
573 tag = ldxa(TLB_DAR_SLOT(i), ASI_DTLB_TAG_READ_REG);
574 if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
575 TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
576 stxa_sync(TLB_DAR_SLOT(i), ASI_DTLB_DATA_ACCESS_REG, 0);
577 data = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG);
578 tag = ldxa(TLB_DAR_SLOT(i), ASI_ITLB_TAG_READ_REG);
579 if ((data & TD_V) != 0 && (data & TD_L) == 0 &&
580 TLB_TAR_CTX(tag) != TLB_CTX_KERNEL)
581 stxa_sync(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG, 0);
582 }
583 PCPU_SET(tlb_ctx, PCPU_GET(tlb_ctx_min));
584}
585
586static __inline u_int
587pmap_context_alloc(void)
588{
589 u_int context;
590
591 mtx_assert(&sched_lock, MA_OWNED);
592 context = PCPU_GET(tlb_ctx);
593 if (context + 1 == PCPU_GET(tlb_ctx_max))
594 pmap_context_rollover();
595 else
596 PCPU_SET(tlb_ctx, context + 1);
597 return (context);
598}
599
600/*
601 * Initialize the pmap module.
602 */
603void
604pmap_init(vm_paddr_t phys_start, vm_paddr_t phys_end)
605{
606 vm_offset_t addr;
607 vm_size_t size;

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

1968/*
1969 * Activate a user pmap. The pmap must be activated before its address space
1970 * can be accessed in any way.
1971 */
1972void
1973pmap_activate(struct thread *td)
1974{
1975 struct vmspace *vm;
561/*
562 * Initialize the pmap module.
563 */
564void
565pmap_init(vm_paddr_t phys_start, vm_paddr_t phys_end)
566{
567 vm_offset_t addr;
568 vm_size_t size;

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

1929/*
1930 * Activate a user pmap. The pmap must be activated before its address space
1931 * can be accessed in any way.
1932 */
1933void
1934pmap_activate(struct thread *td)
1935{
1936 struct vmspace *vm;
1976 vm_offset_t tsb;
1977 u_long context;
1978 pmap_t pm;
1937 struct pmap *pm;
1938 int context;
1979
1980 vm = td->td_proc->p_vmspace;
1939
1940 vm = td->td_proc->p_vmspace;
1981 pm = &vm->vm_pmap;
1982 tsb = (vm_offset_t)pm->pm_tsb;
1941 pm = vmspace_pmap(vm);
1983
1942
1984 KASSERT(pm->pm_active == 0, ("pmap_activate: pmap already active?"));
1985 KASSERT(pm->pm_context[PCPU_GET(cpuid)] != 0,
1986 ("pmap_activate: activating nucleus context?"));
1987
1988 mtx_lock_spin(&sched_lock);
1943 mtx_lock_spin(&sched_lock);
1989 stxa(AA_DMMU_TSB, ASI_DMMU, tsb);
1990 stxa(AA_IMMU_TSB, ASI_IMMU, tsb);
1991 membar(Sync);
1992 context = pmap_context_alloc();
1944
1945 context = PCPU_GET(tlb_ctx);
1946 if (context == PCPU_GET(tlb_ctx_max)) {
1947 tlb_flush_user();
1948 context = PCPU_GET(tlb_ctx_min);
1949 }
1950 PCPU_SET(tlb_ctx, context + 1);
1951
1993 pm->pm_context[PCPU_GET(cpuid)] = context;
1994 pm->pm_active |= PCPU_GET(cpumask);
1995 PCPU_SET(vmspace, vm);
1952 pm->pm_context[PCPU_GET(cpuid)] = context;
1953 pm->pm_active |= PCPU_GET(cpumask);
1954 PCPU_SET(vmspace, vm);
1955
1956 stxa(AA_DMMU_TSB, ASI_DMMU, pm->pm_tsb);
1957 stxa(AA_IMMU_TSB, ASI_IMMU, pm->pm_tsb);
1996 stxa(AA_DMMU_PCXR, ASI_DMMU, context);
1997 membar(Sync);
1958 stxa(AA_DMMU_PCXR, ASI_DMMU, context);
1959 membar(Sync);
1960
1998 mtx_unlock_spin(&sched_lock);
1999}
2000
2001vm_offset_t
2002pmap_addr_hint(vm_object_t object, vm_offset_t va, vm_size_t size)
2003{
2004
2005 return (va);
2006}
1961 mtx_unlock_spin(&sched_lock);
1962}
1963
1964vm_offset_t
1965pmap_addr_hint(vm_object_t object, vm_offset_t va, vm_size_t size)
1966{
1967
1968 return (va);
1969}