Module Name: src
Committed By: matt
Date: Fri Aug 21 17:37:30 UTC 2009
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]: pmap.c
Log Message:
Add CTASSERTS to make sure MIPS_KSEG* are correctly defined.
Use PRIx{PADDR,VADDR}.
Deal with XKPHYS in {,un}map_poolpage and kvtophys.
To generate a diff of this commit:
cvs rdiff -u -r1.179 -r1.179.16.1 src/sys/arch/mips/mips/pmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/mips/pmap.c
diff -u src/sys/arch/mips/mips/pmap.c:1.179 src/sys/arch/mips/mips/pmap.c:1.179.16.1
--- src/sys/arch/mips/mips/pmap.c:1.179 Mon Apr 28 20:23:28 2008
+++ src/sys/arch/mips/mips/pmap.c Fri Aug 21 17:37:30 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.179 2008/04/28 20:23:28 martin Exp $ */
+/* $NetBSD: pmap.c,v 1.179.16.1 2009/08/21 17:37:30 matt Exp $ */
/*-
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.179 2008/04/28 20:23:28 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.179.16.1 2009/08/21 17:37:30 matt Exp $");
/*
* Manages physical address maps.
@@ -135,6 +135,19 @@
#include <mips/locore.h>
#include <mips/pte.h>
+CTASSERT(MIPS_KSEG0_START < 0);
+CTASSERT((intptr_t)MIPS_PHYS_TO_KSEG0(0x1000) < 0);
+CTASSERT(MIPS_KSEG1_START < 0);
+CTASSERT((intptr_t)MIPS_PHYS_TO_KSEG1(0x1000) < 0);
+CTASSERT(MIPS_KSEG2_START < 0);
+CTASSERT(MIPS_MAX_MEM_ADDR < 0);
+CTASSERT(MIPS_RESERVED_ADDR < 0);
+CTASSERT((uint32_t)MIPS_KSEG0_START == 0x80000000);
+CTASSERT((uint32_t)MIPS_KSEG1_START == 0xa0000000);
+CTASSERT((uint32_t)MIPS_KSEG2_START == 0xc0000000);
+CTASSERT((uint32_t)MIPS_MAX_MEM_ADDR == 0xbe000000);
+CTASSERT((uint32_t)MIPS_RESERVED_ADDR == 0xbfc80000);
+
#ifdef DEBUG
struct {
int kernel; /* entering kernel mapping */
@@ -189,7 +202,7 @@
struct segtab *free_segtab; /* free list kept locally */
pt_entry_t *Sysmap; /* kernel pte table */
-unsigned Sysmapsize; /* number of pte's in Sysmap */
+unsigned int Sysmapsize; /* number of pte's in Sysmap */
unsigned pmap_max_asid; /* max ASID supported by the system */
unsigned pmap_next_asid; /* next free ASID to use */
@@ -461,7 +474,16 @@
}
}
- va = MIPS_PHYS_TO_KSEG0(pa);
+ if (pa <= MIPS_PHYS_MASK)
+ va = MIPS_PHYS_TO_KSEG0(pa);
+ else
+#ifdef _LP64
+ va = MIPS_PHYS_TO_XKPHYS(
+ MIPS3_PG_TO_CCA(mips3_pg_cached), pa);
+#else
+ panic("pmap_steal_memory: "
+ "pa can not be mapped into K0");
+#endif
memset((void *)va, 0, size);
return va;
}
@@ -1504,12 +1526,18 @@
printf("pmap_extract(%p, 0x%lx) -> ", pmap, va);
#endif
if (pmap == pmap_kernel()) {
- if (va >= MIPS_KSEG0_START && va < MIPS_KSEG1_START) {
+ if (va >= (uintptr_t)MIPS_KSEG0_START && va < (uintptr_t)MIPS_KSEG1_START) {
pa = MIPS_KSEG0_TO_PHYS(va);
goto done;
}
+#ifdef _LP64
+ if (va >= (uintptr_t)MIPS_XKPHYS_START && va < (uintptr_t)MIPS_XKSEG_START) {
+ pa = MIPS_XKPHYS_TO_PHYS(va);
+ goto done;
+ }
+#endif
#ifdef DIAGNOSTIC
- else if (va >= MIPS_KSEG1_START && va < MIPS_KSEG2_START)
+ else if (va >= (uintptr_t)MIPS_KSEG1_START && va < (uintptr_t)MIPS_KSEG2_START)
panic("pmap_extract: kseg1 address 0x%lx", va);
#endif
else
@@ -2188,7 +2216,15 @@
pv_entry_t pv;
#endif
- va = MIPS_PHYS_TO_KSEG0(pa);
+ if (pa <= MIPS_PHYS_MASK)
+ va = MIPS_PHYS_TO_KSEG0(pa);
+ else
+#ifdef _LP64
+ va = MIPS_PHYS_TO_XKPHYS(MIPS3_PG_TO_CCA(mips3_pg_cached), pa);
+#else
+ panic("mips_pmap_map_poolpage: "
+ "pa #%"PRIxPADDR" can not be mapped into KSEG0", pa);
+#endif
#if defined(MIPS3_PLUS)
if (mips_cache_virtual_alias) {
pg = PHYS_TO_VM_PAGE(pa);
@@ -2206,7 +2242,12 @@
{
paddr_t pa;
- pa = MIPS_KSEG0_TO_PHYS(va);
+#ifdef _LP64
+ if (MIPS_XKPHYS_P(va))
+ pa = MIPS_XKPHYS_TO_PHYS(va);
+ else
+#endif
+ pa = MIPS_KSEG0_TO_PHYS(va);
#if defined(MIPS3_PLUS)
if (mips_cache_virtual_alias) {
mips_dcache_inv_range(va, PAGE_SIZE);