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)