xref: /qemu/hw/core/machine-hmp-cmds.c (revision 52581c718c5cd55595ca032a56f1e194c5716456)
1  /*
2   * HMP commands related to machines and CPUs
3   *
4   * Copyright IBM, Corp. 2011
5   *
6   * Authors:
7   *  Anthony Liguori   <aliguori@us.ibm.com>
8   *
9   * This work is licensed under the terms of the GNU GPL, version 2.  See
10   * the COPYING file in the top-level directory.
11   *
12   * Contributions after 2012-01-13 are licensed under the terms of the
13   * GNU GPL, version 2 or (at your option) any later version.
14   */
15  
16  #include "qemu/osdep.h"
17  #include "monitor/hmp.h"
18  #include "monitor/monitor.h"
19  #include "qapi/error.h"
20  #include "qapi/qapi-builtin-visit.h"
21  #include "qapi/qapi-commands-machine.h"
22  #include "qapi/qmp/qdict.h"
23  #include "qapi/string-output-visitor.h"
24  #include "qemu/error-report.h"
25  #include "sysemu/numa.h"
26  #include "hw/boards.h"
27  
28  void hmp_info_cpus(Monitor *mon, const QDict *qdict)
29  {
30      CpuInfoFastList *cpu_list, *cpu;
31  
32      cpu_list = qmp_query_cpus_fast(NULL);
33  
34      for (cpu = cpu_list; cpu; cpu = cpu->next) {
35          int active = ' ';
36  
37          if (cpu->value->cpu_index == monitor_get_cpu_index(mon)) {
38              active = '*';
39          }
40  
41          monitor_printf(mon, "%c CPU #%" PRId64 ":", active,
42                         cpu->value->cpu_index);
43          monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id);
44      }
45  
46      qapi_free_CpuInfoFastList(cpu_list);
47  }
48  
49  void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict)
50  {
51      Error *err = NULL;
52      HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err);
53      HotpluggableCPUList *saved = l;
54      CpuInstanceProperties *c;
55  
56      if (hmp_handle_error(mon, err)) {
57          return;
58      }
59  
60      monitor_printf(mon, "Hotpluggable CPUs:\n");
61      while (l) {
62          monitor_printf(mon, "  type: \"%s\"\n", l->value->type);
63          monitor_printf(mon, "  vcpus_count: \"%" PRIu64 "\"\n",
64                         l->value->vcpus_count);
65          if (l->value->has_qom_path) {
66              monitor_printf(mon, "  qom_path: \"%s\"\n", l->value->qom_path);
67          }
68  
69          c = l->value->props;
70          monitor_printf(mon, "  CPUInstance Properties:\n");
71          if (c->has_node_id) {
72              monitor_printf(mon, "    node-id: \"%" PRIu64 "\"\n", c->node_id);
73          }
74          if (c->has_socket_id) {
75              monitor_printf(mon, "    socket-id: \"%" PRIu64 "\"\n", c->socket_id);
76          }
77          if (c->has_die_id) {
78              monitor_printf(mon, "    die-id: \"%" PRIu64 "\"\n", c->die_id);
79          }
80          if (c->has_cluster_id) {
81              monitor_printf(mon, "    cluster-id: \"%" PRIu64 "\"\n",
82                             c->cluster_id);
83          }
84          if (c->has_core_id) {
85              monitor_printf(mon, "    core-id: \"%" PRIu64 "\"\n", c->core_id);
86          }
87          if (c->has_thread_id) {
88              monitor_printf(mon, "    thread-id: \"%" PRIu64 "\"\n", c->thread_id);
89          }
90  
91          l = l->next;
92      }
93  
94      qapi_free_HotpluggableCPUList(saved);
95  }
96  
97  void hmp_info_memdev(Monitor *mon, const QDict *qdict)
98  {
99      Error *err = NULL;
100      MemdevList *memdev_list = qmp_query_memdev(&err);
101      MemdevList *m = memdev_list;
102      Visitor *v;
103      char *str;
104  
105      while (m) {
106          v = string_output_visitor_new(false, &str);
107          visit_type_uint16List(v, NULL, &m->value->host_nodes, &error_abort);
108          monitor_printf(mon, "memory backend: %s\n", m->value->id);
109          monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
110          monitor_printf(mon, "  merge: %s\n",
111                         m->value->merge ? "true" : "false");
112          monitor_printf(mon, "  dump: %s\n",
113                         m->value->dump ? "true" : "false");
114          monitor_printf(mon, "  prealloc: %s\n",
115                         m->value->prealloc ? "true" : "false");
116          monitor_printf(mon, "  share: %s\n",
117                         m->value->share ? "true" : "false");
118          if (m->value->has_reserve) {
119              monitor_printf(mon, "  reserve: %s\n",
120                             m->value->reserve ? "true" : "false");
121          }
122          monitor_printf(mon, "  policy: %s\n",
123                         HostMemPolicy_str(m->value->policy));
124          visit_complete(v, &str);
125          monitor_printf(mon, "  host nodes: %s\n", str);
126  
127          g_free(str);
128          visit_free(v);
129          m = m->next;
130      }
131  
132      monitor_printf(mon, "\n");
133  
134      qapi_free_MemdevList(memdev_list);
135      hmp_handle_error(mon, err);
136  }
137