Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Jun 2019 03:24:38 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r348845 - head/sys/powerpc/powernv
Message-ID:  <201906100324.x5A3OcM4010492@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Mon Jun 10 03:24:38 2019
New Revision: 348845
URL: https://svnweb.freebsd.org/changeset/base/348845

Log:
  powernv: Port HMI handler to use the message framework
  
  When an HMI occurs a message event also gets created with the details of the
  exception.  Hook into the messaging framework to retrieve the HMI message.
  Nothing is done with it yet, except to panic on unhandled exception.

Modified:
  head/sys/powerpc/powernv/opal_hmi.c

Modified: head/sys/powerpc/powernv/opal_hmi.c
==============================================================================
--- head/sys/powerpc/powernv/opal_hmi.c	Mon Jun 10 03:16:55 2019	(r348844)
+++ head/sys/powerpc/powernv/opal_hmi.c	Mon Jun 10 03:24:38 2019	(r348845)
@@ -28,8 +28,10 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/types.h>
+#include <sys/eventhandler.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
+#include <sys/endian.h>
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
@@ -38,6 +40,47 @@ __FBSDID("$FreeBSD$");
 #include <machine/trap.h>
 #include "opal.h"
 
+struct opal_hmi_event {
+	uint8_t 	version;
+	uint8_t 	severity;
+	uint8_t 	type;
+	uint8_t 	disposition;
+	uint8_t 	rsvd_1[4];
+	uint64_t	hmer;
+	uint64_t	tfmr;
+	union {
+		struct {
+			uint8_t 	xstop_type;
+			uint8_t 	rsvd_2[3];
+			uint32_t	xstop_reason;
+			union {
+				uint32_t	pir;
+				uint32_t	chip_id;
+			};
+		};
+	};
+};
+
+#define	HMI_DISP_RECOVERED	0
+#define	HMI_DISP_NOT_RECOVERED	1
+
+static void
+opal_hmi_event_handler(void *unused, struct opal_msg *msg)
+{
+	struct opal_hmi_event	evt;
+
+	memcpy(&evt, &msg->params, sizeof(evt));
+	printf("Hypervisor Maintenance Event received"
+	    "(Severity %d, type %d, HMER: %016lx).\n",
+	    evt.severity, evt.type, evt.hmer);
+
+	if (evt.disposition == HMI_DISP_NOT_RECOVERED)
+		panic("Unrecoverable hypervisor maintenance exception on CPU %d",
+		    evt.pir);
+
+	return;
+}
+
 static int
 opal_hmi_handler(struct trapframe *frame)
 {
@@ -69,8 +112,11 @@ opal_setup_hmi(void *data)
 		return;
 	}
 
+	EVENTHANDLER_REGISTER(OPAL_HMI_EVT, opal_hmi_event_handler, NULL,
+	    EVENTHANDLER_PRI_ANY);
+
 	if (bootverbose)
 		printf("Installed OPAL HMI handler.\n");
 }
 
-SYSINIT(opal_setup_hmi, SI_SUB_HYPERVISOR, SI_ORDER_ANY, opal_setup_hmi, NULL);
+SYSINIT(opal_setup_hmi, SI_SUB_CPU, SI_ORDER_ANY, opal_setup_hmi, NULL);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906100324.x5A3OcM4010492>