Module Name: src
Committed By: skrll
Date: Sun Mar 29 09:10:26 UTC 2020
Modified Files:
src/sys/arch/arm/arm32: fault.c pmap.c
src/sys/arch/arm/include: pcb.h
Log Message:
Support PMAP_FAULTINFO on arm
To generate a diff of this commit:
cvs rdiff -u -r1.110 -r1.111 src/sys/arch/arm/arm32/fault.c
cvs rdiff -u -r1.400 -r1.401 src/sys/arch/arm/arm32/pmap.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/arm/include/pcb.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/arm/arm32/fault.c
diff -u src/sys/arch/arm/arm32/fault.c:1.110 src/sys/arch/arm/arm32/fault.c:1.111
--- src/sys/arch/arm/arm32/fault.c:1.110 Mon Feb 24 12:38:57 2020
+++ src/sys/arch/arm/arm32/fault.c Sun Mar 29 09:10:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fault.c,v 1.110 2020/02/24 12:38:57 rin Exp $ */
+/* $NetBSD: fault.c,v 1.111 2020/03/29 09:10:26 skrll Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -81,7 +81,7 @@
#include "opt_kgdb.h"
#include <sys/types.h>
-__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.110 2020/02/24 12:38:57 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.111 2020/03/29 09:10:26 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -468,6 +468,33 @@ data_abort_handler(trapframe_t *tf)
dab_fatal(tf, fsr, far, l, NULL);
}
+#ifdef PMAP_FAULTINFO
+ struct pcb_faultinfo * const pfi = &pcb->pcb_faultinfo;
+ struct proc * const p = curproc;
+
+ if (p->p_pid == pfi->pfi_lastpid && va == pfi->pfi_faultaddr) {
+ if (++pfi->pfi_repeats > 4) {
+ tlb_asid_t asid = tlb_get_asid();
+ pt_entry_t *ptep = pfi->pfi_faultptep;
+
+ printf("%s: fault #%u (%x/%s) for %#" PRIxVADDR
+ "(%#x) at pc %#" PRIxREGISTER " curpid=%u/%u "
+ "ptep@%p=%#" PRIxPTE ")\n", __func__,
+ pfi->pfi_repeats, fsr & FAULT_TYPE_MASK,
+ data_aborts[fsr & FAULT_TYPE_MASK].desc, va,
+ far, tf->tf_pc, map->pmap->pm_pai[0].pai_asid,
+ asid, ptep, ptep ? *ptep : 0);
+ cpu_Debugger();
+ }
+ } else {
+ pfi->pfi_lastpid = p->p_pid;
+ pfi->pfi_faultaddr = va;
+ pfi->pfi_repeats = 0;
+ pfi->pfi_faultptep = NULL;
+ pfi->pfi_faulttype = fsr & FAULT_TYPE_MASK;
+ }
+#endif /* PMAP_FAULTINFO */
+
onfault = pcb->pcb_onfault;
pcb->pcb_onfault = NULL;
error = uvm_fault(map, va, ftype);
Index: src/sys/arch/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.400 src/sys/arch/arm/arm32/pmap.c:1.401
--- src/sys/arch/arm/arm32/pmap.c:1.400 Mon Mar 23 16:38:29 2020
+++ src/sys/arch/arm/arm32/pmap.c Sun Mar 29 09:10:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.400 2020/03/23 16:38:29 skrll Exp $ */
+/* $NetBSD: pmap.c,v 1.401 2020/03/29 09:10:26 skrll Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -198,7 +198,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.400 2020/03/23 16:38:29 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.401 2020/03/29 09:10:26 skrll Exp $");
#include <sys/atomic.h>
#include <sys/param.h>
@@ -3466,6 +3466,12 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
UVMHIST_LOG(maphist, " (pm=%#jx, sva=%#jx, eva=%#jx)",
(uintptr_t)pm, sva, eva, 0);
+#ifdef PMAP_FAULTINFO
+ curpcb->pcb_faultinfo.pfi_faultaddr = 0;
+ curpcb->pcb_faultinfo.pfi_repeats = 0;
+ curpcb->pcb_faultinfo.pfi_faultptep = NULL;
+#endif
+
SLIST_INIT(&opv_list);
/*
* we lock in the pmap => pv_head direction
Index: src/sys/arch/arm/include/pcb.h
diff -u src/sys/arch/arm/include/pcb.h:1.28 src/sys/arch/arm/include/pcb.h:1.29
--- src/sys/arch/arm/include/pcb.h:1.28 Wed Jan 24 09:04:45 2018
+++ src/sys/arch/arm/include/pcb.h Sun Mar 29 09:10:26 2020
@@ -41,6 +41,14 @@
#include <arm/arm32/pte.h>
#include <arm/reg.h>
+struct pcb_faultinfo {
+ void *pfi_faultptep;
+ vaddr_t pfi_faultaddr;
+ u_int pfi_repeats;
+ pid_t pfi_lastpid;
+ uint8_t pfi_faulttype;
+};
+
#define pcb_ksp pcb_sp
struct pcb {
@@ -68,6 +76,7 @@ struct pcb {
void * pcb_onfault; /* On fault handler */
struct vfpreg pcb_vfp; /* VFP registers */
struct vfpreg pcb_kernel_vfp; /* kernel VFP state */
+ struct pcb_faultinfo pcb_faultinfo;
};
/*