On Fri, 20 Sep 2019 15:43:47 +0800
Tao Xu <tao3...@intel.com> wrote:
From: Liu Jingqi <jingqi....@intel.com>
This structure describes the memory access latency and bandwidth
information from various memory access initiator proximity domains.
The latency and bandwidth numbers represented in this structure
correspond to rated latency and bandwidth for the platform.
The software could use this information as hint for optimization.
Signed-off-by: Liu Jingqi <jingqi....@intel.com>
Signed-off-by: Tao Xu <tao3...@intel.com>
---
Changes in v12:
- Fix a bug that if HMAT is enabled and without hmat-lb setting,
QEMU will crash. (reported by Danmei Wei)
Changes in v11:
- Calculate base in build_hmat_lb().
---
hw/acpi/hmat.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++-
hw/acpi/hmat.h | 2 +
2 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
index 1368fce7ee..e7be849581 100644
--- a/hw/acpi/hmat.c
+++ b/hw/acpi/hmat.c
@@ -27,6 +27,7 @@
#include "qemu/osdep.h"
#include "sysemu/numa.h"
#include "hw/acpi/hmat.h"
+#include "qemu/error-report.h"
/*
* ACPI 6.3:
@@ -67,11 +68,105 @@ static void build_hmat_mpda(GArray *table_data, uint16_t
flags, int initiator,
build_append_int_noprefix(table_data, 0, 8);
}
+static bool entry_overflow(uint64_t *lb_data, uint64_t base, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++) {
+ if (lb_data[i] / base >= UINT16_MAX) {
+ return true;
+ }
+ }
+
+ return false;
+}
I suggest to do this check at CLI parsing time
+/*
+ * ACPI 6.3: 5.2.27.4 System Locality Latency and Bandwidth Information
+ * Structure: Table 5-146
+ */
+static void build_hmat_lb(GArray *table_data, HMAT_LB_Info *hmat_lb,
+ uint32_t num_initiator, uint32_t num_target,
+ uint32_t *initiator_list, int type)
+{
+ uint8_t mask = 0x0f;
+ uint32_t s = num_initiator;
+ uint32_t t = num_target;
drop this locals and use arguments directly
+ uint64_t base = 1;
+ uint64_t *lb_data;
+ int i, unit;
+
+ /* Type */
+ build_append_int_noprefix(table_data, 1, 2);
+ /* Reserved */
+ build_append_int_noprefix(table_data, 0, 2);
+ /* Length */
+ build_append_int_noprefix(table_data, 32 + 4 * s + 4 * t + 2 * s * t, 4);
^^^^
to me above looks like /dev/random output, absolutely unreadable.
Suggest to use local var (like: lb_length) for expression with comments
beside magic numbers.
+ /* Flags: Bits [3:0] Memory Hierarchy, Bits[7:4] Reserved */
+ build_append_int_noprefix(table_data, hmat_lb->hierarchy & mask, 1);
why do you need to use mask here?