Module Name:    src
Committed By:   skrll
Date:           Thu Jun 22 06:51:30 UTC 2017

Modified Files:
        src/sys/arch/arm/cortex: gic.c

Log Message:
Add 'armgichist' KERNHIST for (future) debugging.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/cortex/gic.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/arm/cortex/gic.c
diff -u src/sys/arch/arm/cortex/gic.c:1.24 src/sys/arch/arm/cortex/gic.c:1.25
--- src/sys/arch/arm/cortex/gic.c:1.24	Sun Jun 18 22:11:50 2017
+++ src/sys/arch/arm/cortex/gic.c	Thu Jun 22 06:51:30 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: gic.c,v 1.24 2017/06/18 22:11:50 jmcneill Exp $	*/
+/*	$NetBSD: gic.c,v 1.25 2017/06/22 06:51:30 skrll Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -29,19 +29,22 @@
  */
 
 #include "opt_ddb.h"
+#include "opt_kernhist.h"
 #include "opt_multiprocessor.h"
 
 #define _INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.24 2017/06/18 22:11:50 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.25 2017/06/22 06:51:30 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
+#include <sys/cpu.h>
 #include <sys/device.h>
 #include <sys/evcnt.h>
 #include <sys/intr.h>
-#include <sys/cpu.h>
+#include <sys/kernhist.h>
+#include <sys/once.h>
 #include <sys/proc.h>
 
 #include <arm/armreg.h>
@@ -71,6 +74,16 @@ static void armgic_cpu_init(struct pic_s
 static void armgic_ipi_send(struct pic_softc *, const kcpuset_t *, u_long);
 #endif
 
+#ifdef KERNHIST
+static int armgichist_init(void);
+
+#ifndef ARMGICHIST_SIZE
+#define ARMGICHIST_SIZE 200
+#endif
+
+KERNHIST_DEFINE(armgichist);
+#endif
+
 static const struct pic_ops armgic_picops = {
 	.pic_unblock_irqs = armgic_unblock_irqs,
 	.pic_block_irqs = armgic_block_irqs,
@@ -238,12 +251,27 @@ softint_trigger(uintptr_t machdep)
 }
 #endif
 
+
+#ifdef KERNHIST
+int
+armgichist_init(void)
+{
+
+	KERNHIST_INIT(armgichist, ARMGICHIST_SIZE);
+
+	return 0;
+}
+#endif
+
 void
-armgic_irq_handler(void *tf)
+armgic_irq_handler(void *arg)
 {
+    	KERNHIST_FUNC(__func__); KERNHIST_CALLED(armgichist);
 	struct cpu_info * const ci = curcpu();
 	struct armgic_softc * const sc = &armgic_softc;
 	const int old_ipl = ci->ci_cpl;
+	struct trapframe * const tf = arg;
+	
 #ifdef DIAGNOSTIC
 	const int old_mtx_count = ci->ci_mtx_count;
 	const int old_l_biglocks = ci->ci_curlwp->l_biglocks;
@@ -257,9 +285,14 @@ armgic_irq_handler(void *tf)
 	KASSERTMSG(old_ipl != IPL_HIGH, "old_ipl %d pmr %#x hppir %#x",
 	    old_ipl, gicc_read(sc, GICC_PMR), gicc_read(sc, GICC_HPPIR));
 
+	KERNHIST_LOG(armgichist, "old_ipl %d pmr %u hppir %u", old_ipl,
+	    gicc_read(sc, GICC_PMR), gicc_read(sc, GICC_HPPIR), 0);
+
 	for (;;) {
 		uint32_t iar = gicc_read(sc, GICC_IAR);
 		uint32_t irq = __SHIFTOUT(iar, GICC_IAR_IRQ);
+
+		KERNHIST_LOG(armgichist, "iar %#x (irq %d)", iar, irq, 0, 0);
 		if (irq == GICC_IAR_IRQ_SPURIOUS) {
 			iar = gicc_read(sc, GICC_IAR);
 			irq = __SHIFTOUT(iar, GICC_IAR_IRQ);
@@ -284,6 +317,9 @@ armgic_irq_handler(void *tf)
 		 * However, if are just raising ipl, we can just update ci_cpl.
 		 */
 		const int ipl = is->is_ipl;
+
+		KERNHIST_LOG(armgichist, "ipl %d vs ci_cpl %d pmr %#x", ipl,
+		    ci->ci_cpl, gicc_read(sc, GICC_PMR), 0);
 		if (__predict_false(ipl < ci->ci_cpl)) {
 			pic_do_pending_ints(I32_bit, ipl, tf);
 			KASSERT(ci->ci_cpl == ipl);
@@ -310,14 +346,18 @@ armgic_irq_handler(void *tf)
 	 */
 	KASSERT(old_ipl != IPL_HIGH);
 	pic_do_pending_ints(I32_bit, old_ipl, tf);
-	KASSERTMSG(ci->ci_cpl == old_ipl, "ci_cpl %d old_ipl %d", ci->ci_cpl, old_ipl);
+	KASSERTMSG(ci->ci_cpl == old_ipl, "ci_cpl %d old_ipl %d", ci->ci_cpl,
+	    old_ipl);
 	KASSERT(old_mtx_count == ci->ci_mtx_count);
 	KASSERT(old_l_biglocks == ci->ci_curlwp->l_biglocks);
+
+	KERNHIST_LOG(armgichist, "... done", 0, 0, 0, 0);
 }
 
 void
 armgic_establish_irq(struct pic_softc *pic, struct intrsource *is)
 {
+    	KERNHIST_FUNC(__func__); KERNHIST_CALLED(armgichist);
 	struct armgic_softc * const sc = PICTOSOFTC(pic);
 	const size_t group = is->is_irq / 32;
 	const u_int irq = is->is_irq & 31;
@@ -365,6 +405,9 @@ armgic_establish_irq(struct pic_softc *p
 		}
 		if (new_cfg != cfg) {
 			gicd_write(sc, cfg_reg, new_cfg);
+
+			KERNHIST_LOG(armgichist, "irq %u: cfg changed from %#x "
+			    "to %#x", is->is_irq, cfg, new_cfg, 0);
 		}
 #ifdef MULTIPROCESSOR
 	} else {
@@ -462,6 +505,7 @@ armgic_cpu_init(struct pic_softc *pic, s
 void
 armgic_ipi_send(struct pic_softc *pic, const kcpuset_t *kcp, u_long ipi)
 {
+    	KERNHIST_FUNC(__func__); KERNHIST_CALLED(armgichist);
 	struct armgic_softc * const sc = PICTOSOFTC(pic);
 
 #if 0
@@ -484,6 +528,7 @@ armgic_ipi_send(struct pic_softc *pic, c
 	}
 
 	gicd_write(sc, GICD_SGIR, sgir);
+	KERNHIST_LOG(armgichist, "... done (%#x)", sgir, 0, 0, 0);
 }
 #endif
 
@@ -505,6 +550,13 @@ armgic_attach(device_t parent, device_t 
 {
 	struct armgic_softc * const sc = &armgic_softc;
 	struct mpcore_attach_args * const mpcaa = aux;
+#ifdef KERNHIST
+	static ONCE_DECL(armgic_once);
+
+	RUN_ONCE(&armgic_once, armgichist_init);
+#endif
+
+    	KERNHIST_FUNC(__func__); KERNHIST_CALLED(armgichist);
 
 	sc->sc_dev = self;
 	self->dv_private = sc;

Reply via email to