xref: /openbmc/qemu/monitor/hmp-cmds.c (revision e2bc7787c8dcc38f0f788d68764ffb6b756f7ea6)
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/ioport.h"
19*5b7d54d4SAlex Bennée #include "exec/gdbstub.h"
20*5b7d54d4SAlex Bennée #include "gdbstub/enums.h"
21275307aaSMarkus Armbruster #include "monitor/hmp.h"
22ad6f932fSPaolo Bonzini #include "qemu/help_option.h"
23cbf81997SMarkus Armbruster #include "monitor/monitor-internal.h"
24f1b3ccfaSKevin Wolf #include "qapi/error.h"
25fa4dcf57SKevin Wolf #include "qapi/qapi-commands-control.h"
261935b7eaSPaolo Bonzini #include "qapi/qapi-commands-machine.h"
27f1b3ccfaSKevin Wolf #include "qapi/qapi-commands-misc.h"
28f1b3ccfaSKevin Wolf #include "qapi/qmp/qdict.h"
29f1b3ccfaSKevin Wolf #include "qemu/cutils.h"
30cbf81997SMarkus Armbruster #include "qemu/log.h"
31cbf81997SMarkus Armbruster #include "sysemu/sysemu.h"
32f1b3ccfaSKevin Wolf 
hmp_handle_error(Monitor * mon,Error * err)330ca117a7SDaniel P. Berrangé bool hmp_handle_error(Monitor *mon, Error *err)
34f1b3ccfaSKevin Wolf {
35187c6147SVladimir Sementsov-Ogievskiy     if (err) {
36187c6147SVladimir Sementsov-Ogievskiy         error_reportf_err(err, "Error: ");
370ca117a7SDaniel P. Berrangé         return true;
38f1b3ccfaSKevin Wolf     }
390ca117a7SDaniel P. Berrangé     return false;
40f1b3ccfaSKevin Wolf }
41f1b3ccfaSKevin Wolf 
4208528271SDr. David Alan Gilbert /*
430d79271bSMarkus Armbruster  * Split @str at comma.
440d79271bSMarkus Armbruster  * A null @str defaults to "".
4508528271SDr. David Alan Gilbert  */
hmp_split_at_comma(const char * str)460d79271bSMarkus Armbruster strList *hmp_split_at_comma(const char *str)
4708528271SDr. David Alan Gilbert {
480d79271bSMarkus Armbruster     char **split = g_strsplit(str ?: "", ",", -1);
4908528271SDr. David Alan Gilbert     strList *res = NULL;
50c3033fd3SEric Blake     strList **tail = &res;
510d79271bSMarkus Armbruster     int i;
5208528271SDr. David Alan Gilbert 
530d79271bSMarkus Armbruster     for (i = 0; split[i]; i++) {
540d79271bSMarkus Armbruster         QAPI_LIST_APPEND(tail, split[i]);
5508528271SDr. David Alan Gilbert     }
5608528271SDr. David Alan Gilbert 
570d79271bSMarkus Armbruster     g_free(split);
5808528271SDr. David Alan Gilbert     return res;
5908528271SDr. David Alan Gilbert }
6008528271SDr. David Alan Gilbert 
hmp_info_name(Monitor * mon,const QDict * qdict)61f1b3ccfaSKevin Wolf void hmp_info_name(Monitor *mon, const QDict *qdict)
62f1b3ccfaSKevin Wolf {
63f1b3ccfaSKevin Wolf     NameInfo *info;
64f1b3ccfaSKevin Wolf 
65f1b3ccfaSKevin Wolf     info = qmp_query_name(NULL);
669492718bSMarkus Armbruster     if (info->name) {
67f1b3ccfaSKevin Wolf         monitor_printf(mon, "%s\n", info->name);
68f1b3ccfaSKevin Wolf     }
69f1b3ccfaSKevin Wolf     qapi_free_NameInfo(info);
70f1b3ccfaSKevin Wolf }
71f1b3ccfaSKevin Wolf 
hmp_info_version(Monitor * mon,const QDict * qdict)72f1b3ccfaSKevin Wolf void hmp_info_version(Monitor *mon, const QDict *qdict)
73f1b3ccfaSKevin Wolf {
74f1b3ccfaSKevin Wolf     VersionInfo *info;
75f1b3ccfaSKevin Wolf 
76f1b3ccfaSKevin Wolf     info = qmp_query_version(NULL);
77f1b3ccfaSKevin Wolf 
78f1b3ccfaSKevin Wolf     monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
79f1b3ccfaSKevin Wolf                    info->qemu->major, info->qemu->minor, info->qemu->micro,
80f1b3ccfaSKevin Wolf                    info->package);
81f1b3ccfaSKevin Wolf 
82f1b3ccfaSKevin Wolf     qapi_free_VersionInfo(info);
83f1b3ccfaSKevin Wolf }
84f1b3ccfaSKevin Wolf 
hmp_quit(Monitor * mon,const QDict * qdict)85f1b3ccfaSKevin Wolf void hmp_quit(Monitor *mon, const QDict *qdict)
86f1b3ccfaSKevin Wolf {
87f1b3ccfaSKevin Wolf     monitor_suspend(mon);
88f1b3ccfaSKevin Wolf     qmp_quit(NULL);
89f1b3ccfaSKevin Wolf }
90f1b3ccfaSKevin Wolf 
hmp_stop(Monitor * mon,const QDict * qdict)91f1b3ccfaSKevin Wolf void hmp_stop(Monitor *mon, const QDict *qdict)
92f1b3ccfaSKevin Wolf {
93f1b3ccfaSKevin Wolf     qmp_stop(NULL);
94f1b3ccfaSKevin Wolf }
95f1b3ccfaSKevin Wolf 
hmp_sync_profile(Monitor * mon,const QDict * qdict)96f1b3ccfaSKevin Wolf void hmp_sync_profile(Monitor *mon, const QDict *qdict)
97f1b3ccfaSKevin Wolf {
98f1b3ccfaSKevin Wolf     const char *op = qdict_get_try_str(qdict, "op");
99f1b3ccfaSKevin Wolf 
100f1b3ccfaSKevin Wolf     if (op == NULL) {
101f1b3ccfaSKevin Wolf         bool on = qsp_is_enabled();
102f1b3ccfaSKevin Wolf 
103f1b3ccfaSKevin Wolf         monitor_printf(mon, "sync-profile is %s\n", on ? "on" : "off");
104f1b3ccfaSKevin Wolf         return;
105f1b3ccfaSKevin Wolf     }
106f1b3ccfaSKevin Wolf     if (!strcmp(op, "on")) {
107f1b3ccfaSKevin Wolf         qsp_enable();
108f1b3ccfaSKevin Wolf     } else if (!strcmp(op, "off")) {
109f1b3ccfaSKevin Wolf         qsp_disable();
110f1b3ccfaSKevin Wolf     } else if (!strcmp(op, "reset")) {
111f1b3ccfaSKevin Wolf         qsp_reset();
112f1b3ccfaSKevin Wolf     } else {
113f1b3ccfaSKevin Wolf         Error *err = NULL;
114f1b3ccfaSKevin Wolf 
1157200fb21SMarkus Armbruster         error_setg(&err, "invalid parameter '%s',"
1167200fb21SMarkus Armbruster                    " expecting 'on', 'off', or 'reset'", op);
117187c6147SVladimir Sementsov-Ogievskiy         hmp_handle_error(mon, err);
118f1b3ccfaSKevin Wolf     }
119f1b3ccfaSKevin Wolf }
120f1b3ccfaSKevin Wolf 
hmp_exit_preconfig(Monitor * mon,const QDict * qdict)121f1b3ccfaSKevin Wolf void hmp_exit_preconfig(Monitor *mon, const QDict *qdict)
122f1b3ccfaSKevin Wolf {
123f1b3ccfaSKevin Wolf     Error *err = NULL;
124f1b3ccfaSKevin Wolf 
125f1b3ccfaSKevin Wolf     qmp_x_exit_preconfig(&err);
126187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
127f1b3ccfaSKevin Wolf }
128f1b3ccfaSKevin Wolf 
hmp_cpu(Monitor * mon,const QDict * qdict)129f1b3ccfaSKevin Wolf void hmp_cpu(Monitor *mon, const QDict *qdict)
130f1b3ccfaSKevin Wolf {
131f1b3ccfaSKevin Wolf     int64_t cpu_index;
132f1b3ccfaSKevin Wolf 
133f1b3ccfaSKevin Wolf     /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
134f1b3ccfaSKevin Wolf             use it are converted to the QAPI */
135f1b3ccfaSKevin Wolf     cpu_index = qdict_get_int(qdict, "index");
136dcba65f8SKevin Wolf     if (monitor_set_cpu(mon, cpu_index) < 0) {
137f1b3ccfaSKevin Wolf         monitor_printf(mon, "invalid CPU index\n");
138f1b3ccfaSKevin Wolf     }
139f1b3ccfaSKevin Wolf }
140f1b3ccfaSKevin Wolf 
hmp_cont(Monitor * mon,const QDict * qdict)141f1b3ccfaSKevin Wolf void hmp_cont(Monitor *mon, const QDict *qdict)
142f1b3ccfaSKevin Wolf {
143f1b3ccfaSKevin Wolf     Error *err = NULL;
144f1b3ccfaSKevin Wolf 
145f1b3ccfaSKevin Wolf     qmp_cont(&err);
146187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
147f1b3ccfaSKevin Wolf }
148f1b3ccfaSKevin Wolf 
hmp_change(Monitor * mon,const QDict * qdict)149f1b3ccfaSKevin Wolf void hmp_change(Monitor *mon, const QDict *qdict)
150f1b3ccfaSKevin Wolf {
151f1b3ccfaSKevin Wolf     const char *device = qdict_get_str(qdict, "device");
152f1b3ccfaSKevin Wolf     const char *target = qdict_get_str(qdict, "target");
153f1b3ccfaSKevin Wolf     const char *arg = qdict_get_try_str(qdict, "arg");
154f1b3ccfaSKevin Wolf     const char *read_only = qdict_get_try_str(qdict, "read-only-mode");
15580dd5affSDenis V. Lunev     bool force = qdict_get_try_bool(qdict, "force", false);
156f1b3ccfaSKevin Wolf     Error *err = NULL;
157f1b3ccfaSKevin Wolf 
158f1b3ccfaSKevin Wolf #ifdef CONFIG_VNC
159f1b3ccfaSKevin Wolf     if (strcmp(device, "vnc") == 0) {
160f916a175SMarkus Armbruster         hmp_change_vnc(mon, device, target, arg, read_only, force, &err);
161f1b3ccfaSKevin Wolf     } else
162f1b3ccfaSKevin Wolf #endif
163f1b3ccfaSKevin Wolf     {
164fa1d2f8fSMarkus Armbruster         hmp_change_medium(mon, device, target, arg, read_only, force, &err);
165f1b3ccfaSKevin Wolf     }
166f1b3ccfaSKevin Wolf 
167187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
168f1b3ccfaSKevin Wolf }
169f1b3ccfaSKevin Wolf 
1704bf21c7fSMarc-André Lureau #ifdef CONFIG_POSIX
hmp_getfd(Monitor * mon,const QDict * qdict)171f1b3ccfaSKevin Wolf void hmp_getfd(Monitor *mon, const QDict *qdict)
172f1b3ccfaSKevin Wolf {
173f1b3ccfaSKevin Wolf     const char *fdname = qdict_get_str(qdict, "fdname");
174f1b3ccfaSKevin Wolf     Error *err = NULL;
175f1b3ccfaSKevin Wolf 
176f1b3ccfaSKevin Wolf     qmp_getfd(fdname, &err);
177187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
178f1b3ccfaSKevin Wolf }
1794bf21c7fSMarc-André Lureau #endif
180f1b3ccfaSKevin Wolf 
hmp_closefd(Monitor * mon,const QDict * qdict)181f1b3ccfaSKevin Wolf void hmp_closefd(Monitor *mon, const QDict *qdict)
182f1b3ccfaSKevin Wolf {
183f1b3ccfaSKevin Wolf     const char *fdname = qdict_get_str(qdict, "fdname");
184f1b3ccfaSKevin Wolf     Error *err = NULL;
185f1b3ccfaSKevin Wolf 
186f1b3ccfaSKevin Wolf     qmp_closefd(fdname, &err);
187187c6147SVladimir Sementsov-Ogievskiy     hmp_handle_error(mon, err);
188f1b3ccfaSKevin Wolf }
189f1b3ccfaSKevin Wolf 
hmp_info_iothreads(Monitor * mon,const QDict * qdict)190f1b3ccfaSKevin Wolf void hmp_info_iothreads(Monitor *mon, const QDict *qdict)
191f1b3ccfaSKevin Wolf {
192f1b3ccfaSKevin Wolf     IOThreadInfoList *info_list = qmp_query_iothreads(NULL);
193f1b3ccfaSKevin Wolf     IOThreadInfoList *info;
194f1b3ccfaSKevin Wolf     IOThreadInfo *value;
195f1b3ccfaSKevin Wolf 
196f1b3ccfaSKevin Wolf     for (info = info_list; info; info = info->next) {
197f1b3ccfaSKevin Wolf         value = info->value;
198f1b3ccfaSKevin Wolf         monitor_printf(mon, "%s:\n", value->id);
199f1b3ccfaSKevin Wolf         monitor_printf(mon, "  thread_id=%" PRId64 "\n", value->thread_id);
200f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-max-ns=%" PRId64 "\n", value->poll_max_ns);
201f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-grow=%" PRId64 "\n", value->poll_grow);
202f1b3ccfaSKevin Wolf         monitor_printf(mon, "  poll-shrink=%" PRId64 "\n", value->poll_shrink);
2031793ad02SStefano Garzarella         monitor_printf(mon, "  aio-max-batch=%" PRId64 "\n",
2041793ad02SStefano Garzarella                        value->aio_max_batch);
205f1b3ccfaSKevin Wolf     }
206f1b3ccfaSKevin Wolf 
207f1b3ccfaSKevin Wolf     qapi_free_IOThreadInfoList(info_list);
208f1b3ccfaSKevin Wolf }
209cbf81997SMarkus Armbruster 
hmp_help(Monitor * mon,const QDict * qdict)210cbf81997SMarkus Armbruster void hmp_help(Monitor *mon, const QDict *qdict)
211cbf81997SMarkus Armbruster {
212cbf81997SMarkus Armbruster     hmp_help_cmd(mon, qdict_get_try_str(qdict, "name"));
213cbf81997SMarkus Armbruster }
214cbf81997SMarkus Armbruster 
hmp_info_help(Monitor * mon,const QDict * qdict)215cbf81997SMarkus Armbruster void hmp_info_help(Monitor *mon, const QDict *qdict)
216cbf81997SMarkus Armbruster {
217cbf81997SMarkus Armbruster     hmp_help_cmd(mon, "info");
218cbf81997SMarkus Armbruster }
219cbf81997SMarkus Armbruster 
hmp_info_sync_profile(Monitor * mon,const QDict * qdict)220cbf81997SMarkus Armbruster void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
221cbf81997SMarkus Armbruster {
222cbf81997SMarkus Armbruster     int64_t max = qdict_get_try_int(qdict, "max", 10);
223cbf81997SMarkus Armbruster     bool mean = qdict_get_try_bool(qdict, "mean", false);
224cbf81997SMarkus Armbruster     bool coalesce = !qdict_get_try_bool(qdict, "no_coalesce", false);
225cbf81997SMarkus Armbruster     enum QSPSortBy sort_by;
226cbf81997SMarkus Armbruster 
227cbf81997SMarkus Armbruster     sort_by = mean ? QSP_SORT_BY_AVG_WAIT_TIME : QSP_SORT_BY_TOTAL_WAIT_TIME;
228cbf81997SMarkus Armbruster     qsp_report(max, sort_by, coalesce);
229cbf81997SMarkus Armbruster }
230cbf81997SMarkus Armbruster 
hmp_info_history(Monitor * mon,const QDict * qdict)231cbf81997SMarkus Armbruster void hmp_info_history(Monitor *mon, const QDict *qdict)
232cbf81997SMarkus Armbruster {
233cbf81997SMarkus Armbruster     MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
234cbf81997SMarkus Armbruster     int i;
235cbf81997SMarkus Armbruster     const char *str;
236cbf81997SMarkus Armbruster 
237cbf81997SMarkus Armbruster     if (!hmp_mon->rs) {
238cbf81997SMarkus Armbruster         return;
239cbf81997SMarkus Armbruster     }
240cbf81997SMarkus Armbruster     i = 0;
241cbf81997SMarkus Armbruster     for(;;) {
242cbf81997SMarkus Armbruster         str = readline_get_history(hmp_mon->rs, i);
243cbf81997SMarkus Armbruster         if (!str) {
244cbf81997SMarkus Armbruster             break;
245cbf81997SMarkus Armbruster         }
246cbf81997SMarkus Armbruster         monitor_printf(mon, "%d: '%s'\n", i, str);
247cbf81997SMarkus Armbruster         i++;
248cbf81997SMarkus Armbruster     }
249cbf81997SMarkus Armbruster }
250cbf81997SMarkus Armbruster 
hmp_logfile(Monitor * mon,const QDict * qdict)251cbf81997SMarkus Armbruster void hmp_logfile(Monitor *mon, const QDict *qdict)
252cbf81997SMarkus Armbruster {
253cbf81997SMarkus Armbruster     Error *err = NULL;
254cbf81997SMarkus Armbruster 
255cbf81997SMarkus Armbruster     if (!qemu_set_log_filename(qdict_get_str(qdict, "filename"), &err)) {
256cbf81997SMarkus Armbruster         error_report_err(err);
257cbf81997SMarkus Armbruster     }
258cbf81997SMarkus Armbruster }
259cbf81997SMarkus Armbruster 
hmp_log(Monitor * mon,const QDict * qdict)260cbf81997SMarkus Armbruster void hmp_log(Monitor *mon, const QDict *qdict)
261cbf81997SMarkus Armbruster {
262cbf81997SMarkus Armbruster     int mask;
263cbf81997SMarkus Armbruster     const char *items = qdict_get_str(qdict, "items");
264cbf81997SMarkus Armbruster     Error *err = NULL;
265cbf81997SMarkus Armbruster 
266cbf81997SMarkus Armbruster     if (!strcmp(items, "none")) {
267cbf81997SMarkus Armbruster         mask = 0;
268cbf81997SMarkus Armbruster     } else {
269cbf81997SMarkus Armbruster         mask = qemu_str_to_log_mask(items);
270cbf81997SMarkus Armbruster         if (!mask) {
271cbf81997SMarkus Armbruster             hmp_help_cmd(mon, "log");
272cbf81997SMarkus Armbruster             return;
273cbf81997SMarkus Armbruster         }
274cbf81997SMarkus Armbruster     }
275cbf81997SMarkus Armbruster 
276cbf81997SMarkus Armbruster     if (!qemu_set_log(mask, &err)) {
277cbf81997SMarkus Armbruster         error_report_err(err);
278cbf81997SMarkus Armbruster     }
279cbf81997SMarkus Armbruster }
280cbf81997SMarkus Armbruster 
hmp_gdbserver(Monitor * mon,const QDict * qdict)281cbf81997SMarkus Armbruster void hmp_gdbserver(Monitor *mon, const QDict *qdict)
282cbf81997SMarkus Armbruster {
283cbf81997SMarkus Armbruster     const char *device = qdict_get_try_str(qdict, "device");
284cbf81997SMarkus Armbruster     if (!device) {
285cbf81997SMarkus Armbruster         device = "tcp::" DEFAULT_GDBSTUB_PORT;
286cbf81997SMarkus Armbruster     }
287cbf81997SMarkus Armbruster 
288cbf81997SMarkus Armbruster     if (gdbserver_start(device) < 0) {
289cbf81997SMarkus Armbruster         monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
290cbf81997SMarkus Armbruster                        device);
291cbf81997SMarkus Armbruster     } else if (strcmp(device, "none") == 0) {
292cbf81997SMarkus Armbruster         monitor_printf(mon, "Disabled gdbserver\n");
293cbf81997SMarkus Armbruster     } else {
294cbf81997SMarkus Armbruster         monitor_printf(mon, "Waiting for gdb connection on device '%s'\n",
295cbf81997SMarkus Armbruster                        device);
296cbf81997SMarkus Armbruster     }
297cbf81997SMarkus Armbruster }
298cbf81997SMarkus Armbruster 
hmp_print(Monitor * mon,const QDict * qdict)299cbf81997SMarkus Armbruster void hmp_print(Monitor *mon, const QDict *qdict)
300cbf81997SMarkus Armbruster {
301cbf81997SMarkus Armbruster     int format = qdict_get_int(qdict, "format");
302cbf81997SMarkus Armbruster     hwaddr val = qdict_get_int(qdict, "val");
303cbf81997SMarkus Armbruster 
304cbf81997SMarkus Armbruster     switch(format) {
305cbf81997SMarkus Armbruster     case 'o':
306cbf81997SMarkus Armbruster         monitor_printf(mon, "%#" HWADDR_PRIo, val);
307cbf81997SMarkus Armbruster         break;
308cbf81997SMarkus Armbruster     case 'x':
309cbf81997SMarkus Armbruster         monitor_printf(mon, "%#" HWADDR_PRIx, val);
310cbf81997SMarkus Armbruster         break;
311cbf81997SMarkus Armbruster     case 'u':
312cbf81997SMarkus Armbruster         monitor_printf(mon, "%" HWADDR_PRIu, val);
313cbf81997SMarkus Armbruster         break;
314cbf81997SMarkus Armbruster     default:
315cbf81997SMarkus Armbruster     case 'd':
316cbf81997SMarkus Armbruster         monitor_printf(mon, "%" HWADDR_PRId, val);
317cbf81997SMarkus Armbruster         break;
318cbf81997SMarkus Armbruster     case 'c':
319cbf81997SMarkus Armbruster         monitor_printc(mon, val);
320cbf81997SMarkus Armbruster         break;
321cbf81997SMarkus Armbruster     }
322cbf81997SMarkus Armbruster     monitor_printf(mon, "\n");
323cbf81997SMarkus Armbruster }
324cbf81997SMarkus Armbruster 
hmp_sum(Monitor * mon,const QDict * qdict)325cbf81997SMarkus Armbruster void hmp_sum(Monitor *mon, const QDict *qdict)
326cbf81997SMarkus Armbruster {
327cbf81997SMarkus Armbruster     uint32_t addr;
328cbf81997SMarkus Armbruster     uint16_t sum;
329cbf81997SMarkus Armbruster     uint32_t start = qdict_get_int(qdict, "start");
330cbf81997SMarkus Armbruster     uint32_t size = qdict_get_int(qdict, "size");
331cbf81997SMarkus Armbruster 
332cbf81997SMarkus Armbruster     sum = 0;
333cbf81997SMarkus Armbruster     for(addr = start; addr < (start + size); addr++) {
334cbf81997SMarkus Armbruster         uint8_t val = address_space_ldub(&address_space_memory, addr,
335cbf81997SMarkus Armbruster                                          MEMTXATTRS_UNSPECIFIED, NULL);
336cbf81997SMarkus Armbruster         /* BSD sum algorithm ('sum' Unix command) */
337cbf81997SMarkus Armbruster         sum = (sum >> 1) | (sum << 15);
338cbf81997SMarkus Armbruster         sum += val;
339cbf81997SMarkus Armbruster     }
340cbf81997SMarkus Armbruster     monitor_printf(mon, "%05d\n", sum);
341cbf81997SMarkus Armbruster }
342cbf81997SMarkus Armbruster 
hmp_ioport_read(Monitor * mon,const QDict * qdict)343cbf81997SMarkus Armbruster void hmp_ioport_read(Monitor *mon, const QDict *qdict)
344cbf81997SMarkus Armbruster {
345cbf81997SMarkus Armbruster     int size = qdict_get_int(qdict, "size");
346cbf81997SMarkus Armbruster     int addr = qdict_get_int(qdict, "addr");
347cbf81997SMarkus Armbruster     int has_index = qdict_haskey(qdict, "index");
348cbf81997SMarkus Armbruster     uint32_t val;
349cbf81997SMarkus Armbruster     int suffix;
350cbf81997SMarkus Armbruster 
351cbf81997SMarkus Armbruster     if (has_index) {
352cbf81997SMarkus Armbruster         int index = qdict_get_int(qdict, "index");
353cbf81997SMarkus Armbruster         cpu_outb(addr & IOPORTS_MASK, index & 0xff);
354cbf81997SMarkus Armbruster         addr++;
355cbf81997SMarkus Armbruster     }
356cbf81997SMarkus Armbruster     addr &= 0xffff;
357cbf81997SMarkus Armbruster 
358cbf81997SMarkus Armbruster     switch(size) {
359cbf81997SMarkus Armbruster     default:
360cbf81997SMarkus Armbruster     case 1:
361cbf81997SMarkus Armbruster         val = cpu_inb(addr);
362cbf81997SMarkus Armbruster         suffix = 'b';
363cbf81997SMarkus Armbruster         break;
364cbf81997SMarkus Armbruster     case 2:
365cbf81997SMarkus Armbruster         val = cpu_inw(addr);
366cbf81997SMarkus Armbruster         suffix = 'w';
367cbf81997SMarkus Armbruster         break;
368cbf81997SMarkus Armbruster     case 4:
369cbf81997SMarkus Armbruster         val = cpu_inl(addr);
370cbf81997SMarkus Armbruster         suffix = 'l';
371cbf81997SMarkus Armbruster         break;
372cbf81997SMarkus Armbruster     }
373cbf81997SMarkus Armbruster     monitor_printf(mon, "port%c[0x%04x] = 0x%0*x\n",
374cbf81997SMarkus Armbruster                    suffix, addr, size * 2, val);
375cbf81997SMarkus Armbruster }
376cbf81997SMarkus Armbruster 
hmp_ioport_write(Monitor * mon,const QDict * qdict)377cbf81997SMarkus Armbruster void hmp_ioport_write(Monitor *mon, const QDict *qdict)
378cbf81997SMarkus Armbruster {
379cbf81997SMarkus Armbruster     int size = qdict_get_int(qdict, "size");
380cbf81997SMarkus Armbruster     int addr = qdict_get_int(qdict, "addr");
381cbf81997SMarkus Armbruster     int val = qdict_get_int(qdict, "val");
382cbf81997SMarkus Armbruster 
383cbf81997SMarkus Armbruster     addr &= IOPORTS_MASK;
384cbf81997SMarkus Armbruster 
385cbf81997SMarkus Armbruster     switch (size) {
386cbf81997SMarkus Armbruster     default:
387cbf81997SMarkus Armbruster     case 1:
388cbf81997SMarkus Armbruster         cpu_outb(addr, val);
389cbf81997SMarkus Armbruster         break;
390cbf81997SMarkus Armbruster     case 2:
391cbf81997SMarkus Armbruster         cpu_outw(addr, val);
392cbf81997SMarkus Armbruster         break;
393cbf81997SMarkus Armbruster     case 4:
394cbf81997SMarkus Armbruster         cpu_outl(addr, val);
395cbf81997SMarkus Armbruster         break;
396cbf81997SMarkus Armbruster     }
397cbf81997SMarkus Armbruster }
398cbf81997SMarkus Armbruster 
hmp_boot_set(Monitor * mon,const QDict * qdict)399cbf81997SMarkus Armbruster void hmp_boot_set(Monitor *mon, const QDict *qdict)
400cbf81997SMarkus Armbruster {
401cbf81997SMarkus Armbruster     Error *local_err = NULL;
402cbf81997SMarkus Armbruster     const char *bootdevice = qdict_get_str(qdict, "bootdevice");
403cbf81997SMarkus Armbruster 
404cbf81997SMarkus Armbruster     qemu_boot_set(bootdevice, &local_err);
405cbf81997SMarkus Armbruster     if (local_err) {
406cbf81997SMarkus Armbruster         error_report_err(local_err);
407cbf81997SMarkus Armbruster     } else {
408cbf81997SMarkus Armbruster         monitor_printf(mon, "boot device list now set to %s\n", bootdevice);
409cbf81997SMarkus Armbruster     }
410cbf81997SMarkus Armbruster }
411cbf81997SMarkus Armbruster 
hmp_info_mtree(Monitor * mon,const QDict * qdict)412cbf81997SMarkus Armbruster void hmp_info_mtree(Monitor *mon, const QDict *qdict)
413cbf81997SMarkus Armbruster {
414cbf81997SMarkus Armbruster     bool flatview = qdict_get_try_bool(qdict, "flatview", false);
415cbf81997SMarkus Armbruster     bool dispatch_tree = qdict_get_try_bool(qdict, "dispatch_tree", false);
416cbf81997SMarkus Armbruster     bool owner = qdict_get_try_bool(qdict, "owner", false);
417cbf81997SMarkus Armbruster     bool disabled = qdict_get_try_bool(qdict, "disabled", false);
418cbf81997SMarkus Armbruster 
419cbf81997SMarkus Armbruster     mtree_info(flatview, dispatch_tree, owner, disabled);
420cbf81997SMarkus Armbruster }
4211935b7eaSPaolo Bonzini 
4221935b7eaSPaolo Bonzini #if defined(CONFIG_FDT)
hmp_dumpdtb(Monitor * mon,const QDict * qdict)4231935b7eaSPaolo Bonzini void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
4241935b7eaSPaolo Bonzini {
4251935b7eaSPaolo Bonzini     const char *filename = qdict_get_str(qdict, "filename");
4261935b7eaSPaolo Bonzini     Error *local_err = NULL;
4271935b7eaSPaolo Bonzini 
4281935b7eaSPaolo Bonzini     qmp_dumpdtb(filename, &local_err);
4291935b7eaSPaolo Bonzini 
4301935b7eaSPaolo Bonzini     if (hmp_handle_error(mon, local_err)) {
4311935b7eaSPaolo Bonzini         return;
4321935b7eaSPaolo Bonzini     }
4331935b7eaSPaolo Bonzini 
4341935b7eaSPaolo Bonzini     monitor_printf(mon, "dtb dumped to %s", filename);
4351935b7eaSPaolo Bonzini }
4361935b7eaSPaolo Bonzini #endif
437