virtio: Fix handling of feature bits >= 32
authorsf <sf@openbsd.org>
Sat, 2 Dec 2023 10:01:35 +0000 (10:01 +0000)
committersf <sf@openbsd.org>
Sat, 2 Dec 2023 10:01:35 +0000 (10:01 +0000)
Fix handling of feature bits >= 32.  This does not yet affect any driver
as no high feature bit besides VERSION_1 is used, and that one has
special handling.

Also, with VIRTIO_DEBUG, simply walk through all transport and device
feature names, so that we don't need to adjust the if clause whenever
the standard introduces new transport features.

ok jan@ bluhm@

sys/dev/pv/virtio.c
sys/dev/pv/virtiovar.h

index e9be61c..53e27e2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: virtio.c,v 1.23 2023/07/07 10:23:39 patrick Exp $     */
+/*     $OpenBSD: virtio.c,v 1.24 2023/12/02 10:01:35 sf Exp $  */
 /*     $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */
 
 /*
@@ -97,7 +97,7 @@ virtio_log_features(uint64_t host, uint64_t neg,
        const struct virtio_feature_name *namep;
        int i;
        char c;
-       uint32_t bit;
+       uint64_t bit;
 
        for (i = 0; i < 64; i++) {
                if (i == 30) {
@@ -107,13 +107,17 @@ virtio_log_features(uint64_t host, uint64_t neg,
                         */
                        continue;
                }
-               bit = 1 << i;
+               bit = 1ULL << i;
                if ((host&bit) == 0)
                        continue;
-               namep = (i < 24 || i > 37) ? guest_feature_names :
-                   transport_feature_names;
+               namep = guest_feature_names;
                while (namep->bit && namep->bit != bit)
                        namep++;
+               if (namep->name == NULL) {
+                       namep = transport_feature_names;
+                       while (namep->bit && namep->bit != bit)
+                               namep++;
+               }
                c = (neg&bit) ? '+' : '-';
                if (namep->name)
                        printf(" %c%s", c, namep->name);
index 7f2aea7..d12cb2c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: virtiovar.h,v 1.15 2023/07/07 10:23:39 patrick Exp $  */
+/*     $OpenBSD: virtiovar.h,v 1.16 2023/12/02 10:01:35 sf Exp $       */
 /*     $NetBSD: virtiovar.h,v 1.1 2011/10/30 12:12:21 hannken Exp $    */
 
 /*
@@ -138,7 +138,7 @@ struct virtqueue {
 };
 
 struct virtio_feature_name {
-       uint32_t         bit;
+       uint64_t         bit;
        const char      *name;
 };
 
@@ -203,7 +203,7 @@ struct virtio_softc {
 #define        virtio_device_reset(sc)                 virtio_set_status((sc), 0)
 
 static inline int
-virtio_has_feature(struct virtio_softc *sc, unsigned int fbit)
+virtio_has_feature(struct virtio_softc *sc, uint64_t fbit)
 {
        if (sc->sc_active_features & fbit)
                return 1;