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