aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/virtio/virtio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/virtio/virtio.c')
-rw-r--r--sys/dev/virtio/virtio.c57
1 files changed, 37 insertions, 20 deletions
diff --git a/sys/dev/virtio/virtio.c b/sys/dev/virtio/virtio.c
index 18eace65a12b..53b47004610e 100644
--- a/sys/dev/virtio/virtio.c
+++ b/sys/dev/virtio/virtio.c
@@ -119,24 +119,15 @@ virtio_feature_name(uint64_t val, struct virtio_feature_desc *desc)
return (NULL);
}
-void
-virtio_describe(device_t dev, const char *msg,
- uint64_t features, struct virtio_feature_desc *desc)
+int
+virtio_describe_sbuf(struct sbuf *sb, uint64_t features,
+ struct virtio_feature_desc *desc)
{
- struct sbuf sb;
- uint64_t val;
- char *buf;
const char *name;
+ uint64_t val;
int n;
- if ((buf = malloc(1024, M_TEMP, M_NOWAIT)) == NULL) {
- device_printf(dev, "%s features: %#jx\n",
- msg, (uintmax_t) features);
- return;
- }
-
- sbuf_new(&sb, buf, 1024, SBUF_FIXEDLEN);
- sbuf_printf(&sb, "%s features: %#jx", msg, (uintmax_t) features);
+ sbuf_printf(sb, "%#jx", (uintmax_t) features);
for (n = 0, val = 1ULL << 63; val != 0; val >>= 1) {
/*
@@ -147,25 +138,51 @@ virtio_describe(device_t dev, const char *msg,
continue;
if (n++ == 0)
- sbuf_cat(&sb, " <");
+ sbuf_cat(sb, " <");
else
- sbuf_cat(&sb, ",");
+ sbuf_cat(sb, ",");
name = virtio_feature_name(val, desc);
if (name == NULL)
- sbuf_printf(&sb, "%#jx", (uintmax_t) val);
+ sbuf_printf(sb, "%#jx", (uintmax_t) val);
else
- sbuf_cat(&sb, name);
+ sbuf_cat(sb, name);
}
if (n > 0)
- sbuf_cat(&sb, ">");
+ sbuf_cat(sb, ">");
- if (sbuf_finish(&sb) == 0)
+ return (sbuf_finish(sb));
+}
+
+void
+virtio_describe(device_t dev, const char *msg, uint64_t features,
+ struct virtio_feature_desc *desc)
+{
+ struct sbuf sb;
+ char *buf;
+ int error;
+
+ if ((buf = malloc(1024, M_TEMP, M_NOWAIT)) == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
+
+ sbuf_new(&sb, buf, 1024, SBUF_FIXEDLEN);
+ sbuf_printf(&sb, "%s features: ", msg);
+
+ error = virtio_describe_sbuf(&sb, features, desc);
+ if (error == 0)
device_printf(dev, "%s\n", sbuf_data(&sb));
sbuf_delete(&sb);
free(buf, M_TEMP);
+
+out:
+ if (error != 0) {
+ device_printf(dev, "%s features: %#jx\n", msg,
+ (uintmax_t) features);
+ }
}
uint64_t