master
c 317 lines 12 KB
Raw
1 /*
2 * HMP commands related to virtio
3 *
4 * This work is licensed under the terms of the GNU GPL, version 2 or
5 * (at your option) any later version.
6 */
7
8 #include "qemu/osdep.h"
9 #include "monitor/hmp.h"
10 #include "monitor/monitor.h"
11 #include "qapi/qapi-commands-virtio.h"
12 #include "qobject/qdict.h"
13
14
15 static void hmp_virtio_dump_protocols(MonitorHMP *hmp,
16 VhostDeviceProtocols *pcol)
17 {
18 strList *pcol_list = pcol->protocols;
19 while (pcol_list) {
20 monitor_hmp_printf(hmp, "\t%s", pcol_list->value);
21 pcol_list = pcol_list->next;
22 if (pcol_list != NULL) {
23 monitor_hmp_printf(hmp, ",\n");
24 }
25 }
26 monitor_hmp_printf(hmp, "\n");
27 if (pcol->has_unknown_protocols) {
28 monitor_hmp_printf(hmp, " unknown-protocols(0x%016"PRIx64")\n",
29 pcol->unknown_protocols);
30 }
31 }
32
33 static void hmp_virtio_dump_status(MonitorHMP *hmp,
34 VirtioDeviceStatus *status)
35 {
36 strList *status_list = status->statuses;
37 while (status_list) {
38 monitor_hmp_printf(hmp, "\t%s", status_list->value);
39 status_list = status_list->next;
40 if (status_list != NULL) {
41 monitor_hmp_printf(hmp, ",\n");
42 }
43 }
44 monitor_hmp_printf(hmp, "\n");
45 if (status->has_unknown_statuses) {
46 monitor_hmp_printf(hmp, " unknown-statuses(0x%016"PRIx32")\n",
47 status->unknown_statuses);
48 }
49 }
50
51 static void hmp_virtio_dump_features(MonitorHMP *hmp,
52 VirtioDeviceFeatures *features)
53 {
54 strList *transport_list = features->transports;
55 while (transport_list) {
56 monitor_hmp_printf(hmp, "\t%s", transport_list->value);
57 transport_list = transport_list->next;
58 if (transport_list != NULL) {
59 monitor_hmp_printf(hmp, ",\n");
60 }
61 }
62
63 monitor_hmp_printf(hmp, "\n");
64 strList *list = features->dev_features;
65 if (list) {
66 while (list) {
67 monitor_hmp_printf(hmp, "\t%s", list->value);
68 list = list->next;
69 if (list != NULL) {
70 monitor_hmp_printf(hmp, ",\n");
71 }
72 }
73 monitor_hmp_printf(hmp, "\n");
74 }
75
76 if (features->has_unknown_dev_features) {
77 monitor_hmp_printf(hmp, " unknown-features(0x%016"PRIx64"%016"PRIx64")\n",
78 features->unknown_dev_features2,
79 features->unknown_dev_features);
80 }
81 }
82
83 void hmp_virtio_query(MonitorHMP *hmp, const QDict *qdict)
84 {
85 Error *err = NULL;
86 VirtioInfoList *list = qmp_x_query_virtio(&err);
87 VirtioInfoList *node;
88
89 if (err != NULL) {
90 hmp_handle_error(hmp, err);
91 return;
92 }
93
94 if (list == NULL) {
95 monitor_hmp_printf(hmp, "No VirtIO devices\n");
96 return;
97 }
98
99 node = list;
100 while (node) {
101 monitor_hmp_printf(hmp, "%s [%s]\n", node->value->path,
102 node->value->name);
103 node = node->next;
104 }
105 qapi_free_VirtioInfoList(list);
106 }
107
108 void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
109 {
110 Error *err = NULL;
111 const char *path = qdict_get_try_str(qdict, "path");
112 VirtioStatus *s = qmp_x_query_virtio_status(path, &err);
113
114 if (err != NULL) {
115 hmp_handle_error(hmp, err);
116 return;
117 }
118
119 monitor_hmp_printf(hmp, "%s:\n", path);
120 monitor_hmp_printf(hmp, " device_name: %s %s\n",
121 s->name, s->vhost_dev ? "(vhost)" : "");
122 monitor_hmp_printf(hmp, " device_id: %d\n", s->device_id);
123 monitor_hmp_printf(hmp, " vhost_started: %s\n",
124 s->vhost_started ? "true" : "false");
125 monitor_hmp_printf(hmp, " bus_name: %s\n", s->bus_name);
126 monitor_hmp_printf(hmp, " broken: %s\n",
127 s->broken ? "true" : "false");
128 monitor_hmp_printf(hmp, " disabled: %s\n",
129 s->disabled ? "true" : "false");
130 monitor_hmp_printf(hmp, " disable_legacy_check: %s\n",
131 s->disable_legacy_check ? "true" : "false");
132 monitor_hmp_printf(hmp, " started: %s\n",
133 s->started ? "true" : "false");
134 monitor_hmp_printf(hmp, " use_started: %s\n",
135 s->use_started ? "true" : "false");
136 monitor_hmp_printf(hmp, " start_on_kick: %s\n",
137 s->start_on_kick ? "true" : "false");
138 monitor_hmp_printf(hmp, " use_guest_notifier_mask: %s\n",
139 s->use_guest_notifier_mask ? "true" : "false");
140 monitor_hmp_printf(hmp, " vm_running: %s\n",
141 s->vm_running ? "true" : "false");
142 monitor_hmp_printf(hmp, " num_vqs: %"PRId64"\n", s->num_vqs);
143 monitor_hmp_printf(hmp, " queue_sel: %d\n",
144 s->queue_sel);
145 monitor_hmp_printf(hmp, " isr: %d\n", s->isr);
146 monitor_hmp_printf(hmp, " endianness: %s\n",
147 s->device_endian);
148 monitor_hmp_printf(hmp, " status:\n");
149 hmp_virtio_dump_status(hmp, s->status);
150 monitor_hmp_printf(hmp, " Guest features:\n");
151 hmp_virtio_dump_features(hmp, s->guest_features);
152 monitor_hmp_printf(hmp, " Host features:\n");
153 hmp_virtio_dump_features(hmp, s->host_features);
154 monitor_hmp_printf(hmp, " Backend features:\n");
155 hmp_virtio_dump_features(hmp, s->backend_features);
156
157 if (s->vhost_dev) {
158 monitor_hmp_printf(hmp, " VHost:\n");
159 monitor_hmp_printf(hmp, " nvqs: %d\n",
160 s->vhost_dev->nvqs);
161 monitor_hmp_printf(hmp, " vq_index: %"PRId64"\n",
162 s->vhost_dev->vq_index);
163 monitor_hmp_printf(hmp, " max_queues: %"PRId64"\n",
164 s->vhost_dev->max_queues);
165 monitor_hmp_printf(hmp, " n_mem_sections: %"PRId64"\n",
166 s->vhost_dev->n_mem_sections);
167 monitor_hmp_printf(hmp, " n_tmp_sections: %"PRId64"\n",
168 s->vhost_dev->n_tmp_sections);
169 monitor_hmp_printf(hmp, " backend_cap: %"PRId64"\n",
170 s->vhost_dev->backend_cap);
171 monitor_hmp_printf(hmp, " log_enabled: %s\n",
172 s->vhost_dev->log_enabled ? "true" : "false");
173 monitor_hmp_printf(hmp, " log_size: %"PRId64"\n",
174 s->vhost_dev->log_size);
175 monitor_hmp_printf(hmp, " Features:\n");
176 hmp_virtio_dump_features(hmp, s->vhost_dev->features);
177 monitor_hmp_printf(hmp, " Acked features:\n");
178 hmp_virtio_dump_features(hmp, s->vhost_dev->acked_features);
179 monitor_hmp_printf(hmp, " Protocol features:\n");
180 hmp_virtio_dump_protocols(hmp, s->vhost_dev->protocol_features);
181 }
182
183 qapi_free_VirtioStatus(s);
184 }
185
186 void hmp_vhost_queue_status(MonitorHMP *hmp, const QDict *qdict)
187 {
188 Error *err = NULL;
189 const char *path = qdict_get_try_str(qdict, "path");
190 int queue = qdict_get_int(qdict, "queue");
191 VirtVhostQueueStatus *s =
192 qmp_x_query_virtio_vhost_queue_status(path, queue, &err);
193
194 if (err != NULL) {
195 hmp_handle_error(hmp, err);
196 return;
197 }
198
199 monitor_hmp_printf(hmp, "%s:\n", path);
200 monitor_hmp_printf(hmp, " device_name: %s (vhost)\n",
201 s->name);
202 monitor_hmp_printf(hmp, " kick: %"PRId64"\n", s->kick);
203 monitor_hmp_printf(hmp, " call: %"PRId64"\n", s->call);
204 monitor_hmp_printf(hmp, " VRing:\n");
205 monitor_hmp_printf(hmp, " num: %"PRId64"\n", s->num);
206 monitor_hmp_printf(hmp, " desc_phys: 0x%016"PRIx64"\n",
207 s->desc_phys);
208 monitor_hmp_printf(hmp, " desc_size: %"PRId32"\n", s->desc_size);
209 monitor_hmp_printf(hmp, " avail_phys: 0x%016"PRIx64"\n",
210 s->avail_phys);
211 monitor_hmp_printf(hmp, " avail_size: %"PRId32"\n", s->avail_size);
212 monitor_hmp_printf(hmp, " used_phys: 0x%016"PRIx64"\n",
213 s->used_phys);
214 monitor_hmp_printf(hmp, " used_size: %"PRId32"\n", s->used_size);
215
216 qapi_free_VirtVhostQueueStatus(s);
217 }
218
219 void hmp_virtio_queue_status(MonitorHMP *hmp, const QDict *qdict)
220 {
221 Error *err = NULL;
222 const char *path = qdict_get_try_str(qdict, "path");
223 int queue = qdict_get_int(qdict, "queue");
224 VirtQueueStatus *s = qmp_x_query_virtio_queue_status(path, queue, &err);
225
226 if (err != NULL) {
227 hmp_handle_error(hmp, err);
228 return;
229 }
230
231 monitor_hmp_printf(hmp, "%s:\n", path);
232 monitor_hmp_printf(hmp, " device_name: %s\n", s->name);
233 monitor_hmp_printf(hmp, " queue_index: %d\n", s->queue_index);
234 monitor_hmp_printf(hmp, " inuse: %d\n", s->inuse);
235 monitor_hmp_printf(hmp, " used_idx: %d\n", s->used_idx);
236 monitor_hmp_printf(hmp, " signalled_used: %d\n",
237 s->signalled_used);
238 monitor_hmp_printf(hmp, " signalled_used_valid: %s\n",
239 s->signalled_used_valid ? "true" : "false");
240 if (s->has_last_avail_idx) {
241 monitor_hmp_printf(hmp, " last_avail_idx: %d\n",
242 s->last_avail_idx);
243 }
244 if (s->has_shadow_avail_idx) {
245 monitor_hmp_printf(hmp, " shadow_avail_idx: %d\n",
246 s->shadow_avail_idx);
247 }
248 monitor_hmp_printf(hmp, " VRing:\n");
249 monitor_hmp_printf(hmp, " num: %"PRId32"\n", s->vring_num);
250 monitor_hmp_printf(hmp, " num_default: %"PRId32"\n",
251 s->vring_num_default);
252 monitor_hmp_printf(hmp, " align: %"PRId32"\n",
253 s->vring_align);
254 monitor_hmp_printf(hmp, " desc: 0x%016"PRIx64"\n",
255 s->vring_desc);
256 monitor_hmp_printf(hmp, " avail: 0x%016"PRIx64"\n",
257 s->vring_avail);
258 monitor_hmp_printf(hmp, " used: 0x%016"PRIx64"\n",
259 s->vring_used);
260
261 qapi_free_VirtQueueStatus(s);
262 }
263
264 void hmp_virtio_queue_element(MonitorHMP *hmp, const QDict *qdict)
265 {
266 Error *err = NULL;
267 const char *path = qdict_get_try_str(qdict, "path");
268 int queue = qdict_get_int(qdict, "queue");
269 int index = qdict_get_try_int(qdict, "index", -1);
270 VirtioQueueElement *e;
271 VirtioRingDescList *list;
272
273 e = qmp_x_query_virtio_queue_element(path, queue, index != -1,
274 index, &err);
275 if (err != NULL) {
276 hmp_handle_error(hmp, err);
277 return;
278 }
279
280 monitor_hmp_printf(hmp, "%s:\n", path);
281 monitor_hmp_printf(hmp, " device_name: %s\n", e->name);
282 monitor_hmp_printf(hmp, " index: %d\n", e->index);
283 monitor_hmp_printf(hmp, " desc:\n");
284 monitor_hmp_printf(hmp, " descs:\n");
285
286 list = e->descs;
287 while (list) {
288 monitor_hmp_printf(hmp, " addr 0x%"PRIx64" len %d",
289 list->value->addr, list->value->len);
290 if (list->value->flags) {
291 strList *flag = list->value->flags;
292 monitor_hmp_printf(hmp, " (");
293 while (flag) {
294 monitor_hmp_printf(hmp, "%s", flag->value);
295 flag = flag->next;
296 if (flag) {
297 monitor_hmp_printf(hmp, ", ");
298 }
299 }
300 monitor_hmp_printf(hmp, ")");
301 }
302 list = list->next;
303 if (list) {
304 monitor_hmp_printf(hmp, ",\n");
305 }
306 }
307 monitor_hmp_printf(hmp, "\n");
308 monitor_hmp_printf(hmp, " avail:\n");
309 monitor_hmp_printf(hmp, " flags: %d\n", e->avail->flags);
310 monitor_hmp_printf(hmp, " idx: %d\n", e->avail->idx);
311 monitor_hmp_printf(hmp, " ring: %d\n", e->avail->ring);
312 monitor_hmp_printf(hmp, " used:\n");
313 monitor_hmp_printf(hmp, " flags: %d\n", e->used->flags);
314 monitor_hmp_printf(hmp, " idx: %d\n", e->used->idx);
315
316 qapi_free_VirtioQueueElement(e);
317 }