CVS commit: [netbsd-11] src/sys/arch/amd64/amd64

"Martin Husemann" <[email protected]>
Newsgroups gmane.os.netbsd.devel.cvs
Message-ID <[email protected]>
Module Name:	src
Committed By:	martin
Date:		Wed Mar  4 20:05:58 UTC 2026

Modified Files:
	src/sys/arch/amd64/amd64 [netbsd-11]: machdep.c

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #199):

	sys/arch/amd64/amd64/machdep.c: revision 1.379

amd64: Fix locking around uvm_map_checkprot in mm_md_kernacc.

This call was originally introduced in sys/arch/amd64/amd64/mem.c
rev. 1.11 back in 2003 by fvdl@ with the commit message:

Proper checks for kmem reads beyond _end
https://mail-index.netbsd.org/source-changes/2003/10/14/msg135803.html

At some point, SOMEBODY added an assertion in uvm that made it stop
working:
uvm_map(9): Sprinkle assertions and interface contract comments.
No functional change intended.

https://mail-index.netbsd.org/source-changes/2024/08/13/msg152763.html
(Really, this assertion revealed that this path was broken all along.)

This patch makes the amd64 mm_md_kernacc match the corresponding logic
in uvm_kernacc around uvm_map_checkprot:
    104         vm_map_lock_read(kernel_map);
    105         rv = uvm_map_checkprot(kernel_map, saddr, eaddr, prot);
    106         vm_map_unlock_read(kernel_map);
https://nxr.netbsd.org/xref/src/sys/uvm/uvm_glue.c#92

Now, all of these checks in /dev/mem and company look like TOCTOU
bogosity, because the answers are stale by the time we reach uiomove,
which has to re-check any access anyway:
    269         if (!md_kva) {
    270                 bool checked = false;
    271
    272 #ifdef __HAVE_MM_MD_KERNACC
    273                 /* MD check for the address. */
    274                 error = mm_md_kernacc(addr, prot, &checked);
    275                 if (error) {
    276                         return error;
    277                 }
    278 #endif
    279                 /* UVM check for the address (unless MD indicated to not). */
    280                 if (!checked && !uvm_kernacc(addr, len, prot)) {
    281                         return EFAULT;
    282                 }
    283         }
    284         error = uiomove(addr, len, uio);
https://nxr.netbsd.org/xref/src/sys/dev/mm.c?r=1.25#269
But we can address that in a separate change.

PR kern/59955: kernel diagnostic assertion "rw_lock_held(&map->lock)"
failed: file "/home/riastradh/netbsd/11/src/sys/uvm/uvm_map.c", line
1704


To generate a diff of this commit:
cvs rdiff -u -r1.376 -r1.376.2.1 src/sys/arch/amd64/amd64/machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.