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 <pab...@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


Reply via email to