Allow the caller to set GEDE, GEBS and raw data. This can be
useful if one wants to replicate a CPER with the same parameters
as the original one.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
---
scripts/qmp_helper.py | 69 ++++++++++++++++++++++++++++++++++---------
1 file changed, 55 insertions(+), 14 deletions(-)
diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py
index d37fb0ae11cc..ac3abc794c69 100755
--- a/scripts/qmp_helper.py
+++ b/scripts/qmp_helper.py
@@ -551,22 +551,11 @@ def send_cper_raw(self, cper_data):
return False
- def send_cper(self, notif_type, payload):
+ def get_gede(self, notif_type, cper_length):
"""
- Send commands to QEMU though QMP TCP socket.
-
- Return True on success, False otherwise.
+ Return a Generic Error Data Entry bytearray
"""
- # Fill CPER record header
-
- # NOTE: bits 4 to 13 of block status contain the number of
- # data entries in the data section. This is currently unsupported.
-
- cper_length = len(payload)
- data_length = cper_length + len(self.raw_data) + self.GENERIC_DATA_SIZE
-
- # Generic Error Data Entry
gede = bytearray()
gede.extend(notif_type.to_bytes())
@@ -579,7 +568,13 @@ def send_cper(self, notif_type, payload):
gede.extend(self.fru_text)
gede.extend(self.timestamp)
- # Generic Error Status Block
+ return gede
+
+ def get_gebs(self, data_length):
+ """
+ Return a Generic Error Status Block bytearray
+ """
+
gebs = bytearray()
if self.raw_data:
@@ -593,6 +588,52 @@ def send_cper(self, notif_type, payload):
util.data_add(gebs, data_length, 4)
util.data_add(gebs, self.error_severity, 4)
+ return gebs
+
+ def send_cper(self, notif_type, payload,
+ gede=None, gebs=None, raw_data=None):
+ """
+ Send commands to QEMU though QMP TCP socket.
+
+ Return True on success, False otherwise.
+
+ Arguments:
+ notif_type: Notification type (GUID)
+ payload: bytearray with the payload
+ gede: Generic Error Data Entry. If None, the code will generate
+ one using the defaults and generic error data arguments
+ gebs: Generic Error Status block. If None, the code will generate
+ one using the defaults and generic error data arguments
+ raw_data: Raw data to be added after GEBS. If not specified,
+ the code will generate one if Generic Error Data
+ --raw-data parameter is specified.
+ """
+
+ # Fill CPER record header
+
+ # NOTE: bits 4 to 13 of block status contain the number of
+ # data entries in the data section. This is currently unsupported.
+
+ if raw_data:
+ self.raw_data = raw_data
+
+ cper_length = len(payload)
+ data_length = cper_length + len(self.raw_data) + self.GENERIC_DATA_SIZE
+
+ if gede and len(gede) != 72:
+ print(f"Invalid Generic Error Data Entry length: {len(gede)}. Ignoring it")
+ gede = None
+
+ if gebs and len(gebs) != 20:
+ print(f"Invalid Generic Error Status Block length: {len(gebs)}. Ignoring it")
+ gebs = None
+
+ if not gede:
+ gede = self.get_gede(notif_type, cper_length)
+
+ if not gebs:
+ gebs = self.get_gebs(data_length)
+
cper_data = bytearray()
cper_data.extend(gebs)
cper_data.extend(gede)
--
2.52.0