On Sat, Jan 19, 2019 at 05:37:30PM +0100, Stefan Fritsch wrote: > virtio 1.0 supports an arbitrary number of feature bits. However, so far > no more than 64 are used (compared to 32 in virtio 0.9). Adjust data > types to support 64 feature bits. > > Later, we may want to use bitmaps and setbit(), ... to support even more > feature bits. > --- > sys/dev/fdt/virtio_mmio.c | 8 ++++---- > sys/dev/pci/virtio_pci.c | 8 ++++---- > sys/dev/pv/if_vio.c | 40 +++++++++++++++++++-------------------- > sys/dev/pv/vioblk.c | 2 +- > sys/dev/pv/vioblkreg.h | 18 +++++++++--------- > sys/dev/pv/viocon.c | 6 +++--- > sys/dev/pv/viomb.c | 4 ++-- > sys/dev/pv/vioscsireg.h | 4 ++-- > sys/dev/pv/virtio.c | 6 +++--- > sys/dev/pv/virtioreg.h | 10 +++++----- > sys/dev/pv/virtiovar.h | 6 +++--- > sys/dev/pv/vmmci.c | 8 ++++---- > 12 files changed, 60 insertions(+), 60 deletions(-) >
ok mlarkin > diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c > index 3a74e647c19..2d7a131125d 100644 > --- a/sys/dev/fdt/virtio_mmio.c > +++ b/sys/dev/fdt/virtio_mmio.c > @@ -91,7 +91,7 @@ void > virtio_mmio_write_device_config_8(struct virtio_softc *, int, uint64_t); > uint16_t virtio_mmio_read_queue_size(struct virtio_softc *, uint16_t); > void virtio_mmio_setup_queue(struct virtio_softc *, struct virtqueue > *, uint64_t); > void virtio_mmio_set_status(struct virtio_softc *, int); > -uint32_t virtio_mmio_negotiate_features(struct virtio_softc *, uint32_t, > +uint64_t virtio_mmio_negotiate_features(struct virtio_softc *, uint64_t, > const struct virtio_feature_name > *); > int virtio_mmio_intr(void *); > > @@ -300,12 +300,12 @@ virtio_mmio_detach(struct device *self, int flags) > * Prints available / negotiated features if guest_feature_names != NULL and > * VIRTIO_DEBUG is 1 > */ > -uint32_t > -virtio_mmio_negotiate_features(struct virtio_softc *vsc, uint32_t > guest_features, > +uint64_t > +virtio_mmio_negotiate_features(struct virtio_softc *vsc, uint64_t > guest_features, > const struct virtio_feature_name *guest_feature_names) > { > struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; > - uint32_t host, neg; > + uint64_t host, neg; > > /* > * indirect descriptors can be switched off by setting bit 1 in the > diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c > index d1ab7481df6..97e5607a55e 100644 > --- a/sys/dev/pci/virtio_pci.c > +++ b/sys/dev/pci/virtio_pci.c > @@ -66,7 +66,7 @@ void virtio_pci_write_device_config_8(struct > virtio_softc *, int, uint64_t); > uint16_t virtio_pci_read_queue_size(struct virtio_softc *, uint16_t); > void virtio_pci_setup_queue(struct virtio_softc *, struct virtqueue > *, uint64_t); > void virtio_pci_set_status(struct virtio_softc *, int); > -uint32_t virtio_pci_negotiate_features(struct virtio_softc *, uint32_t, > +uint64_t virtio_pci_negotiate_features(struct virtio_softc *, uint64_t, > const struct virtio_feature_name > *); > int virtio_pci_msix_establish(struct virtio_pci_softc *, struct > pci_attach_args *, int, int (*)(void *), void *); > int virtio_pci_setup_msix(struct virtio_pci_softc *, struct > pci_attach_args *, int); > @@ -317,12 +317,12 @@ virtio_pci_detach(struct device *self, int flags) > * Prints available / negotiated features if guest_feature_names != NULL and > * VIRTIO_DEBUG is 1 > */ > -uint32_t > -virtio_pci_negotiate_features(struct virtio_softc *vsc, uint32_t > guest_features, > +uint64_t > +virtio_pci_negotiate_features(struct virtio_softc *vsc, uint64_t > guest_features, > const struct virtio_feature_name *guest_feature_names) > { > struct virtio_pci_softc *sc = (struct virtio_pci_softc *)vsc; > - uint32_t host, neg; > + uint64_t host, neg; > > /* > * indirect descriptors can be switched off by setting bit 1 in the > diff --git a/sys/dev/pv/if_vio.c b/sys/dev/pv/if_vio.c > index d79935ca512..a4cd80af62d 100644 > --- a/sys/dev/pv/if_vio.c > +++ b/sys/dev/pv/if_vio.c > @@ -68,25 +68,25 @@ > #define VIRTIO_NET_CONFIG_STATUS 6 /* 16bit */ > > /* Feature bits */ > -#define VIRTIO_NET_F_CSUM (1<<0) > -#define VIRTIO_NET_F_GUEST_CSUM (1<<1) > -#define VIRTIO_NET_F_MAC (1<<5) > -#define VIRTIO_NET_F_GSO (1<<6) > -#define VIRTIO_NET_F_GUEST_TSO4 (1<<7) > -#define VIRTIO_NET_F_GUEST_TSO6 (1<<8) > -#define VIRTIO_NET_F_GUEST_ECN (1<<9) > -#define VIRTIO_NET_F_GUEST_UFO (1<<10) > -#define VIRTIO_NET_F_HOST_TSO4 (1<<11) > -#define VIRTIO_NET_F_HOST_TSO6 (1<<12) > -#define VIRTIO_NET_F_HOST_ECN (1<<13) > -#define VIRTIO_NET_F_HOST_UFO (1<<14) > -#define VIRTIO_NET_F_MRG_RXBUF (1<<15) > -#define VIRTIO_NET_F_STATUS (1<<16) > -#define VIRTIO_NET_F_CTRL_VQ (1<<17) > -#define VIRTIO_NET_F_CTRL_RX (1<<18) > -#define VIRTIO_NET_F_CTRL_VLAN (1<<19) > -#define VIRTIO_NET_F_CTRL_RX_EXTRA (1<<20) > -#define VIRTIO_NET_F_GUEST_ANNOUNCE (1<<21) > +#define VIRTIO_NET_F_CSUM (1ULL<<0) > +#define VIRTIO_NET_F_GUEST_CSUM (1ULL<<1) > +#define VIRTIO_NET_F_MAC (1ULL<<5) > +#define VIRTIO_NET_F_GSO (1ULL<<6) > +#define VIRTIO_NET_F_GUEST_TSO4 (1ULL<<7) > +#define VIRTIO_NET_F_GUEST_TSO6 (1ULL<<8) > +#define VIRTIO_NET_F_GUEST_ECN (1ULL<<9) > +#define VIRTIO_NET_F_GUEST_UFO (1ULL<<10) > +#define VIRTIO_NET_F_HOST_TSO4 (1ULL<<11) > +#define VIRTIO_NET_F_HOST_TSO6 (1ULL<<12) > +#define VIRTIO_NET_F_HOST_ECN (1ULL<<13) > +#define VIRTIO_NET_F_HOST_UFO (1ULL<<14) > +#define VIRTIO_NET_F_MRG_RXBUF (1ULL<<15) > +#define VIRTIO_NET_F_STATUS (1ULL<<16) > +#define VIRTIO_NET_F_CTRL_VQ (1ULL<<17) > +#define VIRTIO_NET_F_CTRL_RX (1ULL<<18) > +#define VIRTIO_NET_F_CTRL_VLAN (1ULL<<19) > +#define VIRTIO_NET_F_CTRL_RX_EXTRA (1ULL<<20) > +#define VIRTIO_NET_F_GUEST_ANNOUNCE (1ULL<<21) > > /* > * Config(8) flags. The lowest byte is reserved for generic virtio stuff. > @@ -507,7 +507,7 @@ vio_attach(struct device *parent, struct device *self, > void *aux) > { > struct vio_softc *sc = (struct vio_softc *)self; > struct virtio_softc *vsc = (struct virtio_softc *)parent; > - uint32_t features; > + uint64_t features; > int i; > struct ifnet *ifp = &sc->sc_ac.ac_if; > > diff --git a/sys/dev/pv/vioblk.c b/sys/dev/pv/vioblk.c > index 061043e8796..fc46e52c09c 100644 > --- a/sys/dev/pv/vioblk.c > +++ b/sys/dev/pv/vioblk.c > @@ -168,7 +168,7 @@ vioblk_attach(struct device *parent, struct device *self, > void *aux) > struct vioblk_softc *sc = (struct vioblk_softc *)self; > struct virtio_softc *vsc = (struct virtio_softc *)parent; > struct scsibus_attach_args saa; > - uint32_t features; > + uint64_t features; > int qsize; > > vsc->sc_vqs = &sc->sc_vq[0]; > diff --git a/sys/dev/pv/vioblkreg.h b/sys/dev/pv/vioblkreg.h > index 754f2bb9793..dbfa37e60ea 100644 > --- a/sys/dev/pv/vioblkreg.h > +++ b/sys/dev/pv/vioblkreg.h > @@ -40,15 +40,15 @@ > #define VIRTIO_BLK_CONFIG_BLK_SIZE 20 /* 32bit */ > > /* Feature bits */ > -#define VIRTIO_BLK_F_BARRIER (1<<0) > -#define VIRTIO_BLK_F_SIZE_MAX (1<<1) > -#define VIRTIO_BLK_F_SEG_MAX (1<<2) > -#define VIRTIO_BLK_F_GEOMETRY (1<<4) > -#define VIRTIO_BLK_F_RO (1<<5) > -#define VIRTIO_BLK_F_BLK_SIZE (1<<6) > -#define VIRTIO_BLK_F_SCSI (1<<7) > -#define VIRTIO_BLK_F_FLUSH (1<<9) > -#define VIRTIO_BLK_F_TOPOLOGY (1<<10) > +#define VIRTIO_BLK_F_BARRIER (1ULL<<0) > +#define VIRTIO_BLK_F_SIZE_MAX (1ULL<<1) > +#define VIRTIO_BLK_F_SEG_MAX (1ULL<<2) > +#define VIRTIO_BLK_F_GEOMETRY (1ULL<<4) > +#define VIRTIO_BLK_F_RO (1ULL<<5) > +#define VIRTIO_BLK_F_BLK_SIZE (1ULL<<6) > +#define VIRTIO_BLK_F_SCSI (1ULL<<7) > +#define VIRTIO_BLK_F_FLUSH (1ULL<<9) > +#define VIRTIO_BLK_F_TOPOLOGY (1ULL<<10) > > /* Command */ > #define VIRTIO_BLK_T_IN 0 > diff --git a/sys/dev/pv/viocon.c b/sys/dev/pv/viocon.c > index cdd547ac33c..ed73152bbdd 100644 > --- a/sys/dev/pv/viocon.c > +++ b/sys/dev/pv/viocon.c > @@ -30,9 +30,9 @@ > > > /* features */ > -#define VIRTIO_CONSOLE_F_SIZE (1<<0) > -#define VIRTIO_CONSOLE_F_MULTIPORT (1<<1) > -#define VIRTIO_CONSOLE_F_EMERG_WRITE (1<<2) > +#define VIRTIO_CONSOLE_F_SIZE (1ULL<<0) > +#define VIRTIO_CONSOLE_F_MULTIPORT (1ULL<<1) > +#define VIRTIO_CONSOLE_F_EMERG_WRITE (1ULL<<2) > > /* config space */ > #define VIRTIO_CONSOLE_COLS 0 /* 16 bits */ > diff --git a/sys/dev/pv/viomb.c b/sys/dev/pv/viomb.c > index 1c380358827..3be83eed562 100644 > --- a/sys/dev/pv/viomb.c > +++ b/sys/dev/pv/viomb.c > @@ -68,8 +68,8 @@ > #define VIRTIO_BALLOON_CONFIG_ACTUAL 4 /* 32bit */ > > /* Feature bits */ > -#define VIRTIO_BALLOON_F_MUST_TELL_HOST (1<<0) > -#define VIRTIO_BALLOON_F_STATS_VQ (1<<1) > +#define VIRTIO_BALLOON_F_MUST_TELL_HOST (1ULL<<0) > +#define VIRTIO_BALLOON_F_STATS_VQ (1ULL<<1) > > static const struct virtio_feature_name viomb_feature_names[] = { > #if VIRTIO_DEBUG > diff --git a/sys/dev/pv/vioscsireg.h b/sys/dev/pv/vioscsireg.h > index 4034309cef5..4f2a1f57b36 100644 > --- a/sys/dev/pv/vioscsireg.h > +++ b/sys/dev/pv/vioscsireg.h > @@ -28,8 +28,8 @@ > #define VIRTIO_SCSI_CONFIG_MAX_LUN 32 /* 32bit */ > > /* Feature bits */ > -#define VIRTIO_SCSI_F_INOUT (1<<0) > -#define VIRTIO_SCSI_F_HOTPLUG (1<<1) > +#define VIRTIO_SCSI_F_INOUT (1ULL<<0) > +#define VIRTIO_SCSI_F_HOTPLUG (1ULL<<1) > > /* Response status values */ > #define VIRTIO_SCSI_S_OK 0 > diff --git a/sys/dev/pv/virtio.c b/sys/dev/pv/virtio.c > index be81878642f..18b78927180 100644 > --- a/sys/dev/pv/virtio.c > +++ b/sys/dev/pv/virtio.c > @@ -84,7 +84,7 @@ static const struct virtio_feature_name > transport_feature_names[] = { > }; > > void > -virtio_log_features(uint32_t host, uint32_t neg, > +virtio_log_features(uint64_t host, uint64_t neg, > const struct virtio_feature_name *guest_feature_names) > { > const struct virtio_feature_name *namep; > @@ -92,7 +92,7 @@ virtio_log_features(uint32_t host, uint32_t neg, > char c; > uint32_t bit; > > - for (i = 0; i < 32; i++) { > + for (i = 0; i < 64; i++) { > if (i == 30) { > /* > * VIRTIO_F_BAD_FEATURE is only used for > @@ -103,7 +103,7 @@ virtio_log_features(uint32_t host, uint32_t neg, > bit = 1 << i; > if ((host&bit) == 0) > continue; > - namep = (i < 24) ? guest_feature_names : > + namep = (i < 24 || i > 37) ? guest_feature_names : > transport_feature_names; > while (namep->bit && namep->bit != bit) > namep++; > diff --git a/sys/dev/pv/virtioreg.h b/sys/dev/pv/virtioreg.h > index 2cc4af2b32d..36a505d2a48 100644 > --- a/sys/dev/pv/virtioreg.h > +++ b/sys/dev/pv/virtioreg.h > @@ -83,11 +83,11 @@ > #define PCI_PRODUCT_VIRTIO_VMMCI 65535 /* private id */ > > /* device-independent feature bits */ > -#define VIRTIO_F_NOTIFY_ON_EMPTY (1<<24) > -#define VIRTIO_F_RING_INDIRECT_DESC (1<<28) > -#define VIRTIO_F_RING_EVENT_IDX (1<<29) > -#define VIRTIO_F_BAD_FEATURE (1<<30) > -#define VIRTIO_F_VERSION_1 (1<<32) > +#define VIRTIO_F_NOTIFY_ON_EMPTY (1ULL<<24) > +#define VIRTIO_F_RING_INDIRECT_DESC (1ULL<<28) > +#define VIRTIO_F_RING_EVENT_IDX (1ULL<<29) > +#define VIRTIO_F_BAD_FEATURE (1ULL<<30) > +#define VIRTIO_F_VERSION_1 (1ULL<<32) > > /* device status bits */ > #define VIRTIO_CONFIG_DEVICE_STATUS_RESET 0 > diff --git a/sys/dev/pv/virtiovar.h b/sys/dev/pv/virtiovar.h > index 595c89b9a5d..4a52907a4a5 100644 > --- a/sys/dev/pv/virtiovar.h > +++ b/sys/dev/pv/virtiovar.h > @@ -151,7 +151,7 @@ struct virtio_ops { > uint16_t (*read_queue_size)(struct virtio_softc *, uint16_t); > void (*setup_queue)(struct virtio_softc *, struct virtqueue > *, uint64_t); > void (*set_status)(struct virtio_softc *, int); > - uint32_t (*neg_features)(struct virtio_softc *, uint32_t, const > struct virtio_feature_name *); > + uint64_t (*neg_features)(struct virtio_softc *, uint64_t, const > struct virtio_feature_name *); > int (*poll_intr)(void *); > }; > > @@ -164,7 +164,7 @@ struct virtio_softc { > > int sc_ipl; /* set by child */ > > - uint32_t sc_features; > + uint64_t sc_features; > int sc_indirect; > > int sc_nvqs; /* set by child */ > @@ -224,7 +224,7 @@ int virtio_start_vq_intr(struct virtio_softc *, struct > virtqueue *); > > const char *virtio_device_string(int); > #if VIRTIO_DEBUG > -void virtio_log_features(uint32_t, uint32_t, const struct > virtio_feature_name *); > +void virtio_log_features(uint64_t, uint64_t, const struct > virtio_feature_name *); > void virtio_vq_dump(struct virtqueue *vq); > #endif > int virtio_nused(struct virtqueue *vq); > diff --git a/sys/dev/pv/vmmci.c b/sys/dev/pv/vmmci.c > index ac44e542885..80ba1224e3b 100644 > --- a/sys/dev/pv/vmmci.c > +++ b/sys/dev/pv/vmmci.c > @@ -72,9 +72,9 @@ struct cfattach vmmci_ca = { > #define VMMCI_CONFIG_TIME_USEC 12 > > /* Feature bits */ > -#define VMMCI_F_TIMESYNC (1<<0) > -#define VMMCI_F_ACK (1<<1) > -#define VMMCI_F_SYNCRTC (1<<2) > +#define VMMCI_F_TIMESYNC (1ULL<<0) > +#define VMMCI_F_ACK (1ULL<<1) > +#define VMMCI_F_SYNCRTC (1ULL<<2) > > struct cfdriver vmmci_cd = { > NULL, "vmmci", DV_DULL > @@ -94,7 +94,7 @@ vmmci_attach(struct device *parent, struct device *self, > void *aux) > { > struct vmmci_softc *sc = (struct vmmci_softc *)self; > struct virtio_softc *vsc = (struct virtio_softc *)parent; > - uint32_t features; > + uint64_t features; > > if (vsc->sc_child != NULL) > panic("already attached to something else"); > -- > 2.19.0 >