summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/mips64/mips64/pmap.c43
-rw-r--r--sys/arch/mips64/mips64/vm_machdep.c12
2 files changed, 42 insertions, 13 deletions
diff --git a/sys/arch/mips64/mips64/pmap.c b/sys/arch/mips64/mips64/pmap.c
index d3edd57e995..96ebbbe9358 100644
--- a/sys/arch/mips64/mips64/pmap.c
+++ b/sys/arch/mips64/mips64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.55 2012/03/19 20:42:26 miod Exp $ */
+/* $OpenBSD: pmap.c,v 1.56 2012/03/19 21:56:49 miod Exp $ */
/*
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -140,7 +140,6 @@ static struct pmap kernel_pmap_store
/ sizeof(struct pmap)];
struct pmap *const kernel_pmap_ptr = kernel_pmap_store;
-psize_t mem_size; /* memory size in bytes */
vaddr_t virtual_start; /* VA of first avail page (after kernel bss)*/
vaddr_t virtual_end; /* VA of last avail page (end of kernel AS) */
@@ -437,16 +436,14 @@ pmap_steal_memory(vsize_t size, vaddr_t *vstartp, vaddr_t *vendp)
#ifdef __sgi__
/*
- * If we are running with a 32 bit ARCBios (i.e. kernel
- * linked in CKSEG0), return a CKSEG0 address whenever possible.
+ * Return a CKSEG0 address whenever possible.
*/
- if (IS_XKPHYS((vaddr_t)&pmap_steal_memory) ||
- pa + size >= CKSEG_SIZE)
- va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
- else
+ if (pa + size < CKSEG_SIZE)
va = PHYS_TO_CKSEG0(pa);
-#else
+ else
va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
+#else
+ va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
#endif
bzero((void *)va, size);
@@ -1651,7 +1648,19 @@ vaddr_t
pmap_map_direct(vm_page_t pg)
{
paddr_t pa = VM_PAGE_TO_PHYS(pg);
- vaddr_t va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
+ vaddr_t va;
+
+#ifdef __sgi__
+ /*
+ * Return a CKSEG0 address whenever possible.
+ */
+ if (pa < CKSEG_SIZE)
+ va = PHYS_TO_CKSEG0(pa);
+ else
+ va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
+#else
+ va = PHYS_TO_XKPHYS(pa, CCA_CACHED);
+#endif
return va;
}
@@ -1659,9 +1668,19 @@ pmap_map_direct(vm_page_t pg)
vm_page_t
pmap_unmap_direct(vaddr_t va)
{
- paddr_t pa = XKPHYS_TO_PHYS(va);
- vm_page_t pg = PHYS_TO_VM_PAGE(pa);
+ paddr_t pa;
+ vm_page_t pg;
+#ifdef __sgi__
+ if (va >= CKSEG0_BASE)
+ pa = CKSEG0_TO_PHYS(va);
+ else
+ pa = XKPHYS_TO_PHYS(va);
+#else
+ pa = XKPHYS_TO_PHYS(va);
+#endif
+
+ pg = PHYS_TO_VM_PAGE(pa);
if (CpuCacheAliasMask)
Mips_HitInvalidateDCache(curcpu(), va, pa, PAGE_SIZE);
diff --git a/sys/arch/mips64/mips64/vm_machdep.c b/sys/arch/mips64/mips64/vm_machdep.c
index 7ed194dea94..ff823b6aea9 100644
--- a/sys/arch/mips64/mips64/vm_machdep.c
+++ b/sys/arch/mips64/mips64/vm_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vm_machdep.c,v 1.24 2010/11/24 21:16:28 miod Exp $ */
+/* $OpenBSD: vm_machdep.c,v 1.25 2012/03/19 21:56:49 miod Exp $ */
/*
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1992, 1993
@@ -76,8 +76,18 @@ cpu_fork(p1, p2, stack, stacksize, func, arg)
/* replace p_addr with a direct translation address */
p2->p_md.md_uarea = (vaddr_t)p2->p_addr;
pmap_extract(pmap_kernel(), p2->p_md.md_uarea, &pa);
+#ifdef __sgi__
+ /*
+ * Return a CKSEG0 address whenever possible.
+ */
+ if (pa < CKSEG_SIZE)
+ p2->p_addr = (void *)PHYS_TO_CKSEG0(pa);
+ else
+ p2->p_addr = (void *)PHYS_TO_XKPHYS(pa, CCA_CACHED);
+#else
p2->p_addr = (void *)PHYS_TO_XKPHYS(pa, CCA_CACHED);
#endif
+#endif
pcb = &p2->p_addr->u_pcb;
/*