Module Name: src
Committed By: rmind
Date: Sun Apr 25 15:27:38 UTC 2010
Modified Files:
src/sys/arch/acorn26/acorn26 [rmind-uvmplock]: machdep.c
src/sys/arch/alpha/alpha [rmind-uvmplock]: machdep.c
src/sys/arch/amd64/amd64 [rmind-uvmplock]: machdep.c
src/sys/arch/hp300/hp300 [rmind-uvmplock]: machdep.c
src/sys/arch/hp700/hp700 [rmind-uvmplock]: machdep.c
src/sys/arch/hp700/include [rmind-uvmplock]: types.h
src/sys/arch/luna68k/luna68k [rmind-uvmplock]: machdep.c
src/sys/arch/mips/mips [rmind-uvmplock]: mips_machdep.c
src/sys/arch/mvme68k/mvme68k [rmind-uvmplock]: machdep.c
src/sys/arch/news68k/news68k [rmind-uvmplock]: machdep.c
src/sys/arch/next68k/next68k [rmind-uvmplock]: machdep.c
src/sys/arch/powerpc/powerpc [rmind-uvmplock]: powerpc_machdep.c
src/sys/arch/sh3/sh3 [rmind-uvmplock]: vm_machdep.c
src/sys/arch/sparc/sparc [rmind-uvmplock]: machdep.c
src/sys/arch/sparc64/sparc64 [rmind-uvmplock]: machdep.c
src/sys/arch/vax/include [rmind-uvmplock]: types.h
src/sys/arch/vax/vax [rmind-uvmplock]: machdep.c
src/sys/arch/x68k/x68k [rmind-uvmplock]: machdep.c
src/sys/dev [rmind-uvmplock]: mm.c mm.h
src/sys/uvm [rmind-uvmplock]: uvm_glue.c
Log Message:
- Invent mm_md_getva() and mm_md_relva() routines, provided by MD and
indicated with __HAVE_MM_MD_PREFER_VA. It will be used to deal with
cache aliasing issues and thus fix little MIPS, ARM and friends.
- Convert dev_mem_readwrite() to use unmanaged mappings. Fix a missed
offset addition in a case of direct map. Sprinkle various comments in
the memory device driver.
- Add missing direct map handling on hp700 and vax. Make checks across
m68k ports more consistent, reduce the diffs. Fix kernacc check miss
on news68k. Minor off-by-one fix for alpha. Add MEMC_PHYS_BASE for
mmap() case check on acorn26. Misc clean-up.
To generate a diff of this commit:
cvs rdiff -u -r1.33.2.1 -r1.33.2.2 src/sys/arch/acorn26/acorn26/machdep.c
cvs rdiff -u -r1.326.2.1 -r1.326.2.2 src/sys/arch/alpha/alpha/machdep.c
cvs rdiff -u -r1.143.2.1 -r1.143.2.2 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.211.2.1 -r1.211.2.2 src/sys/arch/hp300/hp300/machdep.c
cvs rdiff -u -r1.79.2.1 -r1.79.2.2 src/sys/arch/hp700/hp700/machdep.c
cvs rdiff -u -r1.10 -r1.10.32.1 src/sys/arch/hp700/include/types.h
cvs rdiff -u -r1.74.2.1 -r1.74.2.2 src/sys/arch/luna68k/luna68k/machdep.c
cvs rdiff -u -r1.225.4.1 -r1.225.4.2 src/sys/arch/mips/mips/mips_machdep.c
cvs rdiff -u -r1.142.2.1 -r1.142.2.2 src/sys/arch/mvme68k/mvme68k/machdep.c
cvs rdiff -u -r1.85.2.1 -r1.85.2.2 src/sys/arch/news68k/news68k/machdep.c
cvs rdiff -u -r1.98.2.1 -r1.98.2.2 src/sys/arch/next68k/next68k/machdep.c
cvs rdiff -u -r1.42.4.1 -r1.42.4.2 \
src/sys/arch/powerpc/powerpc/powerpc_machdep.c
cvs rdiff -u -r1.66.4.1 -r1.66.4.2 src/sys/arch/sh3/sh3/vm_machdep.c
cvs rdiff -u -r1.302.2.1 -r1.302.2.2 src/sys/arch/sparc/sparc/machdep.c
cvs rdiff -u -r1.252.2.1 -r1.252.2.2 src/sys/arch/sparc64/sparc64/machdep.c
cvs rdiff -u -r1.40.4.1 -r1.40.4.2 src/sys/arch/vax/include/types.h
cvs rdiff -u -r1.179.2.1 -r1.179.2.2 src/sys/arch/vax/vax/machdep.c
cvs rdiff -u -r1.165.2.1 -r1.165.2.2 src/sys/arch/x68k/x68k/machdep.c
cvs rdiff -u -r1.13.16.1 -r1.13.16.2 src/sys/dev/mm.c
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/dev/mm.h
cvs rdiff -u -r1.144.2.1 -r1.144.2.2 src/sys/uvm/uvm_glue.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/acorn26/acorn26/machdep.c
diff -u src/sys/arch/acorn26/acorn26/machdep.c:1.33.2.1 src/sys/arch/acorn26/acorn26/machdep.c:1.33.2.2
--- src/sys/arch/acorn26/acorn26/machdep.c:1.33.2.1 Thu Mar 18 04:36:46 2010
+++ src/sys/arch/acorn26/acorn26/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.33.2.1 2010/03/18 04:36:46 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.33.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*-
* Copyright (c) 1998 Ben Harris
@@ -32,7 +32,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.33.2.1 2010/03/18 04:36:46 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.33.2.2 2010/04/25 15:27:36 rmind Exp $");
#include <sys/buf.h>
#include <sys/kernel.h>
@@ -217,18 +217,14 @@
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- return (atop(pa) >= physmem) ? EFAULT : 0;
+ return (pa > MEMC_PHYS_BASE + ptoa(physmem)) ? EFAULT : 0;
}
int
mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
{
+ const vaddr_t v = ptr;
- if (ptr >= MEMC_PHYS_BASE &&
- (char *)ptr < (char *)MEMC_PHYS_BASE + ptoa(physmem)) {
- *handled = true;
- } else {
- *handled = false;
- }
+ *handled = (v >= MEMC_PHYS_BASE && v < MEMC_PHYS_BASE + ptoa(physmem));
return 0;
}
Index: src/sys/arch/alpha/alpha/machdep.c
diff -u src/sys/arch/alpha/alpha/machdep.c:1.326.2.1 src/sys/arch/alpha/alpha/machdep.c:1.326.2.2
--- src/sys/arch/alpha/alpha/machdep.c:1.326.2.1 Thu Mar 18 04:36:46 2010
+++ src/sys/arch/alpha/alpha/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.326.2.1 2010/03/18 04:36:46 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.326.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.326.2.1 2010/03/18 04:36:46 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.326.2.2 2010/04/25 15:27:36 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1822,10 +1822,8 @@
continue;
if ((prot & mem_clusters[i].size & PAGE_MASK) == prot)
return 0;
- return EFAULT;
}
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ return EFAULT;
}
bool
@@ -1833,7 +1831,7 @@
{
vaddr_t va = (vaddr_t)addr;
- if (va >= ALPHA_K0SEG_BASE && va < ALPHA_K0SEG_END) {
+ if (va >= ALPHA_K0SEG_BASE && va <= ALPHA_K0SEG_END) {
*paddr = ALPHA_K0SEG_TO_PHYS(va);
return true;
}
Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.143.2.1 src/sys/arch/amd64/amd64/machdep.c:1.143.2.2
--- src/sys/arch/amd64/amd64/machdep.c:1.143.2.1 Thu Mar 18 04:36:47 2010
+++ src/sys/arch/amd64/amd64/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.143.2.1 2010/03/18 04:36:47 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.143.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008
@@ -107,7 +107,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.143.2.1 2010/03/18 04:36:47 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.143.2.2 2010/04/25 15:27:36 rmind Exp $");
/* #define XENDEBUG_LOW */
@@ -1809,10 +1809,13 @@
*handled = true;
if (v < (vaddr_t)&__data_start && (prot & VM_PROT_WRITE))
return EFAULT;
+
} else if (v >= module_start && v < module_end) {
*handled = true;
if (!uvm_map_checkprot(module_map, v, v + 1, prot))
return EFAULT;
+ } else {
+ *handled = false;
}
return 0;
}
Index: src/sys/arch/hp300/hp300/machdep.c
diff -u src/sys/arch/hp300/hp300/machdep.c:1.211.2.1 src/sys/arch/hp300/hp300/machdep.c:1.211.2.2
--- src/sys/arch/hp300/hp300/machdep.c:1.211.2.1 Thu Mar 18 04:36:48 2010
+++ src/sys/arch/hp300/hp300/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.211.2.1 2010/03/18 04:36:48 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.211.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.211.2.1 2010/03/18 04:36:48 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.211.2.2 2010/04/25 15:27:36 rmind Exp $");
#include "opt_ddb.h"
#include "opt_compat_netbsd.h"
@@ -1294,10 +1294,7 @@
* Do not allow reading intio or dio device space. This could lead
* to corruption of device registers.
*/
- if (ISIIOVA(ptr) || ((uint8_t *)ptr >= extiobase &&
- (uint8_t *)ptr < extiobase + (EIOMAPSIZE * PAGE_SIZE))) {
- *handled = true;
- return EFAULT;
- }
- return 0;
+ *handled = false;
+ return (ISIIOVA(ptr) || (ptr >= extiobase &&
+ ptr < (extiobase + (EIOMAPSIZE * PAGE_SIZE)))) ? EFAULT : 0;
}
Index: src/sys/arch/hp700/hp700/machdep.c
diff -u src/sys/arch/hp700/hp700/machdep.c:1.79.2.1 src/sys/arch/hp700/hp700/machdep.c:1.79.2.2
--- src/sys/arch/hp700/hp700/machdep.c:1.79.2.1 Thu Mar 18 04:36:49 2010
+++ src/sys/arch/hp700/hp700/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.79.2.1 2010/03/18 04:36:49 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.79.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.79.2.1 2010/03/18 04:36:49 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.79.2.2 2010/04/25 15:27:36 rmind Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@@ -1970,9 +1970,25 @@
}
#endif /* MODULAR */
+bool
+mm_md_direct_mapped_phys(paddr_t paddr, vaddr_t *vaddr)
+{
+
+ *vaddr = ptoa(physmem) - paddr;
+ return true;
+}
+
int
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- return (btoc(pa) > totalphysmem) ? EFAULT : 0;
+ return (atop(v) > physmem) ? EFAULT : 0;
+}
+
+int
+mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
+{
+
+ *handled = false;
+ return mm_md_physacc(ptr, prot);
}
Index: src/sys/arch/hp700/include/types.h
diff -u src/sys/arch/hp700/include/types.h:1.10 src/sys/arch/hp700/include/types.h:1.10.32.1
--- src/sys/arch/hp700/include/types.h:1.10 Sun Jan 20 18:09:06 2008
+++ src/sys/arch/hp700/include/types.h Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.10 2008/01/20 18:09:06 joerg Exp $ */
+/* $NetBSD: types.h,v 1.10.32.1 2010/04/25 15:27:36 rmind Exp $ */
#ifndef _HP700_TYPES_H_
#define _HP700_TYPES_H_
@@ -7,4 +7,7 @@
#define __HAVE_DEVICE_REGISTER
+#define __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+#define __HAVE_MM_MD_KERNACC
+
#endif /* _HP700_TYPES_H_ */
Index: src/sys/arch/luna68k/luna68k/machdep.c
diff -u src/sys/arch/luna68k/luna68k/machdep.c:1.74.2.1 src/sys/arch/luna68k/luna68k/machdep.c:1.74.2.2
--- src/sys/arch/luna68k/luna68k/machdep.c:1.74.2.1 Thu Mar 18 04:36:49 2010
+++ src/sys/arch/luna68k/luna68k/machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.74.2.1 2010/03/18 04:36:49 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.74.2.2 2010/04/25 15:27:36 rmind Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.74.2.1 2010/03/18 04:36:49 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.74.2.2 2010/04/25 15:27:36 rmind Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -107,6 +107,8 @@
*/
int safepri = PSL_LOWIPL;
+extern u_int lowram;
+
void luna68k_init(void);
void identifycpu(void);
void dumpsys(void);
@@ -864,11 +866,6 @@
int
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- extern u_int lowram;
-
- if (pa >= lowram && pa < 0xfffffffc)
- return 0;
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ return (pa < lowram || pa >= 0xfffffffc) ? EFAULT : 0;
}
Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.225.4.1 src/sys/arch/mips/mips/mips_machdep.c:1.225.4.2
--- src/sys/arch/mips/mips/mips_machdep.c:1.225.4.1 Thu Mar 18 04:36:50 2010
+++ src/sys/arch/mips/mips/mips_machdep.c Sun Apr 25 15:27:36 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mips_machdep.c,v 1.225.4.1 2010/03/18 04:36:50 rmind Exp $ */
+/* $NetBSD: mips_machdep.c,v 1.225.4.2 2010/04/25 15:27:36 rmind Exp $ */
/*
* Copyright 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.225.4.1 2010/03/18 04:36:50 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.225.4.2 2010/04/25 15:27:36 rmind Exp $");
#include "opt_cputype.h"
#include "opt_compat_netbsd32.h"
@@ -2181,20 +2181,11 @@
return curcpu()->ci_idepth != 0;
}
-#ifdef pmax /* XXX compat_ultrix */
-
-const struct cdevsw mem_ultrix_cdevsw = {
- nullopen, nullclose, mm_readwrite, mm_readwrite,
- mm_ioctl, nostop, notty, nopoll, mm_mmap, nokqfilter,
- D_MPSAFE
-};
-
-#endif
-
bool
mm_md_direct_mapped_phys(paddr_t paddr, vaddr_t *vaddr)
{
+ /* XXX: Broken. */
#ifdef _LP64
*vaddr = MIPS_PHYS_TO_XKPHYS_CACHED(paddr);
#else
@@ -2214,18 +2205,16 @@
mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
{
extern paddr_t avail_end;
+ const vaddr_t v = ptr;
- if (ptr < (void *)MIPS_KSEG0_START) {
- *handled = true;
+ if (v < MIPS_KSEG0_START) {
return EFAULT;
}
- if (ptr < (void *)MIPS_PHYS_TO_KSEG0(avail_end +
- mips_round_page(MSGBUFSIZE))) {
+ if (v < MIPS_PHYS_TO_KSEG0(avail_end + mips_round_page(MSGBUFSIZE))) {
*handled = true;
return 0;
}
- if (ptr < (void *)MIPS_KSEG2_START) {
- *handled = true;
+ if (v < MIPS_KSEG2_START) {
return EFAULT;
}
*handled = false;
Index: src/sys/arch/mvme68k/mvme68k/machdep.c
diff -u src/sys/arch/mvme68k/mvme68k/machdep.c:1.142.2.1 src/sys/arch/mvme68k/mvme68k/machdep.c:1.142.2.2
--- src/sys/arch/mvme68k/mvme68k/machdep.c:1.142.2.1 Thu Mar 18 04:36:50 2010
+++ src/sys/arch/mvme68k/mvme68k/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.142.2.1 2010/03/18 04:36:50 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.142.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.142.2.1 2010/03/18 04:36:50 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.142.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_ddb.h"
#include "opt_m060sp.h"
@@ -1186,7 +1186,5 @@
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (pa >= lowram && pa < 0xfffffffc)
- return 0;
- return EFAULT;
+ return (pa < lowram || pa >= 0xfffffffc) ? EFAULT : 0;
}
Index: src/sys/arch/news68k/news68k/machdep.c
diff -u src/sys/arch/news68k/news68k/machdep.c:1.85.2.1 src/sys/arch/news68k/news68k/machdep.c:1.85.2.2
--- src/sys/arch/news68k/news68k/machdep.c:1.85.2.1 Thu Mar 18 04:36:51 2010
+++ src/sys/arch/news68k/news68k/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.85.2.1 2010/03/18 04:36:51 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.85.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.85.2.1 2010/03/18 04:36:51 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.85.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_ddb.h"
#include "opt_compat_netbsd.h"
@@ -1086,19 +1086,14 @@
int
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (pa >= lowram && pa < 0xfffffffc)
- return 0;
- return EFAULT;
+
+ return (pa < lowram || pa >= 0xfffffffc) ? EFAULT : 0;
}
int
mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
{
- if (ISIIOVA(ptr)) {
- *handled = true;
- return EFAULT;
- }
*handled = false;
- return 0;
+ return ISIIOVA(ptr) ? EFAULT : 0;
}
Index: src/sys/arch/next68k/next68k/machdep.c
diff -u src/sys/arch/next68k/next68k/machdep.c:1.98.2.1 src/sys/arch/next68k/next68k/machdep.c:1.98.2.2
--- src/sys/arch/next68k/next68k/machdep.c:1.98.2.1 Thu Mar 18 04:36:51 2010
+++ src/sys/arch/next68k/next68k/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.98.2.1 2010/03/18 04:36:51 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.98.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*
* Copyright (c) 1998 Darrin B. Jewell
@@ -79,7 +79,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.98.2.1 2010/03/18 04:36:51 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.98.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -943,7 +943,5 @@
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (pa >= lowram && pa < 0xfffffffc)
- return 0;
- return EFAULT;
+ return (pa < lowram || pa >= 0xfffffffc) ? EFAULT : 0;
}
Index: src/sys/arch/powerpc/powerpc/powerpc_machdep.c
diff -u src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.42.4.1 src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.42.4.2
--- src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.42.4.1 Thu Mar 18 04:36:51 2010
+++ src/sys/arch/powerpc/powerpc/powerpc_machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: powerpc_machdep.c,v 1.42.4.1 2010/03/18 04:36:51 rmind Exp $ */
+/* $NetBSD: powerpc_machdep.c,v 1.42.4.2 2010/04/25 15:27:37 rmind Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.42.4.1 2010/03/18 04:36:51 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.42.4.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_altivec.h"
#include "opt_modular.h"
@@ -319,9 +319,5 @@
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (atop(pa) < physmem)
- return 0;
-
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ return (atop(pa) < physmem) ? 0 : EFAULT;
}
Index: src/sys/arch/sh3/sh3/vm_machdep.c
diff -u src/sys/arch/sh3/sh3/vm_machdep.c:1.66.4.1 src/sys/arch/sh3/sh3/vm_machdep.c:1.66.4.2
--- src/sys/arch/sh3/sh3/vm_machdep.c:1.66.4.1 Thu Mar 18 04:36:51 2010
+++ src/sys/arch/sh3/sh3/vm_machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: vm_machdep.c,v 1.66.4.1 2010/03/18 04:36:51 rmind Exp $ */
+/* $NetBSD: vm_machdep.c,v 1.66.4.2 2010/04/25 15:27:37 rmind Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc. All rights reserved.
@@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.66.4.1 2010/03/18 04:36:51 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.66.4.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_kstack_debug.h"
@@ -399,31 +399,27 @@
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (atop(pa) < vm_physmem[0].start || PHYS_TO_VM_PAGE(pa) != NULL)
+ if (atop(pa) < vm_physmem[0].start || PHYS_TO_VM_PAGE(pa) != NULL) {
return 0;
-
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ }
+ return EFAULT;
}
int
mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
{
- vaddr_t va = (vaddr_t)ptr;
+ const vaddr_t va = (vaddr_t)ptr;
- if (va >= SH3_P1SEG_BASE && va < SH3_P2SEG_BASE) {
+ if (va < SH3_P1SEG_BASE) {
+ return EFAULT;
+ }
+ if (va < SH3_P2SEG_BASE) {
*handled = true;
return 0;
}
-
- if (va < SH3_P1SEG_BASE ||
- (va >= SH3_P2SEG_BASE && va < SH3_P3SEG_BASE)) {
- *handled = true;
+ if (va < SH3_P3SEG_BASE)) {
return EFAULT;
}
-
- /* XXX: v < SH3_P3SEG_BASE is physmem, anything special needed? */
-
*handled = false;
return 0;
}
Index: src/sys/arch/sparc/sparc/machdep.c
diff -u src/sys/arch/sparc/sparc/machdep.c:1.302.2.1 src/sys/arch/sparc/sparc/machdep.c:1.302.2.2
--- src/sys/arch/sparc/sparc/machdep.c:1.302.2.1 Thu Mar 18 04:36:52 2010
+++ src/sys/arch/sparc/sparc/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.302.2.1 2010/03/18 04:36:52 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.302.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.302.2.1 2010/03/18 04:36:52 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.302.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_compat_netbsd.h"
#include "opt_compat_sunos.h"
@@ -2204,19 +2204,10 @@
{
extern vaddr_t prom_vstart;
extern vaddr_t prom_vend;
+ const vaddr_t v = ptr;
- if (ptr >= (void *)MSGBUF_VA &&
- (char *)ptr < (char *)MSGBUF_VA + PAGE_SIZE) {
- *handled = true;
- return 0;
- }
-
- if (ptr >= (void *)prom_vstart && ptr < (void *)prom_vend) {
- *handled = true;
- return (prot & VM_PROT_WRITE) == 0 ? 0 : EFAULT;
- }
-
- *handled = false;
+ *handled = (v >= MSGBUF_VA && v < MSGBUF_VA + PAGE_SIZE) ||
+ (v >= prom_vstart && v < prom_vend && (prot & VM_PROT_WRITE) == 0);
return 0;
}
Index: src/sys/arch/sparc64/sparc64/machdep.c
diff -u src/sys/arch/sparc64/sparc64/machdep.c:1.252.2.1 src/sys/arch/sparc64/sparc64/machdep.c:1.252.2.2
--- src/sys/arch/sparc64/sparc64/machdep.c:1.252.2.1 Thu Mar 18 04:36:52 2010
+++ src/sys/arch/sparc64/sparc64/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.252.2.1 2010/03/18 04:36:52 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.252.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.252.2.1 2010/03/18 04:36:52 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.252.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -2066,23 +2066,13 @@
int
mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
{
- /* Don't know where PROMs are on Ultras. Think it's at f000000 */
- vaddr_t prom_vstart = 0xf000000;
- vaddr_t prom_vend = 0xf0100000;
-
- size_t msgbufsz = msgbufp->msg_bufs +
+ /* XXX: Don't know where PROMs are on Ultras. Think it's at f000000 */
+ const vaddr_t prom_vstart = 0xf000000, prom_vend = 0xf0100000;
+ const vaddr_t msgbufpv = (vaddr_t)msgbufp, v = ptr;
+ const size_t msgbufsz = msgbufp->msg_bufs +
offsetof(struct kern_msgbuf, msg_bufc);
- if ((char *)ptr >= (char *)msgbufp &&
- (char *)ptr < (char *)msgbufp + msgbufsz) {
- *handled = true;
- return 0;
- }
-
- if ((vaddr_t)ptr >= prom_vstart && (vaddr_t)ptr < prom_vend) {
- *handled = true;
- return (prot & VM_PROT_WRITE) == 0 ? 0 : EFAULT;
- }
- *handled = false;
+ *handled = (v >= msgbufpv && v < msgbufpv + msgbufsz) ||
+ (v >= prom_vstart && v < prom_vend && (prot & VM_PROT_WRITE) == 0);
return 0;
}
Index: src/sys/arch/vax/include/types.h
diff -u src/sys/arch/vax/include/types.h:1.40.4.1 src/sys/arch/vax/include/types.h:1.40.4.2
--- src/sys/arch/vax/include/types.h:1.40.4.1 Thu Mar 18 04:36:53 2010
+++ src/sys/arch/vax/include/types.h Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.40.4.1 2010/03/18 04:36:53 rmind Exp $ */
+/* $NetBSD: types.h,v 1.40.4.2 2010/04/25 15:27:37 rmind Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -77,5 +77,6 @@
#define __HAVE_FAST_SOFTINTS
#define __HAVE_MM_MD_READWRITE
+#define __HAVE_MM_MD_DIRECT_MAPPED_PHYS
#endif /* _MACHTYPES_H_ */
Index: src/sys/arch/vax/vax/machdep.c
diff -u src/sys/arch/vax/vax/machdep.c:1.179.2.1 src/sys/arch/vax/vax/machdep.c:1.179.2.2
--- src/sys/arch/vax/vax/machdep.c:1.179.2.1 Thu Mar 18 04:36:53 2010
+++ src/sys/arch/vax/vax/machdep.c Sun Apr 25 15:27:37 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.179.2.1 2010/03/18 04:36:53 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.179.2.2 2010/04/25 15:27:37 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
@@ -83,7 +83,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.179.2.1 2010/03/18 04:36:53 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.179.2.2 2010/04/25 15:27:37 rmind Exp $");
#include "opt_ddb.h"
#include "opt_compat_netbsd.h"
@@ -782,15 +782,19 @@
__asm("halt");
}
+bool
+mm_md_direct_mapped_phys(paddr_t paddr, vaddr_t *vaddr)
+{
+
+ *vaddr = paddr + KERNBASE;
+ return true;
+}
+
int
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- if (pa < ctob(physmem))
- return 0;
-
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ return (pa < avail_end) ? 0 : EFAULT;
}
int
Index: src/sys/arch/x68k/x68k/machdep.c
diff -u src/sys/arch/x68k/x68k/machdep.c:1.165.2.1 src/sys/arch/x68k/x68k/machdep.c:1.165.2.2
--- src/sys/arch/x68k/x68k/machdep.c:1.165.2.1 Thu Mar 18 04:36:53 2010
+++ src/sys/arch/x68k/x68k/machdep.c Sun Apr 25 15:27:38 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.165.2.1 2010/03/18 04:36:53 rmind Exp $ */
+/* $NetBSD: machdep.c,v 1.165.2.2 2010/04/25 15:27:38 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.165.2.1 2010/03/18 04:36:53 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.165.2.2 2010/04/25 15:27:38 rmind Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -1250,7 +1250,5 @@
pa < ctob(vm_physmem[i].end))
return 0;
}
-
- return kauth_authorize_machdep(kauth_cred_get(),
- KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
+ return EFAULT;
}
Index: src/sys/dev/mm.c
diff -u src/sys/dev/mm.c:1.13.16.1 src/sys/dev/mm.c:1.13.16.2
--- src/sys/dev/mm.c:1.13.16.1 Thu Mar 18 04:36:54 2010
+++ src/sys/dev/mm.c Sun Apr 25 15:27:35 2010
@@ -1,11 +1,11 @@
-/* $NetBSD: mm.c,v 1.13.16.1 2010/03/18 04:36:54 rmind Exp $ */
+/* $NetBSD: mm.c,v 1.13.16.2 2010/04/25 15:27:35 rmind Exp $ */
/*-
* Copyright (c) 2002, 2008, 2010 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
- * by Christos Zoulas and Joerg Sonnenberger.
+ * by Christos Zoulas, Joerg Sonnenberger and Mindaugas Rasiukevicius.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,8 +29,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+/*
+ * Special /dev/{mem,kmem,zero,null} memory devices.
+ */
+
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mm.c,v 1.13.16.1 2010/03/18 04:36:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mm.c,v 1.13.16.2 2010/04/25 15:27:35 rmind Exp $");
#include "opt_compat_netbsd.h"
@@ -65,6 +69,16 @@
D_MPSAFE
};
+#ifdef pmax /* XXX */
+const struct cdevsw mem_ultrix_cdevsw = {
+ nullopen, nullclose, mm_readwrite, mm_readwrite, mm_ioctl,
+ nostop, notty, nopoll, mm_mmap, nokqfilter, D_MPSAFE
+};
+#endif
+
+/*
+ * mm_init: initialize memory device driver.
+ */
void
mm_init(void)
{
@@ -72,60 +86,86 @@
mutex_init(&dev_mem_lock, MUTEX_DEFAULT, IPL_NONE);
+ /* Read-only zero-page. */
pg = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED|UVM_KMF_ZERO);
KASSERT(pg != 0);
pmap_protect(pmap_kernel(), pg, pg + PAGE_SIZE, VM_PROT_READ);
dev_zero_page = (void *)pg;
+#ifndef __HAVE_MM_MD_PREFER_VA
+ /* KVA for mappings during I/O. */
dev_mem_addr = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_VAONLY);
KASSERT(dev_mem_addr != 0);
+#endif
}
+/*
+ * dev_kmem_readwrite: helper for DEV_MEM (/dev/mem) case of R/W.
+ */
static int
dev_mem_readwrite(struct uio *uio, struct iovec *iov)
{
- bool have_direct;
paddr_t paddr;
vaddr_t vaddr;
vm_prot_t prot;
size_t len, offset;
+ bool have_direct;
int error;
+ /* Check for wrap around. */
if ((intptr_t)uio->uio_offset != uio->uio_offset) {
return EFAULT;
}
paddr = uio->uio_offset & ~PAGE_MASK;
- offset = uio->uio_offset & PAGE_MASK;
- len = min(uio->uio_resid, PAGE_SIZE - offset);
- prot = uio->uio_rw == UIO_WRITE ? VM_PROT_WRITE : VM_PROT_READ;
-
+ prot = (uio->uio_rw == UIO_WRITE) ? VM_PROT_WRITE : VM_PROT_READ;
error = mm_md_physacc(paddr, prot);
if (error) {
return error;
}
+ offset = uio->uio_offset & PAGE_MASK;
+ len = min(uio->uio_resid, PAGE_SIZE - offset);
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+ /* Is physical address directly mapped? Return VA. */
have_direct = mm_md_direct_mapped_phys(paddr, &vaddr);
#else
have_direct = false;
#endif
if (!have_direct) {
+#ifndef __HAVE_MM_MD_PREFER_VA
+ const vaddr_t va = dev_mem_addr;
+#else
+ /* Get a special virtual address. */
+ const vaddr_t va = mm_md_getva(paddr);
+#endif
+ /* Map selected KVA to physical address. */
mutex_enter(&dev_mem_lock);
- pmap_enter(pmap_kernel(), dev_mem_addr, paddr, prot,
- prot | PMAP_WIRED);
+ pmap_kenter_pa(va, paddr, prot, 0);
pmap_update(pmap_kernel());
- vaddr = dev_mem_addr + offset;
+ /* Perform I/O. */
+ vaddr = va + offset;
error = uiomove((void *)vaddr, len, uio);
- pmap_remove(pmap_kernel(), dev_mem_addr, PAGE_SIZE);
+ /* Unmap. Note: no need for pmap_update(). */
+ pmap_kremove(va, PAGE_SIZE);
mutex_exit(&dev_mem_lock);
+
+#ifdef __HAVE_MM_MD_PREFER_VA
+ /* "Release" the virtual address. */
+ mm_md_relva(va);
+#endif
} else {
+ /* Direct map, just perform I/O. */
+ vaddr += offset;
error = uiomove((void *)vaddr, len, uio);
}
return error;
}
+/*
+ * dev_kmem_readwrite: helper for DEV_KMEM (/dev/kmem) case of R/W.
+ */
static int
dev_kmem_readwrite(struct uio *uio, struct iovec *iov)
{
@@ -135,51 +175,76 @@
int error;
bool md_kva;
+ /* Check for wrap around. */
addr = (void *)(intptr_t)uio->uio_offset;
if ((uintptr_t)addr != uio->uio_offset) {
return EFAULT;
}
+ /*
+ * Handle non-page aligned offset.
+ * Otherwise, we operate in page-by-page basis.
+ */
offset = uio->uio_offset & PAGE_MASK;
len = min(uio->uio_resid, PAGE_SIZE - offset);
- prot = uio->uio_rw == UIO_WRITE ? VM_PROT_WRITE : VM_PROT_READ;
+ prot = (uio->uio_rw == UIO_WRITE) ? VM_PROT_WRITE : VM_PROT_READ;
md_kva = false;
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_IO
paddr_t paddr;
+ /* MD case: is this is a directly mapped address? */
if (mm_md_direct_mapped_io(addr, &paddr)) {
+ /* If so, validate physical address. */
error = mm_md_physacc(paddr, prot);
- if (error)
+ if (error) {
return error;
+ }
md_kva = true;
}
#endif
+ if (!md_kva) {
+ bool checked = false;
#ifdef __HAVE_MM_MD_KERNACC
- if (!md_kva && (error = mm_md_kernacc(addr, prot, &md_kva)) != 0) {
- return error;
- }
+ /* MD check for the address. */
+ error = mm_md_kernacc(addr, prot, &checked);
+ if (error) {
+ return error;
+ }
#endif
- if (!md_kva && !uvm_kernacc(addr, prot)) {
- return EFAULT;
+ /* UVM check for the address (unless MD indicated to not). */
+ if (!checked && !uvm_kernacc(addr, len, prot)) {
+ return EFAULT;
+ }
}
error = uiomove(addr, len, uio);
return error;
}
-static int
+/*
+ * dev_zero_readwrite: helper for DEV_ZERO (/dev/null) case of R/W.
+ */
+static inline int
dev_zero_readwrite(struct uio *uio, struct iovec *iov)
{
size_t len;
+ /* Nothing to do for the write case. */
if (uio->uio_rw == UIO_WRITE) {
uio->uio_resid = 0;
return 0;
}
+ /*
+ * Read in page-by-page basis, caller will continue.
+ * Cut appropriately for a single/last-iteration cases.
+ */
len = min(iov->iov_len, PAGE_SIZE);
return uiomove(dev_zero_page, len, uio);
}
+/*
+ * mm_readwrite: general memory R/W function.
+ */
static int
mm_readwrite(dev_t dev, struct uio *uio, int flags)
{
@@ -187,6 +252,7 @@
int error;
#ifdef __HAVE_MM_MD_READWRITE
+ /* If defined - there are extra MD cases. */
switch (minor(dev)) {
case DEV_MEM:
case DEV_KMEM:
@@ -204,11 +270,13 @@
while (uio->uio_resid > 0 && error == 0) {
iov = uio->uio_iov;
if (iov->iov_len == 0) {
- ++uio->uio_iov;
- --uio->uio_iovcnt;
+ /* Processed; next I/O vector. */
+ uio->uio_iov++;
+ uio->uio_iovcnt--;
KASSERT(uio->uio_iovcnt >= 0);
continue;
}
+ /* Helper functions will process in page-by-page basis. */
switch (minor(dev)) {
case DEV_MEM:
error = dev_mem_readwrite(uio, iov);
@@ -236,12 +304,16 @@
return error;
}
+/*
+ * mm_mmap: general mmap() handler.
+ */
static paddr_t
mm_mmap(dev_t dev, off_t off, int acc)
{
vm_prot_t prot;
#ifdef __HAVE_MM_MD_MMAP
+ /* If defined - there are extra mmap() MD cases. */
switch (minor(dev)) {
case DEV_MEM:
case DEV_KMEM:
@@ -271,6 +343,7 @@
if (acc & PROT_WRITE)
prot |= VM_PROT_WRITE;
+ /* Validate the physical address. */
if (mm_md_physacc(off, prot) != 0) {
return -1;
}
Index: src/sys/dev/mm.h
diff -u src/sys/dev/mm.h:1.1.2.1 src/sys/dev/mm.h:1.1.2.2
--- src/sys/dev/mm.h:1.1.2.1 Thu Mar 18 04:36:54 2010
+++ src/sys/dev/mm.h Sun Apr 25 15:27:35 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: mm.h,v 1.1.2.1 2010/03/18 04:36:54 rmind Exp $ */
+/* $NetBSD: mm.h,v 1.1.2.2 2010/04/25 15:27:35 rmind Exp $ */
/*-
* Copyright (c) 2008 Joerg Sonnenberger <[email protected]>.
@@ -86,4 +86,13 @@
*/
bool mm_md_direct_mapped_io(void *, paddr_t *);
+/*
+ * Optional hooks to select and release a special virtual address,
+ * in order to avoid cache aliasing issues on certain architectures.
+ *
+ * machine/types.h must define __HAVE_MM_MD_PREFER_VA to use this.
+ */
+vaddr_t mm_md_getva(paddr_t);
+void mm_md_relva(vaddr_t);
+
#endif /* _SYS_DEV_MM_H_ */
Index: src/sys/uvm/uvm_glue.c
diff -u src/sys/uvm/uvm_glue.c:1.144.2.1 src/sys/uvm/uvm_glue.c:1.144.2.2
--- src/sys/uvm/uvm_glue.c:1.144.2.1 Thu Mar 18 04:36:54 2010
+++ src/sys/uvm/uvm_glue.c Sun Apr 25 15:27:38 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_glue.c,v 1.144.2.1 2010/03/18 04:36:54 rmind Exp $ */
+/* $NetBSD: uvm_glue.c,v 1.144.2.2 2010/04/25 15:27:38 rmind Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.144.2.1 2010/03/18 04:36:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.144.2.2 2010/04/25 15:27:38 rmind Exp $");
#include "opt_kgdb.h"
#include "opt_kstack.h"
@@ -90,24 +90,19 @@
#include <uvm/uvm.h>
/*
- * XXXCDC: do these really belong here?
- */
-
-/*
- * uvm_kernacc: can the kernel access a region of memory
+ * uvm_kernacc: test if kernel can access a memory region.
*
- * - used only by /dev/kmem driver (dev/mm.c)
+ * => Currently used only by /dev/kmem driver (dev/mm.c).
*/
-
bool
-uvm_kernacc(void *addr, vm_prot_t prot)
+uvm_kernacc(void *addr, size_t len, vm_prot_t prot)
{
- vaddr_t saddr;
+ vaddr_t saddr = trunc_page((vaddr_t)addr);
+ vaddr_t eaddr = round_page(saddr + len);
bool rv;
- saddr = trunc_page((vaddr_t)addr);
vm_map_lock_read(kernel_map);
- rv = uvm_map_checkprot(kernel_map, saddr, saddr + 1, prot);
+ rv = uvm_map_checkprot(kernel_map, saddr, eaddr, prot);
vm_map_unlock_read(kernel_map);
return rv;