summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2002-08-20 19:28:56 +0000
committerJason Wright <jason@cvs.openbsd.org>2002-08-20 19:28:56 +0000
commit6ae45a9cff0ac682ef3db6eb31a5f98880b4f68a (patch)
tree9e19c6602bd0204e62e559389a7f9c2f368e5934 /sys
parent7fa1731ab0a1a515e17598a0437b65158e724955 (diff)
Two fixes from NetBSD (this allows my u60 to boot multiuser):
- Use paddr_t for avail_start and avail_end so we can handle machines with RAM above the 2GB mark. - Do not truncate the kernel pmap physical address to an `int' before sticking it in the context lookup table. Fixes a booting issue on Netra T1125s.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/sparc64/sparc64/pmap.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/sys/arch/sparc64/sparc64/pmap.c b/sys/arch/sparc64/sparc64/pmap.c
index 47d724ef28b..252018fee75 100644
--- a/sys/arch/sparc64/sparc64/pmap.c
+++ b/sys/arch/sparc64/sparc64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.15 2002/07/24 00:48:25 art Exp $ */
+/* $OpenBSD: pmap.c,v 1.16 2002/08/20 19:28:55 jason Exp $ */
/* $NetBSD: pmap.c,v 1.107 2001/08/31 16:47:41 eeh Exp $ */
#undef NO_VCACHE /* Don't forget the locked TLB in dostart */
/*
@@ -303,7 +303,7 @@ int memsize;
static int memh = 0, vmemh = 0; /* Handles to OBP devices */
-int avail_start, avail_end; /* These are used by ps & family */
+paddr_t avail_start, avail_end;
static int ptelookup_va(vaddr_t va); /* sun4u */
#if notyet
@@ -1286,7 +1286,7 @@ remap_data:
pmap_kernel()->pm_segs=(int64_t *)(u_long)newp;
pmap_kernel()->pm_physaddr = newp;
/* mark kernel context as busy */
- ((paddr_t*)ctxbusy)[0] = (int)pmap_kernel()->pm_physaddr;
+ ((paddr_t*)ctxbusy)[0] = pmap_kernel()->pm_physaddr;
}
/*
* finish filling out kernel pmap.
@@ -2515,18 +2515,20 @@ pmap_extract(pm, va, pap)
pa = (pseg_get(pm, va)&TLB_PA_MASK)+(va&PGOFSET);
#ifdef DEBUG
if (pmapdebug & PDB_EXTRACT) {
- pa = ldxa((vaddr_t)&pm->pm_segs[va_to_seg(va)], ASI_PHYS_CACHED);
- printf("pmap_extract: va=%p segs[%ld]=%llx", (void *)(u_long)va, (long)va_to_seg(va), (unsigned long long)pa);
- if (pa) {
- pa = (paddr_t)ldxa((vaddr_t)&((paddr_t*)(u_long)pa)[va_to_dir(va)], ASI_PHYS_CACHED);
- printf(" segs[%ld][%ld]=%lx", (long)va_to_seg(va), (long)va_to_dir(va), (long)pa);
+ paddr_t npa;
+
+ npa = ldxa((vaddr_t)&pm->pm_segs[va_to_seg(va)], ASI_PHYS_CACHED);
+ printf("pmap_extract: va=%p segs[%ld]=%llx", (void *)(u_long)va, (long)va_to_seg(va), (unsigned long long)npa);
+ if (npa) {
+ npa = (paddr_t)ldxa((vaddr_t)&((paddr_t*)(u_long)npa)[va_to_dir(va)], ASI_PHYS_CACHED);
+ printf(" segs[%ld][%ld]=%lx", (long)va_to_seg(va), (long)va_to_dir(va), (long)npa);
}
- if (pa) {
- pa = (paddr_t)ldxa((vaddr_t)&((paddr_t*)(u_long)pa)[va_to_pte(va)], ASI_PHYS_CACHED);
+ if (npa) {
+ npa = (paddr_t)ldxa((vaddr_t)&((paddr_t*)(u_long)npa)[va_to_pte(va)], ASI_PHYS_CACHED);
printf(" segs[%ld][%ld][%ld]=%lx", (long)va_to_seg(va),
- (long)va_to_dir(va), (long)va_to_pte(va), (long)pa);
+ (long)va_to_dir(va), (long)va_to_pte(va), (long)npa);
}
- printf(" pseg_get: %lx\n", (long)pa);
+ printf(" pseg_get: %lx\n", (long)npa);
}
#endif
simple_unlock(&pm->pm_lock);