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