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;
 };
 
 /*

Reply via email to