svn commit: r348845 - head/sys/powerpc/powernv
Justin Hibbits
jhibbits at FreeBSD.org
Mon Jun 10 03:24:40 UTC 2019
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);
More information about the svn-src-all
mailing list