On 2025/4/15 0:38, Cornelia Huck wrote:
+/*
+ * decode_idreg_writemap: Generate props for writable fields
+ *
+ * @obj: CPU object
+ * @index: index of the sysreg
+ * @map: writable map for the sysreg
+ * @reg: description of the sysreg
+ */
+static int
+decode_idreg_writemap(Object *obj, int index, uint64_t map, ARM64SysReg *reg)
+{
+ int i = ctz64(map);
+ int nb_sysreg_props = 0;
+
+ while (map) {
+
+ ARM64SysRegField *field = get_field(i, reg);
+ int lower, upper;
+ uint64_t mask;
+ char *prop_name;
+
+ if (!field) {
+ /* the field cannot be matched to any know id named field */
+ warn_report("%s bit %d of %s is writable but cannot be matched",
+ __func__, i, reg->name);
+ warn_report("%s is cpu-sysreg-properties.c up to date?", __func__);
+ map = map & ~BIT_ULL(i);
+ i = ctz64(map);
+ continue;
+ }
+ lower = field->lower;
+ upper = field->upper;
+ prop_name = g_strdup_printf("SYSREG_%s_%s", reg->name, field->name);
+ trace_decode_idreg_writemap(field->name, lower, upper, prop_name);
+ object_property_add(obj, prop_name, "uint64",
+ get_sysreg_prop, set_sysreg_prop, NULL, field);
+ nb_sysreg_props++;
+
+ mask = MAKE_64BIT_MASK(lower, upper - lower + 1);
+ map = map & ~mask;
+ i = ctz64(map);
+ }
+ trace_nb_sysreg_props(reg->name, nb_sysreg_props);
+ return 0;
+}
+
Hi,
There's a small issue here: the memory for `prop_name` has not been
freed. The memory allocated by `g_strdup_printf` needs to be released
using `g_free`.
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index 1f69efe922..af39729fe0 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -446,6 +446,8 @@ decode_idreg_writemap(Object *obj, int index,
uint64_t map, ARM64SysReg *reg)
mask = MAKE_64BIT_MASK(lower, upper - lower + 1);
map = map & ~mask;
i = ctz64(map);
+
+ g_free(prop_name);
}
trace_nb_sysreg_props(reg->name, nb_sysreg_props);
return 0;
--
Thanks,
Jinqian