Index: lib/libkvm/tests/kvm_geterr_test.c =================================================================== --- lib/libkvm/tests/kvm_geterr_test.c +++ lib/libkvm/tests/kvm_geterr_test.c @@ -26,6 +26,8 @@ #include __FBSDID("$FreeBSD$"); +#include +#include #include #include #include @@ -125,6 +127,15 @@ "error message changed: %s", error_msg); ATF_REQUIRE_MSG(kvm_close(kd) == 0, "kvm_close failed: %s", strerror(errno)); + + /* sanity check of value read from kvm_read */ + int sysctl_maxcpus; + size_t len = sizeof(sysctl_maxcpus); + retcode = sysctlbyname("kern.smp.maxcpus", &sysctl_maxcpus, &len, NULL, 0); + ATF_REQUIRE_MSG(retcode == 0, "sysctl read failed : %d", retcode); + ATF_REQUIRE_EQ_MSG(mp_maxcpus, sysctl_maxcpus, + "sanity check failed: kvm_read returned %d but sysctl maxcpus returned %d", + mp_maxcpus, sysctl_maxcpus); } #endif Index: sys/powerpc/powerpc/mem.c =================================================================== --- sys/powerpc/powerpc/mem.c +++ sys/powerpc/powerpc/mem.c @@ -137,7 +137,8 @@ else if (dev2unit(dev) == CDEV_MINOR_KMEM) { va = uio->uio_offset; - if ((va < VM_MIN_KERNEL_ADDRESS) || (va > virtual_end)) { + if (hw_direct_map && + ((va < VM_MIN_KERNEL_ADDRESS) || (va > virtual_end))) { v = DMAP_TO_PHYS(va); goto kmem_direct_mapped; } @@ -159,8 +160,9 @@ ? VM_PROT_READ : VM_PROT_WRITE; va = uio->uio_offset; - if (kernacc((void *) va, iov->iov_len, prot) - == FALSE) + + if (hw_direct_map && + kernacc((void *) va, iov->iov_len, prot) == FALSE) return (EFAULT); error = uiomove((void *)va, iov->iov_len, uio);