[Skiboot] [PATCH] hmi: Fix a bug where partial hmi event was reported to host.

Mahesh J Salgaonkar mahesh at linux.vnet.ibm.com
Tue Mar 22 21:19:27 AEDT 2016


From: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>

The current code sends partial hmi event (4 * 64bits instead of
5 * 64bits) to host. The last 64 bits contains chip id/pir info for
reporting checkstop events. This bug affects only checkstop events.

Host console o/p without this patch:

[  305.628283] Fatal Hypervisor Maintenance interrupt [Not recovered]
[  305.628341]  Error detail: Malfunction Alert
[  305.628388] 	HMER: 8040000000000000
[  305.628423] 	CPU PIR: 00000000
[  305.628458] 	[Unit: VSU] Logic core check stop


Host console o/p with this patch:

[  200.122883] Fatal Hypervisor Maintenance interrupt [Not recovered]
[  200.122941]  Error detail: Malfunction Alert
[  200.122986] 	HMER: 8040000000000000
[  200.123021] 	CPU PIR: 000008e8
[  200.123055] 	[Unit: VSU] Logic core check stop

Signed-off-by: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
---
 core/hmi.c |   15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/core/hmi.c b/core/hmi.c
index d2cca90..a934438 100644
--- a/core/hmi.c
+++ b/core/hmi.c
@@ -217,7 +217,7 @@ static struct lock hmi_lock = LOCK_UNLOCKED;
 
 static int queue_hmi_event(struct OpalHMIEvent *hmi_evt, int recover)
 {
-	uint64_t *hmi_data;
+	size_t num_params;
 
 	/* Don't queue up event if recover == -1 */
 	if (recover == -1)
@@ -230,16 +230,17 @@ static int queue_hmi_event(struct OpalHMIEvent *hmi_evt, int recover)
 		hmi_evt->disposition = OpalHMI_DISPOSITION_NOT_RECOVERED;
 
 	/*
-	 * V2 of struct OpalHMIEvent is of (4 * 64 bits) size and well packed
+	 * V2 of struct OpalHMIEvent is of (5 * 64 bits) size and well packed
 	 * structure. Hence use uint64_t pointer to pass entire structure
-	 * using 4 params in generic message format.
+	 * using 5 params in generic message format. Instead of hard coding
+	 * num_params divide the struct size by 8 bytes to get exact
+	 * num_params value.
 	 */
-	hmi_data = (uint64_t *)hmi_evt;
+	num_params = ALIGN_UP(sizeof(*hmi_evt), sizeof(u64)) / sizeof(u64);
 
 	/* queue up for delivery to host. */
-	return opal_queue_msg(OPAL_MSG_HMI_EVT, NULL, NULL,
-				hmi_data[0], hmi_data[1], hmi_data[2],
-				hmi_data[3]);
+	return _opal_queue_msg(OPAL_MSG_HMI_EVT, NULL, NULL,
+				num_params, (uint64_t *)hmi_evt);
 }
 
 static int is_capp_recoverable(int chip_id)



More information about the Skiboot mailing list