CVS commit: [matt-nb5-mips64] src/lib/libkvm
Module Name:src Committed By: matt Date: Tue Dec 27 16:26:25 UTC 2011 Modified Files: src/lib/libkvm [matt-nb5-mips64]: kvm_mips.c Log Message: Deal with non fixed page size on MIPS. To generate a diff of this commit: cvs rdiff -u -r1.18.16.2 -r1.18.16.3 src/lib/libkvm/kvm_mips.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/lib/libkvm/kvm_mips.c diff -u src/lib/libkvm/kvm_mips.c:1.18.16.2 src/lib/libkvm/kvm_mips.c:1.18.16.3 --- src/lib/libkvm/kvm_mips.c:1.18.16.2 Tue Dec 27 06:58:58 2011 +++ src/lib/libkvm/kvm_mips.c Tue Dec 27 16:26:25 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kvm_mips.c,v 1.18.16.2 2011/12/27 06:58:58 matt Exp $ */ +/* $NetBSD: kvm_mips.c,v 1.18.16.3 2011/12/27 16:26:25 matt Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -34,7 +34,7 @@ #include #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: kvm_mips.c,v 1.18.16.2 2011/12/27 06:58:58 matt Exp $"); +__RCSID("$NetBSD: kvm_mips.c,v 1.18.16.3 2011/12/27 16:26:25 matt Exp $"); #endif /* LIBC_SCCS and not lint */ /* @@ -46,6 +46,7 @@ __RCSID("$NetBSD: kvm_mips.c,v 1.18.16.2 #include #include #include +#include #include #include #include @@ -87,13 +88,14 @@ _kvm_initvtop(kd) * Translate a kernel virtual address to a physical address. */ int -_kvm_kvatop(kd, va, pa) +_kvm_kvatop(kd, uva, pa) kvm_t *kd; - u_long va; + u_long uva; u_long *pa; { cpu_kcore_hdr_t *cpu_kh; - u_int page_off; + u_long page_off; + long va = uva; u_int pte; u_long pte_pa; u_long pfn; @@ -263,6 +265,7 @@ int _kvm_mdopen(kd) kvm_t *kd; { +#define PAGE_SHIFT ilog2(kd->nbpg) /* for _LP64 VM_MAXUSER_ADDRESS */ kd->usrstack = USRSTACK; kd->min_uva = VM_MIN_ADDRESS;
CVS commit: [matt-nb5-mips64] src/lib/libkvm
Module Name:src Committed By: matt Date: Tue Dec 27 06:58:59 UTC 2011 Modified Files: src/lib/libkvm [matt-nb5-mips64]: kvm_mips.c Log Message: Don't use NBPG/PGSHIFT/PGOFFST any more. Use nbpg from kvm_t and initialize that from the cpu_kcore_hdr_t. To generate a diff of this commit: cvs rdiff -u -r1.18.16.1 -r1.18.16.2 src/lib/libkvm/kvm_mips.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/lib/libkvm/kvm_mips.c diff -u src/lib/libkvm/kvm_mips.c:1.18.16.1 src/lib/libkvm/kvm_mips.c:1.18.16.2 --- src/lib/libkvm/kvm_mips.c:1.18.16.1 Thu Jan 28 17:16:42 2010 +++ src/lib/libkvm/kvm_mips.c Tue Dec 27 06:58:58 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kvm_mips.c,v 1.18.16.1 2010/01/28 17:16:42 matt Exp $ */ +/* $NetBSD: kvm_mips.c,v 1.18.16.2 2011/12/27 06:58:58 matt Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -34,7 +34,7 @@ #include #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: kvm_mips.c,v 1.18.16.1 2010/01/28 17:16:42 matt Exp $"); +__RCSID("$NetBSD: kvm_mips.c,v 1.18.16.2 2011/12/27 06:58:58 matt Exp $"); #endif /* LIBC_SCCS and not lint */ /* @@ -76,6 +76,9 @@ int _kvm_initvtop(kd) kvm_t *kd; { + /* fetch NBPG from kernel */ + cpu_kcore_hdr_t * const cpu_kh = kd->cpu_data; + kd->nbpg = cpu_kh->pg_size; return (0); } @@ -90,17 +93,18 @@ _kvm_kvatop(kd, va, pa) u_long *pa; { cpu_kcore_hdr_t *cpu_kh; - int page_off; + u_int page_off; u_int pte; u_long pte_pa; + u_long pfn; if (ISALIVE(kd)) { _kvm_err(kd, 0, "vatop called in live kernel!"); - return((off_t)0); + return (0); } cpu_kh = kd->cpu_data; - page_off = va & PGOFSET; + page_off = va & (kd->nbpg - 1); #ifdef _LP64 if (MIPS_XKPHYS_P(va)) { @@ -108,7 +112,7 @@ _kvm_kvatop(kd, va, pa) * Direct-mapped cached address: just convert it. */ *pa = MIPS_XKPHYS_TO_PHYS(va); - return (NBPG - page_off); + return (kd->nbpg - page_off); } if (va < MIPS_XKPHYS_START) { @@ -133,7 +137,7 @@ _kvm_kvatop(kd, va, pa) * Direct-mapped cached address: just convert it. */ *pa = MIPS_KSEG0_TO_PHYS(va); - return (NBPG - page_off); + return (kd->nbpg - page_off); } if (MIPS_KSEG1_P(va)) { @@ -141,7 +145,7 @@ _kvm_kvatop(kd, va, pa) * Direct-mapped uncached address: just convert it. */ *pa = MIPS_KSEG1_TO_PHYS(va); - return (NBPG - page_off); + return (kd->nbpg - page_off); } #ifdef _LP64 @@ -165,12 +169,24 @@ _kvm_kvatop(kd, va, pa) * for the address. */ #ifdef _LP64 - if (va >= (MIPS_XKSEG_START + (cpu_kh->sysmapsize * NBPG))) { + if (va >= (MIPS_XKSEG_START + (cpu_kh->sysmapsize * kd->nbpg))) { _kvm_err(kd, 0, "invalid XKSEG address"); goto lose; } #else - if (va >= (MIPS_KSEG2_START + (cpu_kh->sysmapsize * NBPG))) { + /* + * If KSEGZ isn't in use, size will be 0 so this comparision will fail. + */ + if (va - cpu_kh->ksegx_va < cpu_kh->ksegx_size) { + pfn = cpu_kh->ksegx_pfn; + if (pfn > ~0UL / kd->nbpg) { + _kvm_err(kd, 0, "unaccessible physical address"); + goto lose; + } + *pa = pfn * kd->nbpg + va - cpu_kh->ksegx_va; + return (kd->nbpg - page_off); + } + if (va >= (MIPS_KSEG2_START + (cpu_kh->sysmapsize * kd->nbpg))) { _kvm_err(kd, 0, "invalid KSEG2 address"); goto lose; } @@ -180,7 +196,7 @@ _kvm_kvatop(kd, va, pa) * Step 2: Locate and read the PTE. */ pte_pa = cpu_kh->sysmappa + - (((va - MIPS_KSEG2_START) >> PGSHIFT) * sizeof(u_int)); + (((va - MIPS_KSEG2_START) / kd->nbpg) * sizeof(u_int)); if (_kvm_pread(kd, kd->pmfd, &pte, sizeof(pte), _kvm_pa2off(kd, pte_pa)) != sizeof(pte)) { _kvm_syserr(kd, 0, "could not read PTE"); @@ -194,9 +210,15 @@ _kvm_kvatop(kd, va, pa) _kvm_err(kd, 0, "invalid translation (invalid PTE)"); goto lose; } - *pa = (((pte & cpu_kh->pg_frame) >> cpu_kh->pg_shift) << PGSHIFT) + - page_off; - return (NBPG - page_off); + pfn = (pte & cpu_kh->pg_frame) >> cpu_kh->pg_shift; +#ifndef _LP64 + if (pfn > ~0UL / kd->nbpg) { + _kvm_err(kd, 0, "unaccessible physical address"); + goto lose; + } +#endif + *pa = pfn * kd->nbpg + page_off; + return (kd->nbpg - page_off); lose: *pa = -1;
CVS commit: [matt-nb5-mips64] src/lib/libkvm
Module Name:src Committed By: matt Date: Thu Jan 28 17:16:42 UTC 2010 Modified Files: src/lib/libkvm [matt-nb5-mips64]: kvm_mips.c Log Message: Teach KVM about where the kernel is when _LP64 is defined. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.18.16.1 src/lib/libkvm/kvm_mips.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/lib/libkvm/kvm_mips.c diff -u src/lib/libkvm/kvm_mips.c:1.18 src/lib/libkvm/kvm_mips.c:1.18.16.1 --- src/lib/libkvm/kvm_mips.c:1.18 Tue Jan 15 13:57:42 2008 +++ src/lib/libkvm/kvm_mips.c Thu Jan 28 17:16:42 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kvm_mips.c,v 1.18 2008/01/15 13:57:42 ad Exp $ */ +/* $NetBSD: kvm_mips.c,v 1.18.16.1 2010/01/28 17:16:42 matt Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -34,7 +34,7 @@ #include #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: kvm_mips.c,v 1.18 2008/01/15 13:57:42 ad Exp $"); +__RCSID("$NetBSD: kvm_mips.c,v 1.18.16.1 2010/01/28 17:16:42 matt Exp $"); #endif /* LIBC_SCCS and not lint */ /* @@ -102,6 +102,23 @@ cpu_kh = kd->cpu_data; page_off = va & PGOFSET; +#ifdef _LP64 + if (MIPS_XKPHYS_P(va)) { + /* + * Direct-mapped cached address: just convert it. + */ + *pa = MIPS_XKPHYS_TO_PHYS(va); + return (NBPG - page_off); + } + + if (va < MIPS_XKPHYS_START) { + /* + * XUSEG (user virtual address space) - invalid. + */ + _kvm_err(kd, 0, "invalid kernel virtual address"); + goto lose; + } +#else if (va < MIPS_KSEG0_START) { /* * KUSEG (user virtual address space) - invalid. @@ -109,8 +126,9 @@ _kvm_err(kd, 0, "invalid kernel virtual address"); goto lose; } +#endif - if (va >= MIPS_KSEG0_START && va < MIPS_KSEG1_START) { + if (MIPS_KSEG0_P(va)) { /* * Direct-mapped cached address: just convert it. */ @@ -118,7 +136,7 @@ return (NBPG - page_off); } - if (va >= MIPS_KSEG1_START && va < MIPS_KSEG2_START) { + if (MIPS_KSEG1_P(va)) { /* * Direct-mapped uncached address: just convert it. */ @@ -126,6 +144,16 @@ return (NBPG - page_off); } +#ifdef _LP64 + if (va >= MIPS_KSEG2_START) { + /* + * KUSEG (user virtual address space) - invalid. + */ + _kvm_err(kd, 0, "invalid kernel virtual address"); + goto lose; + } +#endif + /* * We now know that we're a KSEG2 (kernel virtually mapped) * address. Translate the address using the pmap's kernel @@ -136,10 +164,17 @@ * Step 1: Make sure the kernel page table has a translation * for the address. */ +#ifdef _LP64 + if (va >= (MIPS_XKSEG_START + (cpu_kh->sysmapsize * NBPG))) { + _kvm_err(kd, 0, "invalid XKSEG address"); + goto lose; + } +#else if (va >= (MIPS_KSEG2_START + (cpu_kh->sysmapsize * NBPG))) { _kvm_err(kd, 0, "invalid KSEG2 address"); goto lose; } +#endif /* * Step 2: Locate and read the PTE.