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:
parent
f433dab2de
commit
fdb916d53e
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user