xref: /qemu/monitor/hmp-cmds.c (revision 7200fb21)
1f1b3ccfaSKevin Wolf /*
2f1b3ccfaSKevin Wolf  * Human Monitor Interface commands
3f1b3ccfaSKevin Wolf  *
4f1b3ccfaSKevin Wolf  * Copyright IBM, Corp. 2011
5f1b3ccfaSKevin Wolf  *
6f1b3ccfaSKevin Wolf  * Authors:
7f1b3ccfaSKevin Wolf  *  Anthony Liguori   <aliguori@us.ibm.com>
8f1b3ccfaSKevin Wolf  *
9f1b3ccfaSKevin Wolf  * This work is licensed under the terms of the GNU GPL, version 2.  See
10f1b3ccfaSKevin Wolf  * the COPYING file in the top-level directory.
11f1b3ccfaSKevin Wolf  *
12f1b3ccfaSKevin Wolf  * Contributions after 2012-01-13 are licensed under the terms of the
13f1b3ccfaSKevin Wolf  * GNU GPL, version 2 or (at your option) any later version.
14f1b3ccfaSKevin Wolf  */
15f1b3ccfaSKevin Wolf 
16f1b3ccfaSKevin Wolf #include "qemu/osdep.h"
17cbf81997SMarkus Armbruster #include "exec/address-spaces.h"
18cbf81997SMarkus Armbruster #include "exec/gdbstub.h"
19cbf81997SMarkus Armbruster #include "exec/ioport.h"
20275307aaSMarkus Armbruster #include "monitor/hmp.h"
21ad6f932fSPaolo Bonzini #include "qemu/help_option.h"
22cbf81997SMarkus Armbruster #include "monitor/monitor-internal.h"
23f1b3ccfaSKevin Wolf #include "qapi/error.h"
24fa4dcf57SKevin Wolf #include "qapi/qapi-commands-control.h"
25f1b3ccfaSKevin Wolf #include "qapi/qapi-commands-misc.h"
26f1b3ccfaSKevin Wolf #include "qapi/qmp/qdict.h"
27f1b3ccfaSKevin Wolf #include "qemu/cutils.h"
28f1b3ccfaSKevin Wolf #include "hw/intc/intc.h"
29cbf81997SMarkus Armbruster #include "qemu/log.h"
30cbf81997SMarkus Armbruster #include "sysemu/sysemu.h"
31f1b3ccfaSKevin Wolf 
hmp_handle_error(Monitor * mon,Error * err)320ca117a7SDaniel P. Berrangé bool hmp_handle_error(Monitor *mon, Error *err)
33f1b3ccfaSKevin Wolf {
34187c6147SVladimir Sementsov-Ogievskiy     if (err) {
35187c6147SVladimir Sementsov-Ogievskiy         error_reportf_err(err, "Error: ");
360ca117a7SDaniel P. Berrangé         return true;
37f1b3ccfaSKevin Wolf     }
380ca117a7SDaniel P. Berrangé     return false;
39f1b3ccfaSKevin Wolf }
40f1b3ccfaSKevin Wolf 
4108528271SDr. David Alan Gilbert /*
420d79271bSMarkus Armbruster  * Split @str at comma.
430d79271bSMarkus Armbruster  * A null @str defaults to "".
4408528271SDr. David Alan Gilbert  */
hmp_split_at_comma(const char * str)450d79271bSMarkus Armbruster strList *hmp_split_at_comma(const char *str)
4608528271SDr. David Alan Gilbert {
470d79271bSMarkus Armbruster     char **split = g_strsplit(str ?: "", ",", -1);
4808528271SDr. David Alan Gilbert     strList *res = NULL;
49c3033fd3SEric Blake     strList **tail = &res;
500d79271bSMarkus Armbruster     int i;
5108528271SDr. David Alan Gilbert 
520d79271bSMarkus Armbruster     for (i = 0; split[i]; i++) {
530d79271bSMarkus Armbruster         QAPI_LIST_APPEND(tail, split[i]);
5408528271SDr. David Alan Gilbert     }
5508528271SDr. David Alan Gilbert 
560d79271bSMarkus Armbruster     g_free(split);
5708528271SDr. David Alan Gilbert     return res;
5808528271SDr. David Alan Gilbert }
5908528271SDr. David Alan Gilbert 
hmp_info_name(Monitor * mon,const QDict * qdict)60f1b3ccfaSKevin Wolf void hmp_info_name(Monitor *mon, const QDict *qdict)
61f1b3ccfaSKevin Wolf {
62f1b3ccfaSKevin Wolf     NameInfo *info;
63f1b3ccfaSKevin Wolf 
64f1b3ccfaSKevin Wolf     info = qmp_query_name(NULL);
659492718bSMarkus Armbruster     if (info->name) {
66f1b3ccfaSKevin Wolf         monitor_printf(mon, "%s\n", info->name);
67f1b3ccfaSKevin Wolf     }
68f1b3ccfaSKevin Wolf     qapi_free_NameInfo(info);
69f1b3ccfaSKevin Wolf }
70f1b3ccfaSKevin Wolf 
hmp_info_version(Monitor * mon,const QDict * qdict)71f1b3ccfaSKevin Wolf void hmp_info_version(Monitor *mon, const QDict *qdict)
72f1b3ccfaSKevin Wolf {
73f1b3ccfaSKevin Wolf     VersionInfo *info;
74f1b3ccfaSKevin Wolf 
75f1b3ccfaSKevin Wolf     info = qmp_query_version(NULL);
76f1b3ccfaSKevin Wolf 
77f1b3ccfaSKevin Wolf     monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
78f1b3ccfaSKevin Wolf                    info->qemu->major, info->qemu->minor, info->qemu->micro,
79f1b3ccfaSKevin Wolf                    info->package);
80f1b3ccfaSKevin Wolf 
81f1b3ccfaSKevin Wolf     qapi_free_VersionInfo(info);
82f1b3ccfaSKevin Wolf }
83f1b3ccfaSKevin Wolf 
hmp_info_pic_foreach(Object * obj,void * opaque)84f1b3ccfaSKevin Wolf static int hmp_info_pic_foreach(Object *obj, void *opaque)
85f1b3ccfaSKevin Wolf {
86f1b3ccfaSKevin Wolf     InterruptStatsProvider *intc;
87f1b3ccfaSKevin Wolf     InterruptStatsProviderClass *k;
88f1b3ccfaSKevin Wolf     Monitor *mon = opaque;
89f1b3ccfaSKevin Wolf 
90f1b3ccfaSKevin Wolf     if (object_dynamic_cast(obj, TYPE_INTERRUPT_STATS_PROVIDER)) {
91f1b3ccfaSKevin Wolf         intc = INTERRUPT_STATS_PROVIDER(obj);
92f1b3ccfaSKevin Wolf         k = INTERRUPT_STATS_PROVIDER_GET_CLASS(obj);
93f1b3ccfaSKevin Wolf         if (k->print_info) {
94f1b3ccfaSKevin Wolf             k->print_info(intc, mon);
95f1b3ccfaSKevin Wolf         } else {
96f1b3ccfaSKevin Wolf             monitor_printf(mon, "Interrupt controller information not available for %s.\n",
97f1b3ccfaSKevin Wolf                            object_get_typename(obj));
98f1b3ccfaSKevin Wolf         }
99f1b3ccfaSKevin Wolf     }
100f1b3ccfaSKevin Wolf 
101f1b3ccfaSKevin Wolf     return 0;
102f1b3ccfaSKevin Wolf }
103f1b3ccfaSKevin Wolf 
hmp_info_pic(Monitor * mon,const QDict * qdict)104f1b3ccfaSKevin Wolf void hmp_info_pic(Monitor *mon, const QDict *qdict)
105f1b3ccfaSKevin Wolf {
106f1b3ccfaSKevin Wolf     object_child_foreach_recursive(object_get_root(),
107f1b3ccfaSKevin Wolf                                    hmp_info_pic_foreach, mon);
108f1b3ccfaSKevin Wolf }
109f1b3ccfaSKevin Wolf 
hmp_quit(Monitor * mon,const QDict * qdict)110f1b3ccfaSKevin Wolf void hmp_quit(Monitor *mon, const QDict *qdict)
111f1b3ccfaSKevin Wolf {
112f1b3ccfaSKevin Wolf     monitor_suspend(mon);
113f1b3ccfaSKevin Wolf     qmp_quit(NULL);
114f1b3ccfaSKevin Wolf }
115f1b3ccfaSKevin Wolf 
hmp_stop(Monitor * mon,const QDict * qdict)116f1b3ccfaSKevin Wolf void hmp_stop(Monitor *mon, const QDict *qdict)
117f1b3ccfaSKevin Wolf {
118f1b3ccfaSKevin Wolf     qmp_stop(NULL);
119f1b3ccfaSKevin Wolf }
120f1b3ccfaSKevin Wolf 
hmp_sync_profile(Monitor * mon,const QDict * qdict)121f1b3ccfaSKevin Wolf void hmp_sync_profile(Monitor *mon, const QDict *qdict)
122f1b3ccfaSKevin Wolf {
123f1b3ccfaSKevin Wolf     const char *op = qdict_get_try_str(qdict, "op");
124f1b3ccfaSKevin Wolf 
125f1b3ccfaSKevin Wolf     if (op == NULL) {
126f1b3ccfaSKevin Wolf         bool on = qsp_is_enabled();
127f1b3ccfaSKevin Wolf 
128f1b3ccfaSKevin Wolf         monitor_printf(mon, "sync-profile is %s\n", on ? "on" : "off");
129f1b3ccfaSKevin Wolf         return;
130f1b3ccfaSKevin Wolf     }
131f1b3ccfaSKevin Wolf     if (!strcmp(op, "on")) {
132f1b3ccfaSKevin Wolf         qsp_enable();
133f1b3ccfaSKevin Wolf     } else if (!strcmp(op, "off")) {
134f1b3ccfaSKevin Wolf         qsp_disable();
135f1b3ccfaSKevin Wolf     } else if (!strcmp(op, "reset")) {
136f1b3ccfaSKevin Wolf         qsp_reset();
137f1b3ccfaSKevin Wolf     } else {
138f1b3ccfaSKevin Wolf         Error *err = NULL;
139f1b3ccfaSKevin Wolf 
1407200fb21SMarkus Armbruster         error_setg(&err, "invalid parameter '%s',"
1417200fb21SMarkus Armbruster                    " expecting 'on', 'off', or 'reset'", op);
142187c6147SVladimir Sementsov-Ogievskiy         hmp_handle_error(mon, err);
143f1b3ccfaSKevin Wolf     }
144f1b3ccfaSKevin Wolf }
145f1b3ccfaSKevin Wolf 
hmp_exit_preconfig(Monitor * mon,const QDict * qdict)146f1b3ccfaSKevin Wolf void hmp_exit_preconfig(Monitor *mon, const QDict *qdict)
147f1b3ccfaSKevin Wolf {
148f1b3ccfaSKevin Wolf     Error *err = NULL;
149f1b3ccfaSKevin Wolf 
150f1b3ccfaSKevin Wolf     qmp_x_exit_preconfig(&err);
151187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
152f1b3ccfaSKevin Wolf }
153f1b3ccfaSKevin Wolf 
hmp_cpu(Monitor * mon,const QDict * qdict)154f1b3ccfaSKevin Wolf void hmp_cpu(Monitor *mon, const QDict *qdict)
155f1b3ccfaSKevin Wolf {
156f1b3ccfaSKevin Wolf     int64_t cpu_index;
157f1b3ccfaSKevin Wolf 
158f1b3ccfaSKevin Wolf     /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
159f1b3ccfaSKevin Wolf             use it are converted to the QAPI */
160f1b3ccfaSKevin Wolf     cpu_index = qdict_get_int(qdict, "index");
161dcba65f8SKevin Wolf     if (monitor_set_cpu(mon, cpu_index) < 0) {
162f1b3ccfaSKevin Wolf         monitor_printf(mon, "invalid CPU index\n");
163f1b3ccfaSKevin Wolf     }
164f1b3ccfaSKevin Wolf }
165f1b3ccfaSKevin Wolf 
hmp_cont(Monitor * mon,const QDict * qdict)166f1b3ccfaSKevin Wolf void hmp_cont(Monitor *mon, const QDict *qdict)
167f1b3ccfaSKevin Wolf {
168f1b3ccfaSKevin Wolf     Error *err = NULL;
169f1b3ccfaSKevin Wolf 
170f1b3ccfaSKevin Wolf     qmp_cont(&err);
171187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
172f1b3ccfaSKevin Wolf }
173f1b3ccfaSKevin Wolf 
hmp_change(Monitor * mon,const QDict * qdict)174f1b3ccfaSKevin Wolf void hmp_change(Monitor *mon, const QDict *qdict)
175f1b3ccfaSKevin Wolf {
176f1b3ccfaSKevin Wolf     const char *device = qdict_get_str(qdict, "device");
177f1b3ccfaSKevin Wolf     const char *target = qdict_get_str(qdict, "target");
178f1b3ccfaSKevin Wolf     const char *arg = qdict_get_try_str(qdict, "arg");
179f1b3ccfaSKevin Wolf     const char *read_only = qdict_get_try_str(qdict, "read-only-mode");
18080dd5affSDenis V. Lunev     bool force = qdict_get_try_bool(qdict, "force", false);
181f1b3ccfaSKevin Wolf     Error *err = NULL;
182f1b3ccfaSKevin Wolf 
183f1b3ccfaSKevin Wolf #ifdef CONFIG_VNC
184f1b3ccfaSKevin Wolf     if (strcmp(device, "vnc") == 0) {
185f916a175SMarkus Armbruster         hmp_change_vnc(mon, device, target, arg, read_only, force, &err);
186f1b3ccfaSKevin Wolf     } else
187f1b3ccfaSKevin Wolf #endif
188f1b3ccfaSKevin Wolf     {
189fa1d2f8fSMarkus Armbruster         hmp_change_medium(mon, device, target, arg, read_only, force, &err);
190f1b3ccfaSKevin Wolf     }
191f1b3ccfaSKevin Wolf 
192187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
193f1b3ccfaSKevin Wolf }
194f1b3ccfaSKevin Wolf 
1954bf21c7fSMarc-André Lureau #ifdef CONFIG_POSIX
hmp_getfd(Monitor * mon,const QDict * qdict)196f1b3ccfaSKevin Wolf void hmp_getfd(Monitor *mon, const QDict *qdict)
197f1b3ccfaSKevin Wolf {
198f1b3ccfaSKevin Wolf     const char *fdname = qdict_get_str(qdict, "fdname");
199f1b3ccfaSKevin Wolf     Error *err = NULL;
200f1b3ccfaSKevin Wolf 
201f1b3ccfaSKevin Wolf     qmp_getfd(fdname, &err);
202187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
203f1b3ccfaSKevin Wolf }
2044bf21c7fSMarc-André Lureau #endif
205f1b3ccfaSKevin Wolf 
hmp_closefd(Monitor * mon,const QDict * qdict)206f1b3ccfaSKevin Wolf void hmp_closefd(Monitor *mon, const QDict *qdict)
207f1b3ccfaSKevin Wolf {
208f1b3ccfaSKevin Wolf     const char *fdname = qdict_get_str(qdict, "fdname");
209f1b3ccfaSKevin Wolf     Error *err = NULL;
210f1b3ccfaSKevin Wolf 
211f1b3ccfaSKevin Wolf     qmp_closefd(fdname, &err);
212187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
213f1b3ccfaSKevin Wolf }
214f1b3ccfaSKevin Wolf 
hmp_info_iothreads(Monitor * mon,const QDict * qdict)215f1b3ccfaSKevin Wolf void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
216f1b3ccfaSKevin Wolf {
217f1b3ccfaSKevin Wolf     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
218f1b3ccfaSKevin Wolf     IOThreadInfoList *info;
219f1b3ccfaSKevin Wolf     IOThreadInfo *value;
220f1b3ccfaSKevin Wolf 
221f1b3ccfaSKevin Wolf     for (info = info_list; info; info = info->next) {
222f1b3ccfaSKevin Wolf         value = info->value;
223f1b3ccfaSKevin Wolf         monitor_printf(mon, "%s:\n", value->id);
224f1b3ccfaSKevin Wolf         monitor_printf(mon, "  thread_id=%" PRId64 "\n", value->thread_id);
225f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-max-ns=%" PRId64 "\n", value->poll_max_ns);
226f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-grow=%" PRId64 "\n", value->poll_grow);
227f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-shrink=%" PRId64 "\n", value->poll_shrink);
2281793ad02SStefano Garzarella         monitor_printf(mon, "  aio-max-batch=%" PRId64 "\n",
2291793ad02SStefano Garzarella                        value->aio_max_batch);
230f1b3ccfaSKevin Wolf     }
231f1b3ccfaSKevin Wolf 
232f1b3ccfaSKevin Wolf     qapi_free_IOThreadInfoList(info_list);
233f1b3ccfaSKevin Wolf }
234cbf81997SMarkus Armbruster 
hmp_help(Monitor * mon,const QDict * qdict)235cbf81997SMarkus Armbruster void hmp_help(Monitor *mon, const QDict *qdict)
236cbf81997SMarkus Armbruster {
237cbf81997SMarkus Armbruster     hmp_help_cmd(mon, qdict_get_try_str(qdict, "name"));
238cbf81997SMarkus Armbruster }
239cbf81997SMarkus Armbruster 
hmp_info_help(Monitor * mon,const QDict * qdict)240cbf81997SMarkus Armbruster void hmp_info_help(Monitor *mon, const QDict *qdict)
241cbf81997SMarkus Armbruster {
242cbf81997SMarkus Armbruster     hmp_help_cmd(mon, "info");
243cbf81997SMarkus Armbruster }
244cbf81997SMarkus Armbruster 
hmp_info_sync_profile(Monitor * mon,const QDict * qdict)245cbf81997SMarkus Armbruster void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
246cbf81997SMarkus Armbruster {
247cbf81997SMarkus Armbruster     int64_t max = qdict_get_try_int(qdict, "max", 10);
248cbf81997SMarkus Armbruster     bool mean = qdict_get_try_bool(qdict, "mean", false);
249cbf81997SMarkus Armbruster     bool coalesce = !qdict_get_try_bool(qdict, "no_coalesce", false);
250cbf81997SMarkus Armbruster     enum QSPSortBy sort_by;
251cbf81997SMarkus Armbruster 
252cbf81997SMarkus Armbruster     sort_by = mean ? QSP_SORT_BY_AVG_WAIT_TIME : QSP_SORT_BY_TOTAL_WAIT_TIME;
253cbf81997SMarkus Armbruster     qsp_report(max, sort_by, coalesce);
254cbf81997SMarkus Armbruster }
255cbf81997SMarkus Armbruster 
hmp_info_history(Monitor * mon,const QDict * qdict)256cbf81997SMarkus Armbruster void hmp_info_history(Monitor *mon, const QDict *qdict)
257cbf81997SMarkus Armbruster {
258cbf81997SMarkus Armbruster     MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
259cbf81997SMarkus Armbruster     int i;
260cbf81997SMarkus Armbruster     const char *str;
261cbf81997SMarkus Armbruster 
262cbf81997SMarkus Armbruster     if (!hmp_mon->rs) {
263cbf81997SMarkus Armbruster         return;
264cbf81997SMarkus Armbruster     }
265cbf81997SMarkus Armbruster     i = 0;
266cbf81997SMarkus Armbruster     for(;;) {
267cbf81997SMarkus Armbruster         str = readline_get_history(hmp_mon->rs, i);
268cbf81997SMarkus Armbruster         if (!str) {
269cbf81997SMarkus Armbruster             break;
270cbf81997SMarkus Armbruster         }
271cbf81997SMarkus Armbruster         monitor_printf(mon, "%d: '%s'\n", i, str);
272cbf81997SMarkus Armbruster         i++;
273cbf81997SMarkus Armbruster     }
274cbf81997SMarkus Armbruster }
275cbf81997SMarkus Armbruster 
hmp_logfile(Monitor * mon,const QDict * qdict)276cbf81997SMarkus Armbruster void hmp_logfile(Monitor *mon, const QDict *qdict)
277cbf81997SMarkus Armbruster {
278cbf81997SMarkus Armbruster     Error *err = NULL;
279cbf81997SMarkus Armbruster 
280cbf81997SMarkus Armbruster     if (!qemu_set_log_filename(qdict_get_str(qdict, "filename"), &err)) {
281cbf81997SMarkus Armbruster         error_report_err(err);
282cbf81997SMarkus Armbruster     }
283cbf81997SMarkus Armbruster }
284cbf81997SMarkus Armbruster 
hmp_log(Monitor * mon,const QDict * qdict)285cbf81997SMarkus Armbruster void hmp_log(Monitor *mon, const QDict *qdict)
286cbf81997SMarkus Armbruster {
287cbf81997SMarkus Armbruster     int mask;
288cbf81997SMarkus Armbruster     const char *items = qdict_get_str(qdict, "items");
289cbf81997SMarkus Armbruster     Error *err = NULL;
290cbf81997SMarkus Armbruster 
291cbf81997SMarkus Armbruster     if (!strcmp(items, "none")) {
292cbf81997SMarkus Armbruster         mask = 0;
293cbf81997SMarkus Armbruster     } else {
294cbf81997SMarkus Armbruster         mask = qemu_str_to_log_mask(items);
295cbf81997SMarkus Armbruster         if (!mask) {
296cbf81997SMarkus Armbruster             hmp_help_cmd(mon, "log");
297cbf81997SMarkus Armbruster             return;
298cbf81997SMarkus Armbruster         }
299cbf81997SMarkus Armbruster     }
300cbf81997SMarkus Armbruster 
301cbf81997SMarkus Armbruster     if (!qemu_set_log(mask, &err)) {
302cbf81997SMarkus Armbruster         error_report_err(err);
303cbf81997SMarkus Armbruster     }
304cbf81997SMarkus Armbruster }
305cbf81997SMarkus Armbruster 
hmp_gdbserver(Monitor * mon,const QDict * qdict)306cbf81997SMarkus Armbruster void hmp_gdbserver(Monitor *mon, const QDict *qdict)
307cbf81997SMarkus Armbruster {
308cbf81997SMarkus Armbruster     const char *device = qdict_get_try_str(qdict, "device");
309cbf81997SMarkus Armbruster     if (!device) {
310cbf81997SMarkus Armbruster         device = "tcp::" DEFAULT_GDBSTUB_PORT;
311cbf81997SMarkus Armbruster     }
312cbf81997SMarkus Armbruster 
313cbf81997SMarkus Armbruster     if (gdbserver_start(device) < 0) {
314cbf81997SMarkus Armbruster         monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
315cbf81997SMarkus Armbruster                        device);
316cbf81997SMarkus Armbruster     } else if (strcmp(device, "none") == 0) {
317cbf81997SMarkus Armbruster         monitor_printf(mon, "Disabled gdbserver\n");
318cbf81997SMarkus Armbruster     } else {
319cbf81997SMarkus Armbruster         monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
320cbf81997SMarkus Armbruster                        device);
321cbf81997SMarkus Armbruster     }
322cbf81997SMarkus Armbruster }
323cbf81997SMarkus Armbruster 
hmp_print(Monitor * mon,const QDict * qdict)324cbf81997SMarkus Armbruster void hmp_print(Monitor *mon, const QDict *qdict)
325cbf81997SMarkus Armbruster {
326cbf81997SMarkus Armbruster     int format = qdict_get_int(qdict, "format");
327cbf81997SMarkus Armbruster     hwaddr val = qdict_get_int(qdict, "val");
328cbf81997SMarkus Armbruster 
329cbf81997SMarkus Armbruster     switch(format) {
330cbf81997SMarkus Armbruster     case 'o':
331cbf81997SMarkus Armbruster         monitor_printf(mon, "%#" HWADDR_PRIo, val);
332cbf81997SMarkus Armbruster         break;
333cbf81997SMarkus Armbruster     case 'x':
334cbf81997SMarkus Armbruster         monitor_printf(mon, "%#" HWADDR_PRIx, val);
335cbf81997SMarkus Armbruster         break;
336cbf81997SMarkus Armbruster     case 'u':
337cbf81997SMarkus Armbruster         monitor_printf(mon, "%" HWADDR_PRIu, val);
338cbf81997SMarkus Armbruster         break;
339cbf81997SMarkus Armbruster     default:
340cbf81997SMarkus Armbruster     case 'd':
341cbf81997SMarkus Armbruster         monitor_printf(mon, "%" HWADDR_PRId, val);
342cbf81997SMarkus Armbruster         break;
343cbf81997SMarkus Armbruster     case 'c':
344cbf81997SMarkus Armbruster         monitor_printc(mon, val);
345cbf81997SMarkus Armbruster         break;
346cbf81997SMarkus Armbruster     }
347cbf81997SMarkus Armbruster     monitor_printf(mon, "\n");
348cbf81997SMarkus Armbruster }
349cbf81997SMarkus Armbruster 
hmp_sum(Monitor * mon,const QDict * qdict)350cbf81997SMarkus Armbruster void hmp_sum(Monitor *mon, const QDict *qdict)
351cbf81997SMarkus Armbruster {
352cbf81997SMarkus Armbruster     uint32_t addr;
353cbf81997SMarkus Armbruster     uint16_t sum;
354cbf81997SMarkus Armbruster     uint32_t start = qdict_get_int(qdict, "start");
355cbf81997SMarkus Armbruster     uint32_t size = qdict_get_int(qdict, "size");
356cbf81997SMarkus Armbruster 
357cbf81997SMarkus Armbruster     sum = 0;
358cbf81997SMarkus Armbruster     for(addr = start; addr < (start + size); addr++) {
359cbf81997SMarkus Armbruster         uint8_t val = address_space_ldub(&address_space_memory, addr,
360cbf81997SMarkus Armbruster                                          MEMTXATTRS_UNSPECIFIED, NULL);
361cbf81997SMarkus Armbruster         /* BSD sum algorithm ('sum' Unix command) */
362cbf81997SMarkus Armbruster         sum = (sum >> 1) | (sum << 15);
363cbf81997SMarkus Armbruster         sum += val;
364cbf81997SMarkus Armbruster     }
365cbf81997SMarkus Armbruster     monitor_printf(mon, "%05d\n", sum);
366cbf81997SMarkus Armbruster }
367cbf81997SMarkus Armbruster 
hmp_ioport_read(Monitor * mon,const QDict * qdict)368cbf81997SMarkus Armbruster void hmp_ioport_read(Monitor *mon, const QDict *qdict)
369cbf81997SMarkus Armbruster {
370cbf81997SMarkus Armbruster     int size = qdict_get_int(qdict, "size");
371cbf81997SMarkus Armbruster     int addr = qdict_get_int(qdict, "addr");
372cbf81997SMarkus Armbruster     int has_index = qdict_haskey(qdict, "index");
373cbf81997SMarkus Armbruster     uint32_t val;
374cbf81997SMarkus Armbruster     int suffix;
375cbf81997SMarkus Armbruster 
376cbf81997SMarkus Armbruster     if (has_index) {
377cbf81997SMarkus Armbruster         int index = qdict_get_int(qdict, "index");
378cbf81997SMarkus Armbruster         cpu_outb(addr & IOPORTS_MASK, index & 0xff);
379cbf81997SMarkus Armbruster         addr++;
380cbf81997SMarkus Armbruster     }
381cbf81997SMarkus Armbruster     addr &= 0xffff;
382cbf81997SMarkus Armbruster 
383cbf81997SMarkus Armbruster     switch(size) {
384cbf81997SMarkus Armbruster     default:
385cbf81997SMarkus Armbruster     case 1:
386cbf81997SMarkus Armbruster         val = cpu_inb(addr);
387cbf81997SMarkus Armbruster         suffix = 'b';
388cbf81997SMarkus Armbruster         break;
389cbf81997SMarkus Armbruster     case 2:
390cbf81997SMarkus Armbruster         val = cpu_inw(addr);
391cbf81997SMarkus Armbruster         suffix = 'w';
392cbf81997SMarkus Armbruster         break;
393cbf81997SMarkus Armbruster     case 4:
394cbf81997SMarkus Armbruster         val = cpu_inl(addr);
395cbf81997SMarkus Armbruster         suffix = 'l';
396cbf81997SMarkus Armbruster         break;
397cbf81997SMarkus Armbruster     }
398cbf81997SMarkus Armbruster     monitor_printf(mon, "port%c[0x%04x] = 0x%0*x\n",
399cbf81997SMarkus Armbruster                    suffix, addr, size * 2, val);
400cbf81997SMarkus Armbruster }
401cbf81997SMarkus Armbruster 
hmp_ioport_write(Monitor * mon,const QDict * qdict)402cbf81997SMarkus Armbruster void hmp_ioport_write(Monitor *mon, const QDict *qdict)
403cbf81997SMarkus Armbruster {
404cbf81997SMarkus Armbruster     int size = qdict_get_int(qdict, "size");
405cbf81997SMarkus Armbruster     int addr = qdict_get_int(qdict, "addr");
406cbf81997SMarkus Armbruster     int val = qdict_get_int(qdict, "val");
407cbf81997SMarkus Armbruster 
408cbf81997SMarkus Armbruster     addr &= IOPORTS_MASK;
409cbf81997SMarkus Armbruster 
410cbf81997SMarkus Armbruster     switch (size) {
411cbf81997SMarkus Armbruster     default:
412cbf81997SMarkus Armbruster     case 1:
413cbf81997SMarkus Armbruster         cpu_outb(addr, val);
414cbf81997SMarkus Armbruster         break;
415cbf81997SMarkus Armbruster     case 2:
416cbf81997SMarkus Armbruster         cpu_outw(addr, val);
417cbf81997SMarkus Armbruster         break;
418cbf81997SMarkus Armbruster     case 4:
419cbf81997SMarkus Armbruster         cpu_outl(addr, val);
420cbf81997SMarkus Armbruster         break;
421cbf81997SMarkus Armbruster     }
422cbf81997SMarkus Armbruster }
423cbf81997SMarkus Armbruster 
hmp_boot_set(Monitor * mon,const QDict * qdict)424cbf81997SMarkus Armbruster void hmp_boot_set(Monitor *mon, const QDict *qdict)
425cbf81997SMarkus Armbruster {
426cbf81997SMarkus Armbruster     Error *local_err = NULL;
427cbf81997SMarkus Armbruster     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
428cbf81997SMarkus Armbruster 
429cbf81997SMarkus Armbruster     qemu_boot_set(bootdevice, &local_err);
430cbf81997SMarkus Armbruster     if (local_err) {
431cbf81997SMarkus Armbruster         error_report_err(local_err);
432cbf81997SMarkus Armbruster     } else {
433cbf81997SMarkus Armbruster         monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
434cbf81997SMarkus Armbruster     }
435cbf81997SMarkus Armbruster }
436cbf81997SMarkus Armbruster 
hmp_info_mtree(Monitor * mon,const QDict * qdict)437cbf81997SMarkus Armbruster void hmp_info_mtree(Monitor *mon, const QDict *qdict)
438cbf81997SMarkus Armbruster {
439cbf81997SMarkus Armbruster     bool flatview = qdict_get_try_bool(qdict, "flatview", false);
440cbf81997SMarkus Armbruster     bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
441cbf81997SMarkus Armbruster     bool owner = qdict_get_try_bool(qdict, "owner", false);
442cbf81997SMarkus Armbruster     bool disabled = qdict_get_try_bool(qdict, "disabled", false);
443cbf81997SMarkus Armbruster 
444cbf81997SMarkus Armbruster     mtree_info(flatview, dispatch_tree, owner, disabled);
445cbf81997SMarkus Armbruster }
446