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.
This commit is contained in:
Justin Hibbits 2019-06-10 03:24:38 +00:00
parent f433dab2de
commit fdb916d53e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348845

View File

@ -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);