Module Name:    src
Committed By:   skrll
Date:           Sat Nov 23 18:13:04 UTC 2024

Modified Files:
        src/sys/arch/riscv/include: types.h
        src/sys/arch/riscv/riscv: riscv_machdep.c

Log Message:
risc-v: add __HAVE_MM_MD_KERNACC (basic) support.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/riscv/include/types.h
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/riscv/riscv/riscv_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/riscv/include/types.h
diff -u src/sys/arch/riscv/include/types.h:1.18 src/sys/arch/riscv/include/types.h:1.19
--- src/sys/arch/riscv/include/types.h:1.18	Sun Aug  4 08:16:25 2024
+++ src/sys/arch/riscv/include/types.h	Sat Nov 23 18:13:04 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.18 2024/08/04 08:16:25 skrll Exp $ */
+/* $NetBSD: types.h,v 1.19 2024/11/23 18:13:04 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -95,6 +95,7 @@ typedef __int32_t	__register_t;
 #define	__HAVE_FAST_SOFTINTS		// Not yet
 #endif
 #define	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
+#define	__HAVE_MM_MD_KERNACC
 #define	__HAVE_NEW_STYLE_BUS_H
 #define	__HAVE_SYSCALL_INTERN
 #define	__HAVE_TLS_VARIANT_I

Index: src/sys/arch/riscv/riscv/riscv_machdep.c
diff -u src/sys/arch/riscv/riscv/riscv_machdep.c:1.39 src/sys/arch/riscv/riscv/riscv_machdep.c:1.40
--- src/sys/arch/riscv/riscv/riscv_machdep.c:1.39	Fri Nov 22 20:01:04 2024
+++ src/sys/arch/riscv/riscv/riscv_machdep.c	Sat Nov 23 18:13:04 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: riscv_machdep.c,v 1.39 2024/11/22 20:01:04 skrll Exp $	*/
+/*	$NetBSD: riscv_machdep.c,v 1.40 2024/11/23 18:13:04 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2014, 2019, 2022 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 #include "opt_riscv_debug.h"
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: riscv_machdep.c,v 1.39 2024/11/22 20:01:04 skrll Exp $");
+__RCSID("$NetBSD: riscv_machdep.c,v 1.40 2024/11/23 18:13:04 skrll Exp $");
 
 #include <sys/param.h>
 
@@ -57,6 +57,10 @@ __RCSID("$NetBSD: riscv_machdep.c,v 1.39
 #include <sys/systm.h>
 
 #include <dev/cons.h>
+#ifdef __HAVE_MM_MD_KERNACC
+#include <dev/mm.h>
+#endif
+
 #include <uvm/uvm_extern.h>
 
 #include <riscv/frame.h>
@@ -902,6 +906,37 @@ init_riscv(register_t hartid, paddr_t dt
 }
 
 
+#ifdef __HAVE_MM_MD_KERNACC
+int
+mm_md_kernacc(void *ptr, vm_prot_t prot, bool *handled)
+{
+	extern char __kernel_text[];
+	extern char _end[];
+	extern char __data_start[];
+
+	const vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text);
+	const vaddr_t kernend = round_page((vaddr_t)_end);
+	const vaddr_t data_start = (vaddr_t)__data_start;
+
+	const vaddr_t va = (vaddr_t)ptr;
+
+#define IN_RANGE_P(addr, start, end) (start) <= (addr) && (addr) < (end)
+
+	*handled = false;
+	if (IN_RANGE_P(va, kernstart, kernend)) {
+		*handled = true;
+		if (va < data_start && (prot & VM_PROT_WRITE) != 0) {
+			return EFAULT;
+		}
+	} else if (IN_RANGE_P(va, RISCV_DIRECTMAP_START, RISCV_DIRECTMAP_END)) {
+		*handled = true;
+	}
+
+	return 0;
+}
+#endif
+
+
 #ifdef _LP64
 static void
 pte_bits(void (*pr)(const char *, ...), pt_entry_t pte)

Reply via email to