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} |