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)