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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to