[PATCH 05/13] scripts/qmp_helper: fix raw_data logic

Mauro Carvalho Chehab posted 13 patches 2 weeks, 4 days ago
Maintainers: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>, John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>
There is a newer version of this series
[PATCH 05/13] scripts/qmp_helper: fix raw_data logic
Posted by Mauro Carvalho Chehab 2 weeks, 4 days ago
According with UEFI 6.4 spec Table 18.11 Generic Error Status Block:

Raw Data Offset:	Offset in bytes from the beginning of the
			Error Status Block to raw error data.
			The raw data must follow any Generic Error
			Data Entries.

Data Length:		Length in bytes of the generic error data.

So, basically, we have:

	+----------+                 /
	| GEBS     |                 |
	+----------+   /             |
        | GEDE     |   |             |
        | header   |   |             +--> raw data
	+----------+   +--> data     |    offset
        | GEDE     |   |    length   |
        | payload  |   |             |
	+----------+   /             /
	| Raw data |
	+----------+

where:

- raw data offset is relative to the beginning of GEBS;
- data length is only for GEDE header and payload.

Fix the code to handle it the expected way.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
 scripts/qmp_helper.py | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py
index 51c8ad92a39d..40059cd105f6 100755
--- a/scripts/qmp_helper.py
+++ b/scripts/qmp_helper.py
@@ -411,6 +411,7 @@ def _connect(self):
         "simulated":    util.bit(2),
     }
 
+    GENERIC_ERROR_STATUS_SIZE = 20
     GENERIC_DATA_SIZE = 72
 
     def argparse(parser):
@@ -551,7 +552,7 @@ def send_cper_raw(self, cper_data):
 
         return False
 
-    def get_gede(self, notif_type, cper_length):
+    def get_gede(self, notif_type, payload_length):
         """
         Return a Generic Error Data Entry bytearray
         """
@@ -563,22 +564,27 @@ def get_gede(self, notif_type, cper_length):
         util.data_add(gede, 0x300, 2)
         util.data_add(gede, self.validation_bits, 1)
         util.data_add(gede, self.flags, 1)
-        util.data_add(gede, cper_length, 4)
+        util.data_add(gede, payload_length, 4)
         gede.extend(self.fru_id)
         gede.extend(self.fru_text)
         gede.extend(self.timestamp)
 
         return gede
 
-    def get_gebs(self, data_length):
+    def get_gebs(self, payload_length):
         """
         Return a Generic Error Status Block bytearray
         """
 
+        data_length = payload_length
+        data_length += self.GENERIC_DATA_SIZE
+
         gebs = bytearray()
 
         if self.raw_data:
-            raw_data_offset = len(gebs)
+            raw_data_offset = payload_length
+            raw_data_offset += self.GENERIC_ERROR_STATUS_SIZE
+            raw_data_offset += self.GENERIC_DATA_SIZE
         else:
             raw_data_offset = 0
 
@@ -617,8 +623,7 @@ def send_cper(self, notif_type, payload,
         if raw_data:
             self.raw_data = raw_data
 
-        cper_length = len(payload)
-        data_length = cper_length + len(self.raw_data) + self.GENERIC_DATA_SIZE
+        payload_length = len(payload)
 
         if gede and len(gede) != 72:
             print(f"Invalid Generic Error Data Entry length: {len(gede)}. Ignoring it")
@@ -629,16 +634,16 @@ def send_cper(self, notif_type, payload,
             gebs = None
 
         if not gede:
-            gede = self.get_gede(notif_type, cper_length)
+            gede = self.get_gede(notif_type, payload_length)
 
         if not gebs:
-            gebs = self.get_gebs(data_length)
+            gebs = self.get_gebs(payload_length)
 
         cper_data = bytearray()
         cper_data.extend(gebs)
         cper_data.extend(gede)
-        cper_data.extend(bytearray(self.raw_data))
         cper_data.extend(bytearray(payload))
+        cper_data.extend(bytearray(self.raw_data))
 
         if self.debug:
             print(f"GUID: {notif_type}")
-- 
2.52.0
Re: [PATCH 05/13] scripts/qmp_helper: fix raw_data logic
Posted by Jonathan Cameron via qemu development 2 weeks, 4 days ago
On Wed, 21 Jan 2026 12:25:13 +0100
Mauro Carvalho Chehab <mchehab+huawei@kernel.org> wrote:

> According with UEFI 6.4 spec Table 18.11 Generic Error Status Block:
> 
> Raw Data Offset:	Offset in bytes from the beginning of the
> 			Error Status Block to raw error data.
> 			The raw data must follow any Generic Error
> 			Data Entries.
> 
> Data Length:		Length in bytes of the generic error data.
> 
> So, basically, we have:
> 
> 	+----------+                 /
> 	| GEBS     |                 |
> 	+----------+   /             |
>         | GEDE     |   |             |

Mix of tabs and spaces it seems.  Nice to tidy that up.

>         | header   |   |             +--> raw data
> 	+----------+   +--> data     |    offset
>         | GEDE     |   |    length   |
>         | payload  |   |             |
> 	+----------+   /             /
> 	| Raw data |
> 	+----------+
> 
> where:
> 
> - raw data offset is relative to the beginning of GEBS;
> - data length is only for GEDE header and payload.
> 
> Fix the code to handle it the expected way.

Maybe say what it did previously?

> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Code seems fine to me.
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>

> ---
>  scripts/qmp_helper.py | 23 ++++++++++++++---------
>  1 file changed, 14 insertions(+), 9 deletions(-)
> 
> diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py
> index 51c8ad92a39d..40059cd105f6 100755
> --- a/scripts/qmp_helper.py
> +++ b/scripts/qmp_helper.py
> @@ -411,6 +411,7 @@ def _connect(self):
>          "simulated":    util.bit(2),
>      }
>  
> +    GENERIC_ERROR_STATUS_SIZE = 20
>      GENERIC_DATA_SIZE = 72
>  
>      def argparse(parser):
> @@ -551,7 +552,7 @@ def send_cper_raw(self, cper_data):
>  
>          return False
>  
> -    def get_gede(self, notif_type, cper_length):
> +    def get_gede(self, notif_type, payload_length):
>          """
>          Return a Generic Error Data Entry bytearray
>          """
> @@ -563,22 +564,27 @@ def get_gede(self, notif_type, cper_length):
>          util.data_add(gede, 0x300, 2)
>          util.data_add(gede, self.validation_bits, 1)
>          util.data_add(gede, self.flags, 1)
> -        util.data_add(gede, cper_length, 4)
> +        util.data_add(gede, payload_length, 4)
>          gede.extend(self.fru_id)
>          gede.extend(self.fru_text)
>          gede.extend(self.timestamp)
>  
>          return gede
>  
> -    def get_gebs(self, data_length):
> +    def get_gebs(self, payload_length):
>          """
>          Return a Generic Error Status Block bytearray
>          """
>  
> +        data_length = payload_length
> +        data_length += self.GENERIC_DATA_SIZE
> +
>          gebs = bytearray()
>  
>          if self.raw_data:
> -            raw_data_offset = len(gebs)
> +            raw_data_offset = payload_length
> +            raw_data_offset += self.GENERIC_ERROR_STATUS_SIZE
> +            raw_data_offset += self.GENERIC_DATA_SIZE
>          else:
>              raw_data_offset = 0
>  
> @@ -617,8 +623,7 @@ def send_cper(self, notif_type, payload,
>          if raw_data:
>              self.raw_data = raw_data
>  
> -        cper_length = len(payload)
> -        data_length = cper_length + len(self.raw_data) + self.GENERIC_DATA_SIZE
> +        payload_length = len(payload)
>  
>          if gede and len(gede) != 72:
>              print(f"Invalid Generic Error Data Entry length: {len(gede)}. Ignoring it")
> @@ -629,16 +634,16 @@ def send_cper(self, notif_type, payload,
>              gebs = None
>  
>          if not gede:
> -            gede = self.get_gede(notif_type, cper_length)
> +            gede = self.get_gede(notif_type, payload_length)
>  
>          if not gebs:
> -            gebs = self.get_gebs(data_length)
> +            gebs = self.get_gebs(payload_length)
>  
>          cper_data = bytearray()
>          cper_data.extend(gebs)
>          cper_data.extend(gede)
> -        cper_data.extend(bytearray(self.raw_data))
>          cper_data.extend(bytearray(payload))
> +        cper_data.extend(bytearray(self.raw_data))
>  
>          if self.debug:
>              print(f"GUID: {notif_type}")