Statistics
| Branch: | Revision:

root / hmp.c @ 4144f122

History | View | Annotate | Download (32.4 kB)

1 48a32bed Anthony Liguori
/*
2 48a32bed Anthony Liguori
 * Human Monitor Interface
3 48a32bed Anthony Liguori
 *
4 48a32bed Anthony Liguori
 * Copyright IBM, Corp. 2011
5 48a32bed Anthony Liguori
 *
6 48a32bed Anthony Liguori
 * Authors:
7 48a32bed Anthony Liguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
8 48a32bed Anthony Liguori
 *
9 48a32bed Anthony Liguori
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10 48a32bed Anthony Liguori
 * the COPYING file in the top-level directory.
11 48a32bed Anthony Liguori
 *
12 6b620ca3 Paolo Bonzini
 * Contributions after 2012-01-13 are licensed under the terms of the
13 6b620ca3 Paolo Bonzini
 * GNU GPL, version 2 or (at your option) any later version.
14 48a32bed Anthony Liguori
 */
15 48a32bed Anthony Liguori
16 48a32bed Anthony Liguori
#include "hmp.h"
17 928059a3 Luiz Capitulino
#include "net.h"
18 928059a3 Luiz Capitulino
#include "qemu-option.h"
19 e1c37d0e Luiz Capitulino
#include "qemu-timer.h"
20 48a32bed Anthony Liguori
#include "qmp-commands.h"
21 37003adf Paolo Bonzini
#include "monitor.h"
22 48a32bed Anthony Liguori
23 0cfd6a9a Luiz Capitulino
static void hmp_handle_error(Monitor *mon, Error **errp)
24 0cfd6a9a Luiz Capitulino
{
25 0cfd6a9a Luiz Capitulino
    if (error_is_set(errp)) {
26 0cfd6a9a Luiz Capitulino
        monitor_printf(mon, "%s\n", error_get_pretty(*errp));
27 0cfd6a9a Luiz Capitulino
        error_free(*errp);
28 0cfd6a9a Luiz Capitulino
    }
29 0cfd6a9a Luiz Capitulino
}
30 0cfd6a9a Luiz Capitulino
31 48a32bed Anthony Liguori
void hmp_info_name(Monitor *mon)
32 48a32bed Anthony Liguori
{
33 48a32bed Anthony Liguori
    NameInfo *info;
34 48a32bed Anthony Liguori
35 48a32bed Anthony Liguori
    info = qmp_query_name(NULL);
36 48a32bed Anthony Liguori
    if (info->has_name) {
37 48a32bed Anthony Liguori
        monitor_printf(mon, "%s\n", info->name);
38 48a32bed Anthony Liguori
    }
39 48a32bed Anthony Liguori
    qapi_free_NameInfo(info);
40 48a32bed Anthony Liguori
}
41 b9c15f16 Luiz Capitulino
42 b9c15f16 Luiz Capitulino
void hmp_info_version(Monitor *mon)
43 b9c15f16 Luiz Capitulino
{
44 b9c15f16 Luiz Capitulino
    VersionInfo *info;
45 b9c15f16 Luiz Capitulino
46 b9c15f16 Luiz Capitulino
    info = qmp_query_version(NULL);
47 b9c15f16 Luiz Capitulino
48 b9c15f16 Luiz Capitulino
    monitor_printf(mon, "%" PRId64 ".%" PRId64 ".%" PRId64 "%s\n",
49 b9c15f16 Luiz Capitulino
                   info->qemu.major, info->qemu.minor, info->qemu.micro,
50 b9c15f16 Luiz Capitulino
                   info->package);
51 b9c15f16 Luiz Capitulino
52 b9c15f16 Luiz Capitulino
    qapi_free_VersionInfo(info);
53 b9c15f16 Luiz Capitulino
}
54 292a2602 Luiz Capitulino
55 292a2602 Luiz Capitulino
void hmp_info_kvm(Monitor *mon)
56 292a2602 Luiz Capitulino
{
57 292a2602 Luiz Capitulino
    KvmInfo *info;
58 292a2602 Luiz Capitulino
59 292a2602 Luiz Capitulino
    info = qmp_query_kvm(NULL);
60 292a2602 Luiz Capitulino
    monitor_printf(mon, "kvm support: ");
61 292a2602 Luiz Capitulino
    if (info->present) {
62 292a2602 Luiz Capitulino
        monitor_printf(mon, "%s\n", info->enabled ? "enabled" : "disabled");
63 292a2602 Luiz Capitulino
    } else {
64 292a2602 Luiz Capitulino
        monitor_printf(mon, "not compiled\n");
65 292a2602 Luiz Capitulino
    }
66 292a2602 Luiz Capitulino
67 292a2602 Luiz Capitulino
    qapi_free_KvmInfo(info);
68 292a2602 Luiz Capitulino
}
69 292a2602 Luiz Capitulino
70 1fa9a5e4 Luiz Capitulino
void hmp_info_status(Monitor *mon)
71 1fa9a5e4 Luiz Capitulino
{
72 1fa9a5e4 Luiz Capitulino
    StatusInfo *info;
73 1fa9a5e4 Luiz Capitulino
74 1fa9a5e4 Luiz Capitulino
    info = qmp_query_status(NULL);
75 1fa9a5e4 Luiz Capitulino
76 1fa9a5e4 Luiz Capitulino
    monitor_printf(mon, "VM status: %s%s",
77 1fa9a5e4 Luiz Capitulino
                   info->running ? "running" : "paused",
78 1fa9a5e4 Luiz Capitulino
                   info->singlestep ? " (single step mode)" : "");
79 1fa9a5e4 Luiz Capitulino
80 1fa9a5e4 Luiz Capitulino
    if (!info->running && info->status != RUN_STATE_PAUSED) {
81 1fa9a5e4 Luiz Capitulino
        monitor_printf(mon, " (%s)", RunState_lookup[info->status]);
82 1fa9a5e4 Luiz Capitulino
    }
83 1fa9a5e4 Luiz Capitulino
84 1fa9a5e4 Luiz Capitulino
    monitor_printf(mon, "\n");
85 1fa9a5e4 Luiz Capitulino
86 1fa9a5e4 Luiz Capitulino
    qapi_free_StatusInfo(info);
87 1fa9a5e4 Luiz Capitulino
}
88 1fa9a5e4 Luiz Capitulino
89 efab767e Luiz Capitulino
void hmp_info_uuid(Monitor *mon)
90 efab767e Luiz Capitulino
{
91 efab767e Luiz Capitulino
    UuidInfo *info;
92 efab767e Luiz Capitulino
93 efab767e Luiz Capitulino
    info = qmp_query_uuid(NULL);
94 efab767e Luiz Capitulino
    monitor_printf(mon, "%s\n", info->UUID);
95 efab767e Luiz Capitulino
    qapi_free_UuidInfo(info);
96 efab767e Luiz Capitulino
}
97 c5a415a0 Luiz Capitulino
98 c5a415a0 Luiz Capitulino
void hmp_info_chardev(Monitor *mon)
99 c5a415a0 Luiz Capitulino
{
100 c5a415a0 Luiz Capitulino
    ChardevInfoList *char_info, *info;
101 c5a415a0 Luiz Capitulino
102 c5a415a0 Luiz Capitulino
    char_info = qmp_query_chardev(NULL);
103 c5a415a0 Luiz Capitulino
    for (info = char_info; info; info = info->next) {
104 c5a415a0 Luiz Capitulino
        monitor_printf(mon, "%s: filename=%s\n", info->value->label,
105 c5a415a0 Luiz Capitulino
                                                 info->value->filename);
106 c5a415a0 Luiz Capitulino
    }
107 c5a415a0 Luiz Capitulino
108 c5a415a0 Luiz Capitulino
    qapi_free_ChardevInfoList(char_info);
109 c5a415a0 Luiz Capitulino
}
110 7a7f325e Luiz Capitulino
111 e235cec3 Luiz Capitulino
void hmp_info_mice(Monitor *mon)
112 e235cec3 Luiz Capitulino
{
113 e235cec3 Luiz Capitulino
    MouseInfoList *mice_list, *mouse;
114 e235cec3 Luiz Capitulino
115 e235cec3 Luiz Capitulino
    mice_list = qmp_query_mice(NULL);
116 e235cec3 Luiz Capitulino
    if (!mice_list) {
117 e235cec3 Luiz Capitulino
        monitor_printf(mon, "No mouse devices connected\n");
118 e235cec3 Luiz Capitulino
        return;
119 e235cec3 Luiz Capitulino
    }
120 e235cec3 Luiz Capitulino
121 e235cec3 Luiz Capitulino
    for (mouse = mice_list; mouse; mouse = mouse->next) {
122 e235cec3 Luiz Capitulino
        monitor_printf(mon, "%c Mouse #%" PRId64 ": %s%s\n",
123 e235cec3 Luiz Capitulino
                       mouse->value->current ? '*' : ' ',
124 e235cec3 Luiz Capitulino
                       mouse->value->index, mouse->value->name,
125 e235cec3 Luiz Capitulino
                       mouse->value->absolute ? " (absolute)" : "");
126 e235cec3 Luiz Capitulino
    }
127 e235cec3 Luiz Capitulino
128 e235cec3 Luiz Capitulino
    qapi_free_MouseInfoList(mice_list);
129 e235cec3 Luiz Capitulino
}
130 e235cec3 Luiz Capitulino
131 791e7c82 Luiz Capitulino
void hmp_info_migrate(Monitor *mon)
132 791e7c82 Luiz Capitulino
{
133 791e7c82 Luiz Capitulino
    MigrationInfo *info;
134 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *caps, *cap;
135 791e7c82 Luiz Capitulino
136 791e7c82 Luiz Capitulino
    info = qmp_query_migrate(NULL);
137 bbf6da32 Orit Wasserman
    caps = qmp_query_migrate_capabilities(NULL);
138 bbf6da32 Orit Wasserman
139 bbf6da32 Orit Wasserman
    /* do not display parameters during setup */
140 bbf6da32 Orit Wasserman
    if (info->has_status && caps) {
141 bbf6da32 Orit Wasserman
        monitor_printf(mon, "capabilities: ");
142 bbf6da32 Orit Wasserman
        for (cap = caps; cap; cap = cap->next) {
143 bbf6da32 Orit Wasserman
            monitor_printf(mon, "%s: %s ",
144 bbf6da32 Orit Wasserman
                           MigrationCapability_lookup[cap->value->capability],
145 bbf6da32 Orit Wasserman
                           cap->value->state ? "on" : "off");
146 bbf6da32 Orit Wasserman
        }
147 bbf6da32 Orit Wasserman
        monitor_printf(mon, "\n");
148 bbf6da32 Orit Wasserman
    }
149 791e7c82 Luiz Capitulino
150 791e7c82 Luiz Capitulino
    if (info->has_status) {
151 791e7c82 Luiz Capitulino
        monitor_printf(mon, "Migration status: %s\n", info->status);
152 791e7c82 Luiz Capitulino
    }
153 791e7c82 Luiz Capitulino
154 791e7c82 Luiz Capitulino
    if (info->has_ram) {
155 791e7c82 Luiz Capitulino
        monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
156 791e7c82 Luiz Capitulino
                       info->ram->transferred >> 10);
157 791e7c82 Luiz Capitulino
        monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
158 791e7c82 Luiz Capitulino
                       info->ram->remaining >> 10);
159 791e7c82 Luiz Capitulino
        monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
160 791e7c82 Luiz Capitulino
                       info->ram->total >> 10);
161 d5f8a570 Juan Quintela
        monitor_printf(mon, "total time: %" PRIu64 " milliseconds\n",
162 d5f8a570 Juan Quintela
                       info->ram->total_time);
163 004d4c10 Orit Wasserman
        monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
164 004d4c10 Orit Wasserman
                       info->ram->duplicate);
165 004d4c10 Orit Wasserman
        monitor_printf(mon, "normal: %" PRIu64 " pages\n",
166 004d4c10 Orit Wasserman
                       info->ram->normal);
167 004d4c10 Orit Wasserman
        monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
168 004d4c10 Orit Wasserman
                       info->ram->normal_bytes >> 10);
169 791e7c82 Luiz Capitulino
    }
170 791e7c82 Luiz Capitulino
171 791e7c82 Luiz Capitulino
    if (info->has_disk) {
172 791e7c82 Luiz Capitulino
        monitor_printf(mon, "transferred disk: %" PRIu64 " kbytes\n",
173 791e7c82 Luiz Capitulino
                       info->disk->transferred >> 10);
174 791e7c82 Luiz Capitulino
        monitor_printf(mon, "remaining disk: %" PRIu64 " kbytes\n",
175 791e7c82 Luiz Capitulino
                       info->disk->remaining >> 10);
176 791e7c82 Luiz Capitulino
        monitor_printf(mon, "total disk: %" PRIu64 " kbytes\n",
177 791e7c82 Luiz Capitulino
                       info->disk->total >> 10);
178 791e7c82 Luiz Capitulino
    }
179 791e7c82 Luiz Capitulino
180 f36d55af Orit Wasserman
    if (info->has_xbzrle_cache) {
181 f36d55af Orit Wasserman
        monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
182 f36d55af Orit Wasserman
                       info->xbzrle_cache->cache_size);
183 f36d55af Orit Wasserman
        monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
184 f36d55af Orit Wasserman
                       info->xbzrle_cache->bytes >> 10);
185 f36d55af Orit Wasserman
        monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
186 f36d55af Orit Wasserman
                       info->xbzrle_cache->pages);
187 f36d55af Orit Wasserman
        monitor_printf(mon, "xbzrle cache miss: %" PRIu64 "\n",
188 f36d55af Orit Wasserman
                       info->xbzrle_cache->cache_miss);
189 f36d55af Orit Wasserman
        monitor_printf(mon, "xbzrle overflow : %" PRIu64 "\n",
190 f36d55af Orit Wasserman
                       info->xbzrle_cache->overflow);
191 f36d55af Orit Wasserman
    }
192 f36d55af Orit Wasserman
193 791e7c82 Luiz Capitulino
    qapi_free_MigrationInfo(info);
194 bbf6da32 Orit Wasserman
    qapi_free_MigrationCapabilityStatusList(caps);
195 bbf6da32 Orit Wasserman
}
196 bbf6da32 Orit Wasserman
197 bbf6da32 Orit Wasserman
void hmp_info_migrate_capabilities(Monitor *mon)
198 bbf6da32 Orit Wasserman
{
199 bbf6da32 Orit Wasserman
    MigrationCapabilityStatusList *caps, *cap;
200 bbf6da32 Orit Wasserman
201 bbf6da32 Orit Wasserman
    caps = qmp_query_migrate_capabilities(NULL);
202 bbf6da32 Orit Wasserman
203 bbf6da32 Orit Wasserman
    if (caps) {
204 bbf6da32 Orit Wasserman
        monitor_printf(mon, "capabilities: ");
205 bbf6da32 Orit Wasserman
        for (cap = caps; cap; cap = cap->next) {
206 bbf6da32 Orit Wasserman
            monitor_printf(mon, "%s: %s ",
207 bbf6da32 Orit Wasserman
                           MigrationCapability_lookup[cap->value->capability],
208 bbf6da32 Orit Wasserman
                           cap->value->state ? "on" : "off");
209 bbf6da32 Orit Wasserman
        }
210 bbf6da32 Orit Wasserman
        monitor_printf(mon, "\n");
211 bbf6da32 Orit Wasserman
    }
212 bbf6da32 Orit Wasserman
213 bbf6da32 Orit Wasserman
    qapi_free_MigrationCapabilityStatusList(caps);
214 791e7c82 Luiz Capitulino
}
215 791e7c82 Luiz Capitulino
216 9e1ba4cc Orit Wasserman
void hmp_info_migrate_cache_size(Monitor *mon)
217 9e1ba4cc Orit Wasserman
{
218 9e1ba4cc Orit Wasserman
    monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
219 9e1ba4cc Orit Wasserman
                   qmp_query_migrate_cache_size(NULL) >> 10);
220 9e1ba4cc Orit Wasserman
}
221 9e1ba4cc Orit Wasserman
222 de0b36b6 Luiz Capitulino
void hmp_info_cpus(Monitor *mon)
223 de0b36b6 Luiz Capitulino
{
224 de0b36b6 Luiz Capitulino
    CpuInfoList *cpu_list, *cpu;
225 de0b36b6 Luiz Capitulino
226 de0b36b6 Luiz Capitulino
    cpu_list = qmp_query_cpus(NULL);
227 de0b36b6 Luiz Capitulino
228 de0b36b6 Luiz Capitulino
    for (cpu = cpu_list; cpu; cpu = cpu->next) {
229 de0b36b6 Luiz Capitulino
        int active = ' ';
230 de0b36b6 Luiz Capitulino
231 de0b36b6 Luiz Capitulino
        if (cpu->value->CPU == monitor_get_cpu_index()) {
232 de0b36b6 Luiz Capitulino
            active = '*';
233 de0b36b6 Luiz Capitulino
        }
234 de0b36b6 Luiz Capitulino
235 de0b36b6 Luiz Capitulino
        monitor_printf(mon, "%c CPU #%" PRId64 ": ", active, cpu->value->CPU);
236 de0b36b6 Luiz Capitulino
237 de0b36b6 Luiz Capitulino
        if (cpu->value->has_pc) {
238 de0b36b6 Luiz Capitulino
            monitor_printf(mon, "pc=0x%016" PRIx64, cpu->value->pc);
239 de0b36b6 Luiz Capitulino
        }
240 de0b36b6 Luiz Capitulino
        if (cpu->value->has_nip) {
241 de0b36b6 Luiz Capitulino
            monitor_printf(mon, "nip=0x%016" PRIx64, cpu->value->nip);
242 de0b36b6 Luiz Capitulino
        }
243 de0b36b6 Luiz Capitulino
        if (cpu->value->has_npc) {
244 de0b36b6 Luiz Capitulino
            monitor_printf(mon, "pc=0x%016" PRIx64, cpu->value->pc);
245 de0b36b6 Luiz Capitulino
            monitor_printf(mon, "npc=0x%016" PRIx64, cpu->value->npc);
246 de0b36b6 Luiz Capitulino
        }
247 de0b36b6 Luiz Capitulino
        if (cpu->value->has_PC) {
248 de0b36b6 Luiz Capitulino
            monitor_printf(mon, "PC=0x%016" PRIx64, cpu->value->PC);
249 de0b36b6 Luiz Capitulino
        }
250 de0b36b6 Luiz Capitulino
251 de0b36b6 Luiz Capitulino
        if (cpu->value->halted) {
252 de0b36b6 Luiz Capitulino
            monitor_printf(mon, " (halted)");
253 de0b36b6 Luiz Capitulino
        }
254 de0b36b6 Luiz Capitulino
255 de0b36b6 Luiz Capitulino
        monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
256 de0b36b6 Luiz Capitulino
    }
257 de0b36b6 Luiz Capitulino
258 de0b36b6 Luiz Capitulino
    qapi_free_CpuInfoList(cpu_list);
259 de0b36b6 Luiz Capitulino
}
260 de0b36b6 Luiz Capitulino
261 b2023818 Luiz Capitulino
void hmp_info_block(Monitor *mon)
262 b2023818 Luiz Capitulino
{
263 b2023818 Luiz Capitulino
    BlockInfoList *block_list, *info;
264 b2023818 Luiz Capitulino
265 b2023818 Luiz Capitulino
    block_list = qmp_query_block(NULL);
266 b2023818 Luiz Capitulino
267 b2023818 Luiz Capitulino
    for (info = block_list; info; info = info->next) {
268 b2023818 Luiz Capitulino
        monitor_printf(mon, "%s: removable=%d",
269 b2023818 Luiz Capitulino
                       info->value->device, info->value->removable);
270 b2023818 Luiz Capitulino
271 b2023818 Luiz Capitulino
        if (info->value->removable) {
272 b2023818 Luiz Capitulino
            monitor_printf(mon, " locked=%d", info->value->locked);
273 b2023818 Luiz Capitulino
            monitor_printf(mon, " tray-open=%d", info->value->tray_open);
274 b2023818 Luiz Capitulino
        }
275 b2023818 Luiz Capitulino
276 b2023818 Luiz Capitulino
        if (info->value->has_io_status) {
277 b2023818 Luiz Capitulino
            monitor_printf(mon, " io-status=%s",
278 b2023818 Luiz Capitulino
                           BlockDeviceIoStatus_lookup[info->value->io_status]);
279 b2023818 Luiz Capitulino
        }
280 b2023818 Luiz Capitulino
281 b2023818 Luiz Capitulino
        if (info->value->has_inserted) {
282 b2023818 Luiz Capitulino
            monitor_printf(mon, " file=");
283 b2023818 Luiz Capitulino
            monitor_print_filename(mon, info->value->inserted->file);
284 b2023818 Luiz Capitulino
285 b2023818 Luiz Capitulino
            if (info->value->inserted->has_backing_file) {
286 b2023818 Luiz Capitulino
                monitor_printf(mon, " backing_file=");
287 b2023818 Luiz Capitulino
                monitor_print_filename(mon, info->value->inserted->backing_file);
288 75115d95 Benoรฎt Canet
                monitor_printf(mon, " backing_file_depth=%" PRId64,
289 75115d95 Benoรฎt Canet
                    info->value->inserted->backing_file_depth);
290 b2023818 Luiz Capitulino
            }
291 b2023818 Luiz Capitulino
            monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
292 b2023818 Luiz Capitulino
                           info->value->inserted->ro,
293 b2023818 Luiz Capitulino
                           info->value->inserted->drv,
294 b2023818 Luiz Capitulino
                           info->value->inserted->encrypted);
295 727f005e Zhi Yong Wu
296 727f005e Zhi Yong Wu
            monitor_printf(mon, " bps=%" PRId64 " bps_rd=%" PRId64
297 727f005e Zhi Yong Wu
                            " bps_wr=%" PRId64 " iops=%" PRId64
298 727f005e Zhi Yong Wu
                            " iops_rd=%" PRId64 " iops_wr=%" PRId64,
299 727f005e Zhi Yong Wu
                            info->value->inserted->bps,
300 727f005e Zhi Yong Wu
                            info->value->inserted->bps_rd,
301 727f005e Zhi Yong Wu
                            info->value->inserted->bps_wr,
302 727f005e Zhi Yong Wu
                            info->value->inserted->iops,
303 727f005e Zhi Yong Wu
                            info->value->inserted->iops_rd,
304 727f005e Zhi Yong Wu
                            info->value->inserted->iops_wr);
305 b2023818 Luiz Capitulino
        } else {
306 b2023818 Luiz Capitulino
            monitor_printf(mon, " [not inserted]");
307 b2023818 Luiz Capitulino
        }
308 b2023818 Luiz Capitulino
309 b2023818 Luiz Capitulino
        monitor_printf(mon, "\n");
310 b2023818 Luiz Capitulino
    }
311 b2023818 Luiz Capitulino
312 b2023818 Luiz Capitulino
    qapi_free_BlockInfoList(block_list);
313 b2023818 Luiz Capitulino
}
314 b2023818 Luiz Capitulino
315 f11f57e4 Luiz Capitulino
void hmp_info_blockstats(Monitor *mon)
316 f11f57e4 Luiz Capitulino
{
317 f11f57e4 Luiz Capitulino
    BlockStatsList *stats_list, *stats;
318 f11f57e4 Luiz Capitulino
319 f11f57e4 Luiz Capitulino
    stats_list = qmp_query_blockstats(NULL);
320 f11f57e4 Luiz Capitulino
321 f11f57e4 Luiz Capitulino
    for (stats = stats_list; stats; stats = stats->next) {
322 f11f57e4 Luiz Capitulino
        if (!stats->value->has_device) {
323 f11f57e4 Luiz Capitulino
            continue;
324 f11f57e4 Luiz Capitulino
        }
325 f11f57e4 Luiz Capitulino
326 f11f57e4 Luiz Capitulino
        monitor_printf(mon, "%s:", stats->value->device);
327 f11f57e4 Luiz Capitulino
        monitor_printf(mon, " rd_bytes=%" PRId64
328 f11f57e4 Luiz Capitulino
                       " wr_bytes=%" PRId64
329 f11f57e4 Luiz Capitulino
                       " rd_operations=%" PRId64
330 f11f57e4 Luiz Capitulino
                       " wr_operations=%" PRId64
331 f11f57e4 Luiz Capitulino
                       " flush_operations=%" PRId64
332 f11f57e4 Luiz Capitulino
                       " wr_total_time_ns=%" PRId64
333 f11f57e4 Luiz Capitulino
                       " rd_total_time_ns=%" PRId64
334 f11f57e4 Luiz Capitulino
                       " flush_total_time_ns=%" PRId64
335 f11f57e4 Luiz Capitulino
                       "\n",
336 f11f57e4 Luiz Capitulino
                       stats->value->stats->rd_bytes,
337 f11f57e4 Luiz Capitulino
                       stats->value->stats->wr_bytes,
338 f11f57e4 Luiz Capitulino
                       stats->value->stats->rd_operations,
339 f11f57e4 Luiz Capitulino
                       stats->value->stats->wr_operations,
340 f11f57e4 Luiz Capitulino
                       stats->value->stats->flush_operations,
341 f11f57e4 Luiz Capitulino
                       stats->value->stats->wr_total_time_ns,
342 f11f57e4 Luiz Capitulino
                       stats->value->stats->rd_total_time_ns,
343 f11f57e4 Luiz Capitulino
                       stats->value->stats->flush_total_time_ns);
344 f11f57e4 Luiz Capitulino
    }
345 f11f57e4 Luiz Capitulino
346 f11f57e4 Luiz Capitulino
    qapi_free_BlockStatsList(stats_list);
347 f11f57e4 Luiz Capitulino
}
348 f11f57e4 Luiz Capitulino
349 2b54aa87 Luiz Capitulino
void hmp_info_vnc(Monitor *mon)
350 2b54aa87 Luiz Capitulino
{
351 2b54aa87 Luiz Capitulino
    VncInfo *info;
352 2b54aa87 Luiz Capitulino
    Error *err = NULL;
353 2b54aa87 Luiz Capitulino
    VncClientInfoList *client;
354 2b54aa87 Luiz Capitulino
355 2b54aa87 Luiz Capitulino
    info = qmp_query_vnc(&err);
356 2b54aa87 Luiz Capitulino
    if (err) {
357 2b54aa87 Luiz Capitulino
        monitor_printf(mon, "%s\n", error_get_pretty(err));
358 2b54aa87 Luiz Capitulino
        error_free(err);
359 2b54aa87 Luiz Capitulino
        return;
360 2b54aa87 Luiz Capitulino
    }
361 2b54aa87 Luiz Capitulino
362 2b54aa87 Luiz Capitulino
    if (!info->enabled) {
363 2b54aa87 Luiz Capitulino
        monitor_printf(mon, "Server: disabled\n");
364 2b54aa87 Luiz Capitulino
        goto out;
365 2b54aa87 Luiz Capitulino
    }
366 2b54aa87 Luiz Capitulino
367 2b54aa87 Luiz Capitulino
    monitor_printf(mon, "Server:\n");
368 2b54aa87 Luiz Capitulino
    if (info->has_host && info->has_service) {
369 2b54aa87 Luiz Capitulino
        monitor_printf(mon, "     address: %s:%s\n", info->host, info->service);
370 2b54aa87 Luiz Capitulino
    }
371 2b54aa87 Luiz Capitulino
    if (info->has_auth) {
372 2b54aa87 Luiz Capitulino
        monitor_printf(mon, "        auth: %s\n", info->auth);
373 2b54aa87 Luiz Capitulino
    }
374 2b54aa87 Luiz Capitulino
375 2b54aa87 Luiz Capitulino
    if (!info->has_clients || info->clients == NULL) {
376 2b54aa87 Luiz Capitulino
        monitor_printf(mon, "Client: none\n");
377 2b54aa87 Luiz Capitulino
    } else {
378 2b54aa87 Luiz Capitulino
        for (client = info->clients; client; client = client->next) {
379 2b54aa87 Luiz Capitulino
            monitor_printf(mon, "Client:\n");
380 2b54aa87 Luiz Capitulino
            monitor_printf(mon, "     address: %s:%s\n",
381 2b54aa87 Luiz Capitulino
                           client->value->host, client->value->service);
382 2b54aa87 Luiz Capitulino
            monitor_printf(mon, "  x509_dname: %s\n",
383 2b54aa87 Luiz Capitulino
                           client->value->x509_dname ?
384 2b54aa87 Luiz Capitulino
                           client->value->x509_dname : "none");
385 2b54aa87 Luiz Capitulino
            monitor_printf(mon, "    username: %s\n",
386 2b54aa87 Luiz Capitulino
                           client->value->has_sasl_username ?
387 2b54aa87 Luiz Capitulino
                           client->value->sasl_username : "none");
388 2b54aa87 Luiz Capitulino
        }
389 2b54aa87 Luiz Capitulino
    }
390 2b54aa87 Luiz Capitulino
391 2b54aa87 Luiz Capitulino
out:
392 2b54aa87 Luiz Capitulino
    qapi_free_VncInfo(info);
393 2b54aa87 Luiz Capitulino
}
394 2b54aa87 Luiz Capitulino
395 d1f29646 Luiz Capitulino
void hmp_info_spice(Monitor *mon)
396 d1f29646 Luiz Capitulino
{
397 d1f29646 Luiz Capitulino
    SpiceChannelList *chan;
398 d1f29646 Luiz Capitulino
    SpiceInfo *info;
399 d1f29646 Luiz Capitulino
400 d1f29646 Luiz Capitulino
    info = qmp_query_spice(NULL);
401 d1f29646 Luiz Capitulino
402 d1f29646 Luiz Capitulino
    if (!info->enabled) {
403 d1f29646 Luiz Capitulino
        monitor_printf(mon, "Server: disabled\n");
404 d1f29646 Luiz Capitulino
        goto out;
405 d1f29646 Luiz Capitulino
    }
406 d1f29646 Luiz Capitulino
407 d1f29646 Luiz Capitulino
    monitor_printf(mon, "Server:\n");
408 d1f29646 Luiz Capitulino
    if (info->has_port) {
409 d1f29646 Luiz Capitulino
        monitor_printf(mon, "     address: %s:%" PRId64 "\n",
410 d1f29646 Luiz Capitulino
                       info->host, info->port);
411 d1f29646 Luiz Capitulino
    }
412 d1f29646 Luiz Capitulino
    if (info->has_tls_port) {
413 d1f29646 Luiz Capitulino
        monitor_printf(mon, "     address: %s:%" PRId64 " [tls]\n",
414 d1f29646 Luiz Capitulino
                       info->host, info->tls_port);
415 d1f29646 Luiz Capitulino
    }
416 d1f29646 Luiz Capitulino
    monitor_printf(mon, "        auth: %s\n", info->auth);
417 d1f29646 Luiz Capitulino
    monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
418 4efee029 Alon Levy
    monitor_printf(mon, "  mouse-mode: %s\n",
419 4efee029 Alon Levy
                   SpiceQueryMouseMode_lookup[info->mouse_mode]);
420 d1f29646 Luiz Capitulino
421 d1f29646 Luiz Capitulino
    if (!info->has_channels || info->channels == NULL) {
422 d1f29646 Luiz Capitulino
        monitor_printf(mon, "Channels: none\n");
423 d1f29646 Luiz Capitulino
    } else {
424 d1f29646 Luiz Capitulino
        for (chan = info->channels; chan; chan = chan->next) {
425 d1f29646 Luiz Capitulino
            monitor_printf(mon, "Channel:\n");
426 d1f29646 Luiz Capitulino
            monitor_printf(mon, "     address: %s:%s%s\n",
427 d1f29646 Luiz Capitulino
                           chan->value->host, chan->value->port,
428 d1f29646 Luiz Capitulino
                           chan->value->tls ? " [tls]" : "");
429 d1f29646 Luiz Capitulino
            monitor_printf(mon, "     session: %" PRId64 "\n",
430 d1f29646 Luiz Capitulino
                           chan->value->connection_id);
431 d1f29646 Luiz Capitulino
            monitor_printf(mon, "     channel: %" PRId64 ":%" PRId64 "\n",
432 d1f29646 Luiz Capitulino
                           chan->value->channel_type, chan->value->channel_id);
433 d1f29646 Luiz Capitulino
        }
434 d1f29646 Luiz Capitulino
    }
435 d1f29646 Luiz Capitulino
436 d1f29646 Luiz Capitulino
out:
437 d1f29646 Luiz Capitulino
    qapi_free_SpiceInfo(info);
438 d1f29646 Luiz Capitulino
}
439 d1f29646 Luiz Capitulino
440 96637bcd Luiz Capitulino
void hmp_info_balloon(Monitor *mon)
441 96637bcd Luiz Capitulino
{
442 96637bcd Luiz Capitulino
    BalloonInfo *info;
443 96637bcd Luiz Capitulino
    Error *err = NULL;
444 96637bcd Luiz Capitulino
445 96637bcd Luiz Capitulino
    info = qmp_query_balloon(&err);
446 96637bcd Luiz Capitulino
    if (err) {
447 96637bcd Luiz Capitulino
        monitor_printf(mon, "%s\n", error_get_pretty(err));
448 96637bcd Luiz Capitulino
        error_free(err);
449 96637bcd Luiz Capitulino
        return;
450 96637bcd Luiz Capitulino
    }
451 96637bcd Luiz Capitulino
452 96637bcd Luiz Capitulino
    monitor_printf(mon, "balloon: actual=%" PRId64, info->actual >> 20);
453 96637bcd Luiz Capitulino
    if (info->has_mem_swapped_in) {
454 96637bcd Luiz Capitulino
        monitor_printf(mon, " mem_swapped_in=%" PRId64, info->mem_swapped_in);
455 96637bcd Luiz Capitulino
    }
456 96637bcd Luiz Capitulino
    if (info->has_mem_swapped_out) {
457 96637bcd Luiz Capitulino
        monitor_printf(mon, " mem_swapped_out=%" PRId64, info->mem_swapped_out);
458 96637bcd Luiz Capitulino
    }
459 96637bcd Luiz Capitulino
    if (info->has_major_page_faults) {
460 96637bcd Luiz Capitulino
        monitor_printf(mon, " major_page_faults=%" PRId64,
461 96637bcd Luiz Capitulino
                       info->major_page_faults);
462 96637bcd Luiz Capitulino
    }
463 96637bcd Luiz Capitulino
    if (info->has_minor_page_faults) {
464 96637bcd Luiz Capitulino
        monitor_printf(mon, " minor_page_faults=%" PRId64,
465 96637bcd Luiz Capitulino
                       info->minor_page_faults);
466 96637bcd Luiz Capitulino
    }
467 96637bcd Luiz Capitulino
    if (info->has_free_mem) {
468 96637bcd Luiz Capitulino
        monitor_printf(mon, " free_mem=%" PRId64, info->free_mem);
469 96637bcd Luiz Capitulino
    }
470 96637bcd Luiz Capitulino
    if (info->has_total_mem) {
471 96637bcd Luiz Capitulino
        monitor_printf(mon, " total_mem=%" PRId64, info->total_mem);
472 96637bcd Luiz Capitulino
    }
473 96637bcd Luiz Capitulino
474 96637bcd Luiz Capitulino
    monitor_printf(mon, "\n");
475 96637bcd Luiz Capitulino
476 96637bcd Luiz Capitulino
    qapi_free_BalloonInfo(info);
477 96637bcd Luiz Capitulino
}
478 96637bcd Luiz Capitulino
479 79627472 Luiz Capitulino
static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
480 79627472 Luiz Capitulino
{
481 79627472 Luiz Capitulino
    PciMemoryRegionList *region;
482 79627472 Luiz Capitulino
483 79627472 Luiz Capitulino
    monitor_printf(mon, "  Bus %2" PRId64 ", ", dev->bus);
484 79627472 Luiz Capitulino
    monitor_printf(mon, "device %3" PRId64 ", function %" PRId64 ":\n",
485 79627472 Luiz Capitulino
                   dev->slot, dev->function);
486 79627472 Luiz Capitulino
    monitor_printf(mon, "    ");
487 79627472 Luiz Capitulino
488 79627472 Luiz Capitulino
    if (dev->class_info.has_desc) {
489 79627472 Luiz Capitulino
        monitor_printf(mon, "%s", dev->class_info.desc);
490 79627472 Luiz Capitulino
    } else {
491 79627472 Luiz Capitulino
        monitor_printf(mon, "Class %04" PRId64, dev->class_info.class);
492 79627472 Luiz Capitulino
    }
493 79627472 Luiz Capitulino
494 79627472 Luiz Capitulino
    monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n",
495 79627472 Luiz Capitulino
                   dev->id.vendor, dev->id.device);
496 79627472 Luiz Capitulino
497 79627472 Luiz Capitulino
    if (dev->has_irq) {
498 79627472 Luiz Capitulino
        monitor_printf(mon, "      IRQ %" PRId64 ".\n", dev->irq);
499 79627472 Luiz Capitulino
    }
500 79627472 Luiz Capitulino
501 79627472 Luiz Capitulino
    if (dev->has_pci_bridge) {
502 79627472 Luiz Capitulino
        monitor_printf(mon, "      BUS %" PRId64 ".\n",
503 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.number);
504 79627472 Luiz Capitulino
        monitor_printf(mon, "      secondary bus %" PRId64 ".\n",
505 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.secondary);
506 79627472 Luiz Capitulino
        monitor_printf(mon, "      subordinate bus %" PRId64 ".\n",
507 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.subordinate);
508 79627472 Luiz Capitulino
509 79627472 Luiz Capitulino
        monitor_printf(mon, "      IO range [0x%04"PRIx64", 0x%04"PRIx64"]\n",
510 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.io_range->base,
511 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.io_range->limit);
512 79627472 Luiz Capitulino
513 79627472 Luiz Capitulino
        monitor_printf(mon,
514 79627472 Luiz Capitulino
                       "      memory range [0x%08"PRIx64", 0x%08"PRIx64"]\n",
515 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.memory_range->base,
516 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.memory_range->limit);
517 79627472 Luiz Capitulino
518 79627472 Luiz Capitulino
        monitor_printf(mon, "      prefetchable memory range "
519 79627472 Luiz Capitulino
                       "[0x%08"PRIx64", 0x%08"PRIx64"]\n",
520 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.prefetchable_range->base,
521 79627472 Luiz Capitulino
                       dev->pci_bridge->bus.prefetchable_range->limit);
522 79627472 Luiz Capitulino
    }
523 79627472 Luiz Capitulino
524 79627472 Luiz Capitulino
    for (region = dev->regions; region; region = region->next) {
525 79627472 Luiz Capitulino
        uint64_t addr, size;
526 79627472 Luiz Capitulino
527 79627472 Luiz Capitulino
        addr = region->value->address;
528 79627472 Luiz Capitulino
        size = region->value->size;
529 79627472 Luiz Capitulino
530 79627472 Luiz Capitulino
        monitor_printf(mon, "      BAR%" PRId64 ": ", region->value->bar);
531 79627472 Luiz Capitulino
532 79627472 Luiz Capitulino
        if (!strcmp(region->value->type, "io")) {
533 79627472 Luiz Capitulino
            monitor_printf(mon, "I/O at 0x%04" PRIx64
534 79627472 Luiz Capitulino
                                " [0x%04" PRIx64 "].\n",
535 79627472 Luiz Capitulino
                           addr, addr + size - 1);
536 79627472 Luiz Capitulino
        } else {
537 79627472 Luiz Capitulino
            monitor_printf(mon, "%d bit%s memory at 0x%08" PRIx64
538 79627472 Luiz Capitulino
                               " [0x%08" PRIx64 "].\n",
539 79627472 Luiz Capitulino
                           region->value->mem_type_64 ? 64 : 32,
540 79627472 Luiz Capitulino
                           region->value->prefetch ? " prefetchable" : "",
541 79627472 Luiz Capitulino
                           addr, addr + size - 1);
542 79627472 Luiz Capitulino
        }
543 79627472 Luiz Capitulino
    }
544 79627472 Luiz Capitulino
545 79627472 Luiz Capitulino
    monitor_printf(mon, "      id \"%s\"\n", dev->qdev_id);
546 79627472 Luiz Capitulino
547 79627472 Luiz Capitulino
    if (dev->has_pci_bridge) {
548 79627472 Luiz Capitulino
        if (dev->pci_bridge->has_devices) {
549 79627472 Luiz Capitulino
            PciDeviceInfoList *cdev;
550 79627472 Luiz Capitulino
            for (cdev = dev->pci_bridge->devices; cdev; cdev = cdev->next) {
551 79627472 Luiz Capitulino
                hmp_info_pci_device(mon, cdev->value);
552 79627472 Luiz Capitulino
            }
553 79627472 Luiz Capitulino
        }
554 79627472 Luiz Capitulino
    }
555 79627472 Luiz Capitulino
}
556 79627472 Luiz Capitulino
557 79627472 Luiz Capitulino
void hmp_info_pci(Monitor *mon)
558 79627472 Luiz Capitulino
{
559 f46cee37 Stefan Berger
    PciInfoList *info_list, *info;
560 79627472 Luiz Capitulino
    Error *err = NULL;
561 79627472 Luiz Capitulino
562 f46cee37 Stefan Berger
    info_list = qmp_query_pci(&err);
563 79627472 Luiz Capitulino
    if (err) {
564 79627472 Luiz Capitulino
        monitor_printf(mon, "PCI devices not supported\n");
565 79627472 Luiz Capitulino
        error_free(err);
566 79627472 Luiz Capitulino
        return;
567 79627472 Luiz Capitulino
    }
568 79627472 Luiz Capitulino
569 f46cee37 Stefan Berger
    for (info = info_list; info; info = info->next) {
570 79627472 Luiz Capitulino
        PciDeviceInfoList *dev;
571 79627472 Luiz Capitulino
572 79627472 Luiz Capitulino
        for (dev = info->value->devices; dev; dev = dev->next) {
573 79627472 Luiz Capitulino
            hmp_info_pci_device(mon, dev->value);
574 79627472 Luiz Capitulino
        }
575 79627472 Luiz Capitulino
    }
576 79627472 Luiz Capitulino
577 f46cee37 Stefan Berger
    qapi_free_PciInfoList(info_list);
578 79627472 Luiz Capitulino
}
579 79627472 Luiz Capitulino
580 fb5458cd Stefan Hajnoczi
void hmp_info_block_jobs(Monitor *mon)
581 fb5458cd Stefan Hajnoczi
{
582 fb5458cd Stefan Hajnoczi
    BlockJobInfoList *list;
583 fb5458cd Stefan Hajnoczi
    Error *err = NULL;
584 fb5458cd Stefan Hajnoczi
585 fb5458cd Stefan Hajnoczi
    list = qmp_query_block_jobs(&err);
586 fb5458cd Stefan Hajnoczi
    assert(!err);
587 fb5458cd Stefan Hajnoczi
588 fb5458cd Stefan Hajnoczi
    if (!list) {
589 fb5458cd Stefan Hajnoczi
        monitor_printf(mon, "No active jobs\n");
590 fb5458cd Stefan Hajnoczi
        return;
591 fb5458cd Stefan Hajnoczi
    }
592 fb5458cd Stefan Hajnoczi
593 fb5458cd Stefan Hajnoczi
    while (list) {
594 fb5458cd Stefan Hajnoczi
        if (strcmp(list->value->type, "stream") == 0) {
595 fb5458cd Stefan Hajnoczi
            monitor_printf(mon, "Streaming device %s: Completed %" PRId64
596 fb5458cd Stefan Hajnoczi
                           " of %" PRId64 " bytes, speed limit %" PRId64
597 fb5458cd Stefan Hajnoczi
                           " bytes/s\n",
598 fb5458cd Stefan Hajnoczi
                           list->value->device,
599 fb5458cd Stefan Hajnoczi
                           list->value->offset,
600 fb5458cd Stefan Hajnoczi
                           list->value->len,
601 fb5458cd Stefan Hajnoczi
                           list->value->speed);
602 fb5458cd Stefan Hajnoczi
        } else {
603 fb5458cd Stefan Hajnoczi
            monitor_printf(mon, "Type %s, device %s: Completed %" PRId64
604 fb5458cd Stefan Hajnoczi
                           " of %" PRId64 " bytes, speed limit %" PRId64
605 fb5458cd Stefan Hajnoczi
                           " bytes/s\n",
606 fb5458cd Stefan Hajnoczi
                           list->value->type,
607 fb5458cd Stefan Hajnoczi
                           list->value->device,
608 fb5458cd Stefan Hajnoczi
                           list->value->offset,
609 fb5458cd Stefan Hajnoczi
                           list->value->len,
610 fb5458cd Stefan Hajnoczi
                           list->value->speed);
611 fb5458cd Stefan Hajnoczi
        }
612 fb5458cd Stefan Hajnoczi
        list = list->next;
613 fb5458cd Stefan Hajnoczi
    }
614 fb5458cd Stefan Hajnoczi
}
615 fb5458cd Stefan Hajnoczi
616 7a7f325e Luiz Capitulino
void hmp_quit(Monitor *mon, const QDict *qdict)
617 7a7f325e Luiz Capitulino
{
618 7a7f325e Luiz Capitulino
    monitor_suspend(mon);
619 7a7f325e Luiz Capitulino
    qmp_quit(NULL);
620 7a7f325e Luiz Capitulino
}
621 5f158f21 Luiz Capitulino
622 5f158f21 Luiz Capitulino
void hmp_stop(Monitor *mon, const QDict *qdict)
623 5f158f21 Luiz Capitulino
{
624 5f158f21 Luiz Capitulino
    qmp_stop(NULL);
625 5f158f21 Luiz Capitulino
}
626 38d22653 Luiz Capitulino
627 38d22653 Luiz Capitulino
void hmp_system_reset(Monitor *mon, const QDict *qdict)
628 38d22653 Luiz Capitulino
{
629 38d22653 Luiz Capitulino
    qmp_system_reset(NULL);
630 38d22653 Luiz Capitulino
}
631 5bc465e4 Luiz Capitulino
632 5bc465e4 Luiz Capitulino
void hmp_system_powerdown(Monitor *mon, const QDict *qdict)
633 5bc465e4 Luiz Capitulino
{
634 5bc465e4 Luiz Capitulino
    qmp_system_powerdown(NULL);
635 5bc465e4 Luiz Capitulino
}
636 755f1968 Luiz Capitulino
637 755f1968 Luiz Capitulino
void hmp_cpu(Monitor *mon, const QDict *qdict)
638 755f1968 Luiz Capitulino
{
639 755f1968 Luiz Capitulino
    int64_t cpu_index;
640 755f1968 Luiz Capitulino
641 755f1968 Luiz Capitulino
    /* XXX: drop the monitor_set_cpu() usage when all HMP commands that
642 755f1968 Luiz Capitulino
            use it are converted to the QAPI */
643 755f1968 Luiz Capitulino
    cpu_index = qdict_get_int(qdict, "index");
644 755f1968 Luiz Capitulino
    if (monitor_set_cpu(cpu_index) < 0) {
645 755f1968 Luiz Capitulino
        monitor_printf(mon, "invalid CPU index\n");
646 755f1968 Luiz Capitulino
    }
647 755f1968 Luiz Capitulino
}
648 0cfd6a9a Luiz Capitulino
649 0cfd6a9a Luiz Capitulino
void hmp_memsave(Monitor *mon, const QDict *qdict)
650 0cfd6a9a Luiz Capitulino
{
651 0cfd6a9a Luiz Capitulino
    uint32_t size = qdict_get_int(qdict, "size");
652 0cfd6a9a Luiz Capitulino
    const char *filename = qdict_get_str(qdict, "filename");
653 0cfd6a9a Luiz Capitulino
    uint64_t addr = qdict_get_int(qdict, "val");
654 0cfd6a9a Luiz Capitulino
    Error *errp = NULL;
655 0cfd6a9a Luiz Capitulino
656 0cfd6a9a Luiz Capitulino
    qmp_memsave(addr, size, filename, true, monitor_get_cpu_index(), &errp);
657 0cfd6a9a Luiz Capitulino
    hmp_handle_error(mon, &errp);
658 0cfd6a9a Luiz Capitulino
}
659 6d3962bf Luiz Capitulino
660 6d3962bf Luiz Capitulino
void hmp_pmemsave(Monitor *mon, const QDict *qdict)
661 6d3962bf Luiz Capitulino
{
662 6d3962bf Luiz Capitulino
    uint32_t size = qdict_get_int(qdict, "size");
663 6d3962bf Luiz Capitulino
    const char *filename = qdict_get_str(qdict, "filename");
664 6d3962bf Luiz Capitulino
    uint64_t addr = qdict_get_int(qdict, "val");
665 6d3962bf Luiz Capitulino
    Error *errp = NULL;
666 6d3962bf Luiz Capitulino
667 6d3962bf Luiz Capitulino
    qmp_pmemsave(addr, size, filename, &errp);
668 6d3962bf Luiz Capitulino
    hmp_handle_error(mon, &errp);
669 6d3962bf Luiz Capitulino
}
670 e42e818b Luiz Capitulino
671 e42e818b Luiz Capitulino
static void hmp_cont_cb(void *opaque, int err)
672 e42e818b Luiz Capitulino
{
673 e42e818b Luiz Capitulino
    if (!err) {
674 8b7f6fbb Luiz Capitulino
        qmp_cont(NULL);
675 e42e818b Luiz Capitulino
    }
676 e42e818b Luiz Capitulino
}
677 e42e818b Luiz Capitulino
678 8b7f6fbb Luiz Capitulino
static bool key_is_missing(const BlockInfo *bdev)
679 8b7f6fbb Luiz Capitulino
{
680 8b7f6fbb Luiz Capitulino
    return (bdev->inserted && bdev->inserted->encryption_key_missing);
681 8b7f6fbb Luiz Capitulino
}
682 8b7f6fbb Luiz Capitulino
683 e42e818b Luiz Capitulino
void hmp_cont(Monitor *mon, const QDict *qdict)
684 e42e818b Luiz Capitulino
{
685 8b7f6fbb Luiz Capitulino
    BlockInfoList *bdev_list, *bdev;
686 e42e818b Luiz Capitulino
    Error *errp = NULL;
687 e42e818b Luiz Capitulino
688 8b7f6fbb Luiz Capitulino
    bdev_list = qmp_query_block(NULL);
689 8b7f6fbb Luiz Capitulino
    for (bdev = bdev_list; bdev; bdev = bdev->next) {
690 8b7f6fbb Luiz Capitulino
        if (key_is_missing(bdev->value)) {
691 8b7f6fbb Luiz Capitulino
            monitor_read_block_device_key(mon, bdev->value->device,
692 8b7f6fbb Luiz Capitulino
                                          hmp_cont_cb, NULL);
693 8b7f6fbb Luiz Capitulino
            goto out;
694 e42e818b Luiz Capitulino
        }
695 e42e818b Luiz Capitulino
    }
696 8b7f6fbb Luiz Capitulino
697 8b7f6fbb Luiz Capitulino
    qmp_cont(&errp);
698 8b7f6fbb Luiz Capitulino
    hmp_handle_error(mon, &errp);
699 8b7f6fbb Luiz Capitulino
700 8b7f6fbb Luiz Capitulino
out:
701 8b7f6fbb Luiz Capitulino
    qapi_free_BlockInfoList(bdev_list);
702 e42e818b Luiz Capitulino
}
703 ab49ab5c Luiz Capitulino
704 9b9df25a Gerd Hoffmann
void hmp_system_wakeup(Monitor *mon, const QDict *qdict)
705 9b9df25a Gerd Hoffmann
{
706 9b9df25a Gerd Hoffmann
    qmp_system_wakeup(NULL);
707 9b9df25a Gerd Hoffmann
}
708 9b9df25a Gerd Hoffmann
709 ab49ab5c Luiz Capitulino
void hmp_inject_nmi(Monitor *mon, const QDict *qdict)
710 ab49ab5c Luiz Capitulino
{
711 ab49ab5c Luiz Capitulino
    Error *errp = NULL;
712 ab49ab5c Luiz Capitulino
713 ab49ab5c Luiz Capitulino
    qmp_inject_nmi(&errp);
714 ab49ab5c Luiz Capitulino
    hmp_handle_error(mon, &errp);
715 ab49ab5c Luiz Capitulino
}
716 4b37156c Luiz Capitulino
717 4b37156c Luiz Capitulino
void hmp_set_link(Monitor *mon, const QDict *qdict)
718 4b37156c Luiz Capitulino
{
719 4b37156c Luiz Capitulino
    const char *name = qdict_get_str(qdict, "name");
720 4b37156c Luiz Capitulino
    int up = qdict_get_bool(qdict, "up");
721 4b37156c Luiz Capitulino
    Error *errp = NULL;
722 4b37156c Luiz Capitulino
723 4b37156c Luiz Capitulino
    qmp_set_link(name, up, &errp);
724 4b37156c Luiz Capitulino
    hmp_handle_error(mon, &errp);
725 4b37156c Luiz Capitulino
}
726 a4dea8a9 Luiz Capitulino
727 a4dea8a9 Luiz Capitulino
void hmp_block_passwd(Monitor *mon, const QDict *qdict)
728 a4dea8a9 Luiz Capitulino
{
729 a4dea8a9 Luiz Capitulino
    const char *device = qdict_get_str(qdict, "device");
730 a4dea8a9 Luiz Capitulino
    const char *password = qdict_get_str(qdict, "password");
731 a4dea8a9 Luiz Capitulino
    Error *errp = NULL;
732 a4dea8a9 Luiz Capitulino
733 a4dea8a9 Luiz Capitulino
    qmp_block_passwd(device, password, &errp);
734 a4dea8a9 Luiz Capitulino
    hmp_handle_error(mon, &errp);
735 a4dea8a9 Luiz Capitulino
}
736 d72f3264 Luiz Capitulino
737 d72f3264 Luiz Capitulino
void hmp_balloon(Monitor *mon, const QDict *qdict)
738 d72f3264 Luiz Capitulino
{
739 d72f3264 Luiz Capitulino
    int64_t value = qdict_get_int(qdict, "value");
740 d72f3264 Luiz Capitulino
    Error *errp = NULL;
741 d72f3264 Luiz Capitulino
742 d72f3264 Luiz Capitulino
    qmp_balloon(value, &errp);
743 d72f3264 Luiz Capitulino
    if (error_is_set(&errp)) {
744 d72f3264 Luiz Capitulino
        monitor_printf(mon, "balloon: %s\n", error_get_pretty(errp));
745 d72f3264 Luiz Capitulino
        error_free(errp);
746 d72f3264 Luiz Capitulino
    }
747 d72f3264 Luiz Capitulino
}
748 5e7caacb Luiz Capitulino
749 5e7caacb Luiz Capitulino
void hmp_block_resize(Monitor *mon, const QDict *qdict)
750 5e7caacb Luiz Capitulino
{
751 5e7caacb Luiz Capitulino
    const char *device = qdict_get_str(qdict, "device");
752 5e7caacb Luiz Capitulino
    int64_t size = qdict_get_int(qdict, "size");
753 5e7caacb Luiz Capitulino
    Error *errp = NULL;
754 5e7caacb Luiz Capitulino
755 5e7caacb Luiz Capitulino
    qmp_block_resize(device, size, &errp);
756 5e7caacb Luiz Capitulino
    hmp_handle_error(mon, &errp);
757 5e7caacb Luiz Capitulino
}
758 6106e249 Luiz Capitulino
759 6106e249 Luiz Capitulino
void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
760 6106e249 Luiz Capitulino
{
761 6106e249 Luiz Capitulino
    const char *device = qdict_get_str(qdict, "device");
762 6106e249 Luiz Capitulino
    const char *filename = qdict_get_try_str(qdict, "snapshot-file");
763 6106e249 Luiz Capitulino
    const char *format = qdict_get_try_str(qdict, "format");
764 6cc2a415 Paolo Bonzini
    int reuse = qdict_get_try_bool(qdict, "reuse", 0);
765 6cc2a415 Paolo Bonzini
    enum NewImageMode mode;
766 6106e249 Luiz Capitulino
    Error *errp = NULL;
767 6106e249 Luiz Capitulino
768 6106e249 Luiz Capitulino
    if (!filename) {
769 6106e249 Luiz Capitulino
        /* In the future, if 'snapshot-file' is not specified, the snapshot
770 6106e249 Luiz Capitulino
           will be taken internally. Today it's actually required. */
771 6106e249 Luiz Capitulino
        error_set(&errp, QERR_MISSING_PARAMETER, "snapshot-file");
772 6106e249 Luiz Capitulino
        hmp_handle_error(mon, &errp);
773 6106e249 Luiz Capitulino
        return;
774 6106e249 Luiz Capitulino
    }
775 6106e249 Luiz Capitulino
776 6cc2a415 Paolo Bonzini
    mode = reuse ? NEW_IMAGE_MODE_EXISTING : NEW_IMAGE_MODE_ABSOLUTE_PATHS;
777 6cc2a415 Paolo Bonzini
    qmp_blockdev_snapshot_sync(device, filename, !!format, format,
778 6cc2a415 Paolo Bonzini
                               true, mode, &errp);
779 6106e249 Luiz Capitulino
    hmp_handle_error(mon, &errp);
780 6106e249 Luiz Capitulino
}
781 6cdedb07 Luiz Capitulino
782 6cdedb07 Luiz Capitulino
void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)
783 6cdedb07 Luiz Capitulino
{
784 6cdedb07 Luiz Capitulino
    qmp_migrate_cancel(NULL);
785 6cdedb07 Luiz Capitulino
}
786 4f0a993b Luiz Capitulino
787 4f0a993b Luiz Capitulino
void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict)
788 4f0a993b Luiz Capitulino
{
789 4f0a993b Luiz Capitulino
    double value = qdict_get_double(qdict, "value");
790 4f0a993b Luiz Capitulino
    qmp_migrate_set_downtime(value, NULL);
791 4f0a993b Luiz Capitulino
}
792 3dc85383 Luiz Capitulino
793 9e1ba4cc Orit Wasserman
void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
794 9e1ba4cc Orit Wasserman
{
795 9e1ba4cc Orit Wasserman
    int64_t value = qdict_get_int(qdict, "value");
796 9e1ba4cc Orit Wasserman
    Error *err = NULL;
797 9e1ba4cc Orit Wasserman
798 9e1ba4cc Orit Wasserman
    qmp_migrate_set_cache_size(value, &err);
799 9e1ba4cc Orit Wasserman
    if (err) {
800 9e1ba4cc Orit Wasserman
        monitor_printf(mon, "%s\n", error_get_pretty(err));
801 9e1ba4cc Orit Wasserman
        error_free(err);
802 9e1ba4cc Orit Wasserman
        return;
803 9e1ba4cc Orit Wasserman
    }
804 9e1ba4cc Orit Wasserman
}
805 9e1ba4cc Orit Wasserman
806 3dc85383 Luiz Capitulino
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict)
807 3dc85383 Luiz Capitulino
{
808 3dc85383 Luiz Capitulino
    int64_t value = qdict_get_int(qdict, "value");
809 3dc85383 Luiz Capitulino
    qmp_migrate_set_speed(value, NULL);
810 3dc85383 Luiz Capitulino
}
811 fbf796fd Luiz Capitulino
812 00458433 Orit Wasserman
void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
813 00458433 Orit Wasserman
{
814 00458433 Orit Wasserman
    const char *cap = qdict_get_str(qdict, "capability");
815 00458433 Orit Wasserman
    bool state = qdict_get_bool(qdict, "state");
816 00458433 Orit Wasserman
    Error *err = NULL;
817 00458433 Orit Wasserman
    MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));
818 00458433 Orit Wasserman
    int i;
819 00458433 Orit Wasserman
820 00458433 Orit Wasserman
    for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
821 00458433 Orit Wasserman
        if (strcmp(cap, MigrationCapability_lookup[i]) == 0) {
822 00458433 Orit Wasserman
            caps->value = g_malloc0(sizeof(*caps->value));
823 00458433 Orit Wasserman
            caps->value->capability = i;
824 00458433 Orit Wasserman
            caps->value->state = state;
825 00458433 Orit Wasserman
            caps->next = NULL;
826 00458433 Orit Wasserman
            qmp_migrate_set_capabilities(caps, &err);
827 00458433 Orit Wasserman
            break;
828 00458433 Orit Wasserman
        }
829 00458433 Orit Wasserman
    }
830 00458433 Orit Wasserman
831 00458433 Orit Wasserman
    if (i == MIGRATION_CAPABILITY_MAX) {
832 00458433 Orit Wasserman
        error_set(&err, QERR_INVALID_PARAMETER, cap);
833 00458433 Orit Wasserman
    }
834 00458433 Orit Wasserman
835 00458433 Orit Wasserman
    qapi_free_MigrationCapabilityStatusList(caps);
836 00458433 Orit Wasserman
837 00458433 Orit Wasserman
    if (err) {
838 00458433 Orit Wasserman
        monitor_printf(mon, "migrate_set_parameter: %s\n",
839 00458433 Orit Wasserman
                       error_get_pretty(err));
840 00458433 Orit Wasserman
        error_free(err);
841 00458433 Orit Wasserman
    }
842 00458433 Orit Wasserman
}
843 00458433 Orit Wasserman
844 fbf796fd Luiz Capitulino
void hmp_set_password(Monitor *mon, const QDict *qdict)
845 fbf796fd Luiz Capitulino
{
846 fbf796fd Luiz Capitulino
    const char *protocol  = qdict_get_str(qdict, "protocol");
847 fbf796fd Luiz Capitulino
    const char *password  = qdict_get_str(qdict, "password");
848 fbf796fd Luiz Capitulino
    const char *connected = qdict_get_try_str(qdict, "connected");
849 fbf796fd Luiz Capitulino
    Error *err = NULL;
850 fbf796fd Luiz Capitulino
851 fbf796fd Luiz Capitulino
    qmp_set_password(protocol, password, !!connected, connected, &err);
852 fbf796fd Luiz Capitulino
    hmp_handle_error(mon, &err);
853 fbf796fd Luiz Capitulino
}
854 9ad5372d Luiz Capitulino
855 9ad5372d Luiz Capitulino
void hmp_expire_password(Monitor *mon, const QDict *qdict)
856 9ad5372d Luiz Capitulino
{
857 9ad5372d Luiz Capitulino
    const char *protocol  = qdict_get_str(qdict, "protocol");
858 9ad5372d Luiz Capitulino
    const char *whenstr = qdict_get_str(qdict, "time");
859 9ad5372d Luiz Capitulino
    Error *err = NULL;
860 9ad5372d Luiz Capitulino
861 9ad5372d Luiz Capitulino
    qmp_expire_password(protocol, whenstr, &err);
862 9ad5372d Luiz Capitulino
    hmp_handle_error(mon, &err);
863 9ad5372d Luiz Capitulino
}
864 c245b6a3 Luiz Capitulino
865 c245b6a3 Luiz Capitulino
void hmp_eject(Monitor *mon, const QDict *qdict)
866 c245b6a3 Luiz Capitulino
{
867 c245b6a3 Luiz Capitulino
    int force = qdict_get_try_bool(qdict, "force", 0);
868 c245b6a3 Luiz Capitulino
    const char *device = qdict_get_str(qdict, "device");
869 c245b6a3 Luiz Capitulino
    Error *err = NULL;
870 c245b6a3 Luiz Capitulino
871 c245b6a3 Luiz Capitulino
    qmp_eject(device, true, force, &err);
872 c245b6a3 Luiz Capitulino
    hmp_handle_error(mon, &err);
873 c245b6a3 Luiz Capitulino
}
874 333a96ec Luiz Capitulino
875 333a96ec Luiz Capitulino
static void hmp_change_read_arg(Monitor *mon, const char *password,
876 333a96ec Luiz Capitulino
                                void *opaque)
877 333a96ec Luiz Capitulino
{
878 333a96ec Luiz Capitulino
    qmp_change_vnc_password(password, NULL);
879 333a96ec Luiz Capitulino
    monitor_read_command(mon, 1);
880 333a96ec Luiz Capitulino
}
881 333a96ec Luiz Capitulino
882 333a96ec Luiz Capitulino
void hmp_change(Monitor *mon, const QDict *qdict)
883 333a96ec Luiz Capitulino
{
884 333a96ec Luiz Capitulino
    const char *device = qdict_get_str(qdict, "device");
885 333a96ec Luiz Capitulino
    const char *target = qdict_get_str(qdict, "target");
886 333a96ec Luiz Capitulino
    const char *arg = qdict_get_try_str(qdict, "arg");
887 333a96ec Luiz Capitulino
    Error *err = NULL;
888 333a96ec Luiz Capitulino
889 333a96ec Luiz Capitulino
    if (strcmp(device, "vnc") == 0 &&
890 333a96ec Luiz Capitulino
            (strcmp(target, "passwd") == 0 ||
891 333a96ec Luiz Capitulino
             strcmp(target, "password") == 0)) {
892 333a96ec Luiz Capitulino
        if (!arg) {
893 333a96ec Luiz Capitulino
            monitor_read_password(mon, hmp_change_read_arg, NULL);
894 333a96ec Luiz Capitulino
            return;
895 333a96ec Luiz Capitulino
        }
896 333a96ec Luiz Capitulino
    }
897 333a96ec Luiz Capitulino
898 333a96ec Luiz Capitulino
    qmp_change(device, target, !!arg, arg, &err);
899 ab878ddf Luiz Capitulino
    if (error_is_set(&err) &&
900 ab878ddf Luiz Capitulino
        error_get_class(err) == ERROR_CLASS_DEVICE_ENCRYPTED) {
901 eef5ad10 Luiz Capitulino
        error_free(err);
902 eef5ad10 Luiz Capitulino
        monitor_read_block_device_key(mon, device, NULL, NULL);
903 333a96ec Luiz Capitulino
        return;
904 333a96ec Luiz Capitulino
    }
905 333a96ec Luiz Capitulino
    hmp_handle_error(mon, &err);
906 333a96ec Luiz Capitulino
}
907 80047da5 Luiz Capitulino
908 80047da5 Luiz Capitulino
void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict)
909 80047da5 Luiz Capitulino
{
910 80047da5 Luiz Capitulino
    Error *err = NULL;
911 80047da5 Luiz Capitulino
912 80047da5 Luiz Capitulino
    qmp_block_set_io_throttle(qdict_get_str(qdict, "device"),
913 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "bps"),
914 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "bps_rd"),
915 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "bps_wr"),
916 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "iops"),
917 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "iops_rd"),
918 80047da5 Luiz Capitulino
                              qdict_get_int(qdict, "iops_wr"), &err);
919 80047da5 Luiz Capitulino
    hmp_handle_error(mon, &err);
920 80047da5 Luiz Capitulino
}
921 12bd451f Stefan Hajnoczi
922 12bd451f Stefan Hajnoczi
void hmp_block_stream(Monitor *mon, const QDict *qdict)
923 12bd451f Stefan Hajnoczi
{
924 12bd451f Stefan Hajnoczi
    Error *error = NULL;
925 12bd451f Stefan Hajnoczi
    const char *device = qdict_get_str(qdict, "device");
926 12bd451f Stefan Hajnoczi
    const char *base = qdict_get_try_str(qdict, "base");
927 c83c66c3 Stefan Hajnoczi
    int64_t speed = qdict_get_try_int(qdict, "speed", 0);
928 12bd451f Stefan Hajnoczi
929 c83c66c3 Stefan Hajnoczi
    qmp_block_stream(device, base != NULL, base,
930 c83c66c3 Stefan Hajnoczi
                     qdict_haskey(qdict, "speed"), speed, &error);
931 12bd451f Stefan Hajnoczi
932 12bd451f Stefan Hajnoczi
    hmp_handle_error(mon, &error);
933 12bd451f Stefan Hajnoczi
}
934 2d47c6e9 Stefan Hajnoczi
935 2d47c6e9 Stefan Hajnoczi
void hmp_block_job_set_speed(Monitor *mon, const QDict *qdict)
936 2d47c6e9 Stefan Hajnoczi
{
937 2d47c6e9 Stefan Hajnoczi
    Error *error = NULL;
938 2d47c6e9 Stefan Hajnoczi
    const char *device = qdict_get_str(qdict, "device");
939 c6db2395 Paolo Bonzini
    int64_t value = qdict_get_int(qdict, "speed");
940 2d47c6e9 Stefan Hajnoczi
941 2d47c6e9 Stefan Hajnoczi
    qmp_block_job_set_speed(device, value, &error);
942 2d47c6e9 Stefan Hajnoczi
943 2d47c6e9 Stefan Hajnoczi
    hmp_handle_error(mon, &error);
944 2d47c6e9 Stefan Hajnoczi
}
945 370521a1 Stefan Hajnoczi
946 370521a1 Stefan Hajnoczi
void hmp_block_job_cancel(Monitor *mon, const QDict *qdict)
947 370521a1 Stefan Hajnoczi
{
948 370521a1 Stefan Hajnoczi
    Error *error = NULL;
949 370521a1 Stefan Hajnoczi
    const char *device = qdict_get_str(qdict, "device");
950 370521a1 Stefan Hajnoczi
951 370521a1 Stefan Hajnoczi
    qmp_block_job_cancel(device, &error);
952 370521a1 Stefan Hajnoczi
953 370521a1 Stefan Hajnoczi
    hmp_handle_error(mon, &error);
954 370521a1 Stefan Hajnoczi
}
955 e1c37d0e Luiz Capitulino
956 e1c37d0e Luiz Capitulino
typedef struct MigrationStatus
957 e1c37d0e Luiz Capitulino
{
958 e1c37d0e Luiz Capitulino
    QEMUTimer *timer;
959 e1c37d0e Luiz Capitulino
    Monitor *mon;
960 e1c37d0e Luiz Capitulino
    bool is_block_migration;
961 e1c37d0e Luiz Capitulino
} MigrationStatus;
962 e1c37d0e Luiz Capitulino
963 e1c37d0e Luiz Capitulino
static void hmp_migrate_status_cb(void *opaque)
964 e1c37d0e Luiz Capitulino
{
965 e1c37d0e Luiz Capitulino
    MigrationStatus *status = opaque;
966 e1c37d0e Luiz Capitulino
    MigrationInfo *info;
967 e1c37d0e Luiz Capitulino
968 e1c37d0e Luiz Capitulino
    info = qmp_query_migrate(NULL);
969 e1c37d0e Luiz Capitulino
    if (!info->has_status || strcmp(info->status, "active") == 0) {
970 e1c37d0e Luiz Capitulino
        if (info->has_disk) {
971 e1c37d0e Luiz Capitulino
            int progress;
972 e1c37d0e Luiz Capitulino
973 e1c37d0e Luiz Capitulino
            if (info->disk->remaining) {
974 e1c37d0e Luiz Capitulino
                progress = info->disk->transferred * 100 / info->disk->total;
975 e1c37d0e Luiz Capitulino
            } else {
976 e1c37d0e Luiz Capitulino
                progress = 100;
977 e1c37d0e Luiz Capitulino
            }
978 e1c37d0e Luiz Capitulino
979 e1c37d0e Luiz Capitulino
            monitor_printf(status->mon, "Completed %d %%\r", progress);
980 e1c37d0e Luiz Capitulino
            monitor_flush(status->mon);
981 e1c37d0e Luiz Capitulino
        }
982 e1c37d0e Luiz Capitulino
983 e1c37d0e Luiz Capitulino
        qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock) + 1000);
984 e1c37d0e Luiz Capitulino
    } else {
985 e1c37d0e Luiz Capitulino
        if (status->is_block_migration) {
986 e1c37d0e Luiz Capitulino
            monitor_printf(status->mon, "\n");
987 e1c37d0e Luiz Capitulino
        }
988 e1c37d0e Luiz Capitulino
        monitor_resume(status->mon);
989 e1c37d0e Luiz Capitulino
        qemu_del_timer(status->timer);
990 e1c37d0e Luiz Capitulino
        g_free(status);
991 e1c37d0e Luiz Capitulino
    }
992 e1c37d0e Luiz Capitulino
993 e1c37d0e Luiz Capitulino
    qapi_free_MigrationInfo(info);
994 e1c37d0e Luiz Capitulino
}
995 e1c37d0e Luiz Capitulino
996 e1c37d0e Luiz Capitulino
void hmp_migrate(Monitor *mon, const QDict *qdict)
997 e1c37d0e Luiz Capitulino
{
998 e1c37d0e Luiz Capitulino
    int detach = qdict_get_try_bool(qdict, "detach", 0);
999 e1c37d0e Luiz Capitulino
    int blk = qdict_get_try_bool(qdict, "blk", 0);
1000 e1c37d0e Luiz Capitulino
    int inc = qdict_get_try_bool(qdict, "inc", 0);
1001 e1c37d0e Luiz Capitulino
    const char *uri = qdict_get_str(qdict, "uri");
1002 e1c37d0e Luiz Capitulino
    Error *err = NULL;
1003 e1c37d0e Luiz Capitulino
1004 e1c37d0e Luiz Capitulino
    qmp_migrate(uri, !!blk, blk, !!inc, inc, false, false, &err);
1005 e1c37d0e Luiz Capitulino
    if (err) {
1006 e1c37d0e Luiz Capitulino
        monitor_printf(mon, "migrate: %s\n", error_get_pretty(err));
1007 e1c37d0e Luiz Capitulino
        error_free(err);
1008 e1c37d0e Luiz Capitulino
        return;
1009 e1c37d0e Luiz Capitulino
    }
1010 e1c37d0e Luiz Capitulino
1011 e1c37d0e Luiz Capitulino
    if (!detach) {
1012 e1c37d0e Luiz Capitulino
        MigrationStatus *status;
1013 e1c37d0e Luiz Capitulino
1014 e1c37d0e Luiz Capitulino
        if (monitor_suspend(mon) < 0) {
1015 e1c37d0e Luiz Capitulino
            monitor_printf(mon, "terminal does not allow synchronous "
1016 e1c37d0e Luiz Capitulino
                           "migration, continuing detached\n");
1017 e1c37d0e Luiz Capitulino
            return;
1018 e1c37d0e Luiz Capitulino
        }
1019 e1c37d0e Luiz Capitulino
1020 e1c37d0e Luiz Capitulino
        status = g_malloc0(sizeof(*status));
1021 e1c37d0e Luiz Capitulino
        status->mon = mon;
1022 e1c37d0e Luiz Capitulino
        status->is_block_migration = blk || inc;
1023 e1c37d0e Luiz Capitulino
        status->timer = qemu_new_timer_ms(rt_clock, hmp_migrate_status_cb,
1024 e1c37d0e Luiz Capitulino
                                          status);
1025 e1c37d0e Luiz Capitulino
        qemu_mod_timer(status->timer, qemu_get_clock_ms(rt_clock));
1026 e1c37d0e Luiz Capitulino
    }
1027 e1c37d0e Luiz Capitulino
}
1028 a15fef21 Luiz Capitulino
1029 a15fef21 Luiz Capitulino
void hmp_device_del(Monitor *mon, const QDict *qdict)
1030 a15fef21 Luiz Capitulino
{
1031 a15fef21 Luiz Capitulino
    const char *id = qdict_get_str(qdict, "id");
1032 a15fef21 Luiz Capitulino
    Error *err = NULL;
1033 a15fef21 Luiz Capitulino
1034 a15fef21 Luiz Capitulino
    qmp_device_del(id, &err);
1035 a15fef21 Luiz Capitulino
    hmp_handle_error(mon, &err);
1036 a15fef21 Luiz Capitulino
}
1037 783e9b48 Wen Congyang
1038 783e9b48 Wen Congyang
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
1039 783e9b48 Wen Congyang
{
1040 783e9b48 Wen Congyang
    Error *errp = NULL;
1041 783e9b48 Wen Congyang
    int paging = qdict_get_try_bool(qdict, "paging", 0);
1042 783e9b48 Wen Congyang
    const char *file = qdict_get_str(qdict, "protocol");
1043 783e9b48 Wen Congyang
    bool has_begin = qdict_haskey(qdict, "begin");
1044 783e9b48 Wen Congyang
    bool has_length = qdict_haskey(qdict, "length");
1045 783e9b48 Wen Congyang
    int64_t begin = 0;
1046 783e9b48 Wen Congyang
    int64_t length = 0;
1047 783e9b48 Wen Congyang
1048 783e9b48 Wen Congyang
    if (has_begin) {
1049 783e9b48 Wen Congyang
        begin = qdict_get_int(qdict, "begin");
1050 783e9b48 Wen Congyang
    }
1051 783e9b48 Wen Congyang
    if (has_length) {
1052 783e9b48 Wen Congyang
        length = qdict_get_int(qdict, "length");
1053 783e9b48 Wen Congyang
    }
1054 783e9b48 Wen Congyang
1055 783e9b48 Wen Congyang
    qmp_dump_guest_memory(paging, file, has_begin, begin, has_length, length,
1056 783e9b48 Wen Congyang
                          &errp);
1057 783e9b48 Wen Congyang
    hmp_handle_error(mon, &errp);
1058 783e9b48 Wen Congyang
}
1059 928059a3 Luiz Capitulino
1060 928059a3 Luiz Capitulino
void hmp_netdev_add(Monitor *mon, const QDict *qdict)
1061 928059a3 Luiz Capitulino
{
1062 928059a3 Luiz Capitulino
    Error *err = NULL;
1063 928059a3 Luiz Capitulino
    QemuOpts *opts;
1064 928059a3 Luiz Capitulino
1065 928059a3 Luiz Capitulino
    opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
1066 928059a3 Luiz Capitulino
    if (error_is_set(&err)) {
1067 928059a3 Luiz Capitulino
        goto out;
1068 928059a3 Luiz Capitulino
    }
1069 928059a3 Luiz Capitulino
1070 928059a3 Luiz Capitulino
    netdev_add(opts, &err);
1071 928059a3 Luiz Capitulino
    if (error_is_set(&err)) {
1072 928059a3 Luiz Capitulino
        qemu_opts_del(opts);
1073 928059a3 Luiz Capitulino
    }
1074 928059a3 Luiz Capitulino
1075 928059a3 Luiz Capitulino
out:
1076 928059a3 Luiz Capitulino
    hmp_handle_error(mon, &err);
1077 928059a3 Luiz Capitulino
}
1078 5f964155 Luiz Capitulino
1079 5f964155 Luiz Capitulino
void hmp_netdev_del(Monitor *mon, const QDict *qdict)
1080 5f964155 Luiz Capitulino
{
1081 5f964155 Luiz Capitulino
    const char *id = qdict_get_str(qdict, "id");
1082 5f964155 Luiz Capitulino
    Error *err = NULL;
1083 5f964155 Luiz Capitulino
1084 5f964155 Luiz Capitulino
    qmp_netdev_del(id, &err);
1085 5f964155 Luiz Capitulino
    hmp_handle_error(mon, &err);
1086 5f964155 Luiz Capitulino
}
1087 208c9d1b Corey Bryant
1088 208c9d1b Corey Bryant
void hmp_getfd(Monitor *mon, const QDict *qdict)
1089 208c9d1b Corey Bryant
{
1090 208c9d1b Corey Bryant
    const char *fdname = qdict_get_str(qdict, "fdname");
1091 208c9d1b Corey Bryant
    Error *errp = NULL;
1092 208c9d1b Corey Bryant
1093 208c9d1b Corey Bryant
    qmp_getfd(fdname, &errp);
1094 208c9d1b Corey Bryant
    hmp_handle_error(mon, &errp);
1095 208c9d1b Corey Bryant
}
1096 208c9d1b Corey Bryant
1097 208c9d1b Corey Bryant
void hmp_closefd(Monitor *mon, const QDict *qdict)
1098 208c9d1b Corey Bryant
{
1099 208c9d1b Corey Bryant
    const char *fdname = qdict_get_str(qdict, "fdname");
1100 208c9d1b Corey Bryant
    Error *errp = NULL;
1101 208c9d1b Corey Bryant
1102 208c9d1b Corey Bryant
    qmp_closefd(fdname, &errp);
1103 208c9d1b Corey Bryant
    hmp_handle_error(mon, &errp);
1104 208c9d1b Corey Bryant
}