Module Name: src Committed By: isaki Date: Fri Aug 6 04:21:56 UTC 2021
Modified Files: src/sys/arch/x68k/x68k: machdep.c Log Message: Fix broken mm_md_physacc(). - Fix access to main memory and extended memory. This makes /dev/mem work again. - Introduce kauth(9) to access unmanaged memory area. Now you can read/write the internal I/O space via /dev/mem when securelevel = -1. Thanks ryo@, tsutsui@ for advices and reviews. To generate a diff of this commit: cvs rdiff -u -r1.205 -r1.206 src/sys/arch/x68k/x68k/machdep.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/x68k/x68k/machdep.c diff -u src/sys/arch/x68k/x68k/machdep.c:1.205 src/sys/arch/x68k/x68k/machdep.c:1.206 --- src/sys/arch/x68k/x68k/machdep.c:1.205 Thu Feb 11 02:37:11 2021 +++ src/sys/arch/x68k/x68k/machdep.c Fri Aug 6 04:21:56 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.205 2021/02/11 02:37:11 tsutsui Exp $ */ +/* $NetBSD: machdep.c,v 1.206 2021/08/06 04:21:56 isaki Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.205 2021/02/11 02:37:11 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.206 2021/08/06 04:21:56 isaki Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -1252,15 +1252,28 @@ cpu_intr_p(void) int mm_md_physacc(paddr_t pa, vm_prot_t prot) { - uvm_physseg_t i; + int i; - for (i = uvm_physseg_get_first(); uvm_physseg_valid_p(i); i = uvm_physseg_get_next(i)) { - if (uvm_physseg_valid_p(i) == false) - break; + /* Main memory */ + if (phys_basemem_seg.start <= pa && pa < phys_basemem_seg.end) + return 0; - if (ctob(uvm_physseg_get_start(i)) <= pa && - pa < ctob(uvm_physseg_get_end(i))) +#ifdef EXTENDED_MEMORY + for (i = 0; i < EXTMEM_SEGS; i++) { + if (phys_extmem_seg[i].start == phys_extmem_seg[i].end) + continue; + if (phys_extmem_seg[i].start <= pa && + pa < phys_extmem_seg[i].end) { return 0; + } } +#endif + + /* I/O space */ + if (INTIOBASE <= pa && pa < INTIOTOP) { + return kauth_authorize_machdep(kauth_cred_get(), + KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL); + } + return EFAULT; }