[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 04/12] cxl/cdat: Fix header sum value in CDAT checksum
|
From: |
Jonathan Cameron |
|
Subject: |
[PATCH 04/12] cxl/cdat: Fix header sum value in CDAT checksum |
|
Date: |
Wed, 24 Jan 2024 12:40:52 +0000 |
From: Ira Weiny <ira.weiny@intel.com>
The addition of the DCD support for CXL type-3 devices extended the CDAT
table large enough that the checksum being returned was incorrect.[1]
This was because the checksum value was using the header length field
rather than each of the 4 bytes of the length field. This was
previously not seen because the length of the CDAT data was less than
256 thus resulting in an equivalent checksum value.
Properly calculate the checksum for the CDAT header.
[1]
https://lore.kernel.org/all/20231116-fix-cdat-devm-free-v1-1-b148b40707d7@intel.com/
Fixes: aba578bdace5 ("hw/cxl/cdat: CXL CDAT Data Object Exchange
implementation")
Cc: Huai-Cheng Kuo <hchkuo@avery-design.com.tw>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Fan Ni <fan.ni@samsung.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
Ammended buf naming to hdr_buf to avoid shadow issue with an existing buf
variable
with more limited scope.
---
hw/cxl/cxl-cdat.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/hw/cxl/cxl-cdat.c b/hw/cxl/cxl-cdat.c
index 24829cf242..2fea975671 100644
--- a/hw/cxl/cxl-cdat.c
+++ b/hw/cxl/cxl-cdat.c
@@ -49,6 +49,7 @@ static void ct3_build_cdat(CDATObject *cdat, Error **errp)
g_autofree CDATTableHeader *cdat_header = NULL;
g_autofree CDATEntry *cdat_st = NULL;
uint8_t sum = 0;
+ uint8_t *hdr_buf;
int ent, i;
/* Use default table if fopen == NULL */
@@ -95,8 +96,12 @@ static void ct3_build_cdat(CDATObject *cdat, Error **errp)
/* For now, no runtime updates */
cdat_header->sequence = 0;
cdat_header->length += sizeof(CDATTableHeader);
- sum += cdat_header->revision + cdat_header->sequence +
- cdat_header->length;
+
+ hdr_buf = (uint8_t *)cdat_header;
+ for (i = 0; i < sizeof(*cdat_header); i++) {
+ sum += hdr_buf[i];
+ }
+
/* Sum of all bytes including checksum must be 0 */
cdat_header->checksum = ~sum + 1;
--
2.39.2
- [PATCH 00/12 qemu] CXL emulation fixes and minor cleanup., Jonathan Cameron, 2024/01/24
- [PATCH 01/12] cxl/cdat: Handle cdat table build errors, Jonathan Cameron, 2024/01/24
- [PATCH 02/12] hw/mem/cxl_type3: Drop handling of failure of g_malloc0(), Jonathan Cameron, 2024/01/24
- [PATCH 03/12] hw/pci-bridge/cxl_upstream: Drop g_malloc0() failure handling, Jonathan Cameron, 2024/01/24
- [PATCH 04/12] cxl/cdat: Fix header sum value in CDAT checksum,
Jonathan Cameron <=
- [PATCH 05/12] hw/cxl/mbox: Remove dead code, Jonathan Cameron, 2024/01/24
- [PATCH 06/12] hw/cxl/device: read from register values in mdev_reg_read(), Jonathan Cameron, 2024/01/24
- [PATCH 07/12] hw/cxl: Pass CXLComponentState to cache_mem_ops, Jonathan Cameron, 2024/01/24
- [PATCH 08/12] hw/cxl: Pass NULL for a NULL MemoryRegionOps, Jonathan Cameron, 2024/01/24
- [PATCH 09/12] hw/mem/cxl_type3: Fix potential divide by zero reported by coverity, Jonathan Cameron, 2024/01/24