Virtio features extend above the 64 bit space, and GSO over
UDP tunnels support is going to use some bits in the extended
space.
Introduce a new Property type to handle the extended feature
defined in the previous patch.
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
hw/core/qdev-properties.c | 46 ++++++++++++++++++++++++++++++++++++
include/hw/qdev-properties.h | 13 ++++++++++
2 files changed, 59 insertions(+)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 147b3ffd16..2a0182479c 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -225,6 +225,52 @@ const PropertyInfo qdev_prop_bit64 = {
.set_default_value = set_default_value_bool,
};
+/* Bit virtio features __int128_t */
+#ifdef CONFIG_INT128
+static void vf_prop_set(Object *obj, const Property *props, bool val)
+{
+ __int128_t *vf = object_field_prop_ptr(obj, props);
+ assert(props->info == &qdev_prop_bitvf);
+ if (val) {
+ *vf |= (__int128_t)1 << props->bitnr;
+ } else {
+ *vf &= ~((__int128_t)1 << props->bitnr);
+ }
+}
+
+static void prop_get_bitvf(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ const Property *prop = opaque;
+ __int128_t *vf = object_field_prop_ptr(obj, prop);
+ bool value;
+
+ assert(prop->info == &qdev_prop_bitvf);
+ value = *vf & ((__int128_t)1 << prop->bitnr);
+ visit_type_bool(v, name, &value, errp);
+}
+
+static void prop_set_bitvf(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ const Property *prop = opaque;
+ bool value;
+
+ if (!visit_type_bool(v, name, &value, errp)) {
+ return;
+ }
+ vf_prop_set(obj, prop, value);
+}
+
+const PropertyInfo qdev_prop_bitvf = {
+ .type = "bool",
+ .description = "on/off",
+ .get = prop_get_bitvf,
+ .set = prop_set_bitvf,
+ .set_default_value = set_default_value_bool,
+};
+#endif
+
/* --- bool --- */
static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 2c99856caa..7760dd6dbd 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -100,6 +100,19 @@ extern const PropertyInfo qdev_prop_link;
.set_default = true, \
.defval.u = (bool)_defval)
+#ifdef CONFIG_INT128
+extern const PropertyInfo qdev_prop_bitvf;
+
+#define DEFINE_PROP_BITVF(_name, _state, _field, _bit, _defval) \
+ DEFINE_PROP(_name, _state, _field, qdev_prop_bitvf, \
+ virtio_features_t, \
+ .bitnr = (_bit), \
+ .set_default = true, \
+ .defval.u = (bool)_defval)
+#else
+#define qdev_prop_bitvf qdev_prop_bit64
+#endif
+
#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \
DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \
.set_default = true, \
--
2.49.0