Module Name: src
Committed By: ryo
Date: Sat Oct 13 08:32:36 UTC 2018
Modified Files:
src/sys/arch/aarch64/aarch64: aarch64_machdep.c
src/sys/arch/aarch64/include: pmap.h types.h
Log Message:
- define PMAP_{MAP,UNMAP}_POOLPAGE for performance
- define __HAVE_MM_MD_KERNACC and add mm_md_kernacc()
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/aarch64_machdep.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/aarch64/include/pmap.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/aarch64/include/types.h
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/aarch64/aarch64/aarch64_machdep.c
diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.13 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.14
--- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.13 Fri Oct 12 21:44:20 2018
+++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c Sat Oct 13 08:32:36 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.13 2018/10/12 21:44:20 jmcneill Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.14 2018/10/13 08:32:36 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.13 2018/10/12 21:44:20 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.14 2018/10/13 08:32:36 ryo Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -528,6 +528,45 @@ mm_md_physacc(paddr_t pa, vm_prot_t prot
KAUTH_MACHDEP_UNMANAGEDMEM, NULL, NULL, NULL, NULL);
}
+#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[];
+ extern char __rodata_start[];
+
+ vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text);
+ vaddr_t kernend = round_page((vaddr_t)_end);
+ paddr_t kernstart_phys = KERN_VTOPHYS(kernstart);
+ vaddr_t data_start = (vaddr_t)__data_start;
+ vaddr_t rodata_start = (vaddr_t)__rodata_start;
+ vsize_t rosize = kernend - rodata_start;
+
+ const vaddr_t v = (vaddr_t)ptr;
+
+#define IN_RANGE(addr,sta,end) (((sta) <= (addr)) && ((addr) < (end)))
+
+ *handled = false;
+ if (IN_RANGE(v, kernstart, kernend + kernend_extra)) {
+ *handled = true;
+ if ((v < data_start) && (prot & VM_PROT_WRITE))
+ return EFAULT;
+ } else if (IN_RANGE(v, AARCH64_KSEG_START, AARCH64_KSEG_END)) {
+ paddr_t pa = AARCH64_KVA_TO_PA(v);
+ if (IN_RANGE(pa, physical_start, physical_end)) {
+ *handled = true;
+ if (IN_RANGE(pa, kernstart_phys,
+ kernstart_phys + rosize) &&
+ (prot & VM_PROT_WRITE))
+ return EFAULT;
+ }
+ }
+ return 0;
+}
+#endif
+
void
cpu_startup(void)
{
Index: src/sys/arch/aarch64/include/pmap.h
diff -u src/sys/arch/aarch64/include/pmap.h:1.14 src/sys/arch/aarch64/include/pmap.h:1.15
--- src/sys/arch/aarch64/include/pmap.h:1.14 Fri Oct 12 01:28:58 2018
+++ src/sys/arch/aarch64/include/pmap.h Sat Oct 13 08:32:36 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.14 2018/10/12 01:28:58 ryo Exp $ */
+/* $NetBSD: pmap.h,v 1.15 2018/10/13 08:32:36 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -47,6 +47,10 @@
#define __HAVE_VM_PAGE_MD
+#define PMAP_MAP_POOLPAGE(pa) AARCH64_PA_TO_KVA(pa)
+#define PMAP_UNMAP_POOLPAGE(va) AARCH64_KVA_TO_PA(va)
+
+
struct pmap {
kmutex_t pm_lock;
struct pool *pm_pvpool;
Index: src/sys/arch/aarch64/include/types.h
diff -u src/sys/arch/aarch64/include/types.h:1.11 src/sys/arch/aarch64/include/types.h:1.12
--- src/sys/arch/aarch64/include/types.h:1.11 Tue Jul 17 11:55:55 2018
+++ src/sys/arch/aarch64/include/types.h Sat Oct 13 08:32:36 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.11 2018/07/17 11:55:55 joerg Exp $ */
+/* $NetBSD: types.h,v 1.12 2018/10/13 08:32:36 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -94,6 +94,7 @@ typedef __uint64_t __register_t;
#define __HAVE_FAST_SOFTINTS
#define __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+#define __HAVE_MM_MD_KERNACC
#define __HAVE_CPU_COUNTER
#define __HAVE_SYSCALL_INTERN
#define __HAVE_NEW_STYLE_BUS_H