155225c85SMarkus Armbruster /* 255225c85SMarkus Armbruster * HMP commands related to machines and CPUs 355225c85SMarkus Armbruster * 455225c85SMarkus Armbruster * Copyright IBM, Corp. 2011 555225c85SMarkus Armbruster * 655225c85SMarkus Armbruster * Authors: 755225c85SMarkus Armbruster * Anthony Liguori <aliguori@us.ibm.com> 855225c85SMarkus Armbruster * 955225c85SMarkus Armbruster * This work is licensed under the terms of the GNU GPL, version 2. See 1055225c85SMarkus Armbruster * the COPYING file in the top-level directory. 1155225c85SMarkus Armbruster * 1255225c85SMarkus Armbruster * Contributions after 2012-01-13 are licensed under the terms of the 1355225c85SMarkus Armbruster * GNU GPL, version 2 or (at your option) any later version. 1455225c85SMarkus Armbruster */ 1555225c85SMarkus Armbruster 1655225c85SMarkus Armbruster #include "qemu/osdep.h" 1755225c85SMarkus Armbruster #include "monitor/hmp.h" 1855225c85SMarkus Armbruster #include "monitor/monitor.h" 1955225c85SMarkus Armbruster #include "qapi/error.h" 2055225c85SMarkus Armbruster #include "qapi/qapi-builtin-visit.h" 2155225c85SMarkus Armbruster #include "qapi/qapi-commands-machine.h" 2255225c85SMarkus Armbruster #include "qapi/qmp/qdict.h" 2355225c85SMarkus Armbruster #include "qapi/string-output-visitor.h" 2455225c85SMarkus Armbruster #include "qemu/error-report.h" 2555225c85SMarkus Armbruster #include "sysemu/numa.h" 26aa570207STao Xu #include "hw/boards.h" 2755225c85SMarkus Armbruster 2855225c85SMarkus Armbruster void hmp_info_cpus(Monitor *mon, const QDict *qdict) 2955225c85SMarkus Armbruster { 3055225c85SMarkus Armbruster CpuInfoFastList *cpu_list, *cpu; 3155225c85SMarkus Armbruster 3255225c85SMarkus Armbruster cpu_list = qmp_query_cpus_fast(NULL); 3355225c85SMarkus Armbruster 3455225c85SMarkus Armbruster for (cpu = cpu_list; cpu; cpu = cpu->next) { 3555225c85SMarkus Armbruster int active = ' '; 3655225c85SMarkus Armbruster 3787e6f4a4SKevin Wolf if (cpu->value->cpu_index == monitor_get_cpu_index(mon)) { 3855225c85SMarkus Armbruster active = '*'; 3955225c85SMarkus Armbruster } 4055225c85SMarkus Armbruster 4155225c85SMarkus Armbruster monitor_printf(mon, "%c CPU #%" PRId64 ":", active, 4255225c85SMarkus Armbruster cpu->value->cpu_index); 4355225c85SMarkus Armbruster monitor_printf(mon, " thread_id=%" PRId64 "\n", cpu->value->thread_id); 4455225c85SMarkus Armbruster } 4555225c85SMarkus Armbruster 4655225c85SMarkus Armbruster qapi_free_CpuInfoFastList(cpu_list); 4755225c85SMarkus Armbruster } 4855225c85SMarkus Armbruster 4955225c85SMarkus Armbruster void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict) 5055225c85SMarkus Armbruster { 5155225c85SMarkus Armbruster Error *err = NULL; 5255225c85SMarkus Armbruster HotpluggableCPUList *l = qmp_query_hotpluggable_cpus(&err); 5355225c85SMarkus Armbruster HotpluggableCPUList *saved = l; 5455225c85SMarkus Armbruster CpuInstanceProperties *c; 5555225c85SMarkus Armbruster 560ca117a7SDaniel P. Berrangé if (hmp_handle_error(mon, err)) { 5755225c85SMarkus Armbruster return; 5855225c85SMarkus Armbruster } 5955225c85SMarkus Armbruster 6055225c85SMarkus Armbruster monitor_printf(mon, "Hotpluggable CPUs:\n"); 6155225c85SMarkus Armbruster while (l) { 6255225c85SMarkus Armbruster monitor_printf(mon, " type: \"%s\"\n", l->value->type); 6355225c85SMarkus Armbruster monitor_printf(mon, " vcpus_count: \"%" PRIu64 "\"\n", 6455225c85SMarkus Armbruster l->value->vcpus_count); 65*fe8ac1faSMarkus Armbruster if (l->value->qom_path) { 6655225c85SMarkus Armbruster monitor_printf(mon, " qom_path: \"%s\"\n", l->value->qom_path); 6755225c85SMarkus Armbruster } 6855225c85SMarkus Armbruster 6955225c85SMarkus Armbruster c = l->value->props; 7055225c85SMarkus Armbruster monitor_printf(mon, " CPUInstance Properties:\n"); 7155225c85SMarkus Armbruster if (c->has_node_id) { 7255225c85SMarkus Armbruster monitor_printf(mon, " node-id: \"%" PRIu64 "\"\n", c->node_id); 7355225c85SMarkus Armbruster } 7455225c85SMarkus Armbruster if (c->has_socket_id) { 7555225c85SMarkus Armbruster monitor_printf(mon, " socket-id: \"%" PRIu64 "\"\n", c->socket_id); 7655225c85SMarkus Armbruster } 77176d2cdaSLike Xu if (c->has_die_id) { 78176d2cdaSLike Xu monitor_printf(mon, " die-id: \"%" PRIu64 "\"\n", c->die_id); 79176d2cdaSLike Xu } 801dcf7001SGavin Shan if (c->has_cluster_id) { 811dcf7001SGavin Shan monitor_printf(mon, " cluster-id: \"%" PRIu64 "\"\n", 821dcf7001SGavin Shan c->cluster_id); 831dcf7001SGavin Shan } 8455225c85SMarkus Armbruster if (c->has_core_id) { 8555225c85SMarkus Armbruster monitor_printf(mon, " core-id: \"%" PRIu64 "\"\n", c->core_id); 8655225c85SMarkus Armbruster } 8755225c85SMarkus Armbruster if (c->has_thread_id) { 8855225c85SMarkus Armbruster monitor_printf(mon, " thread-id: \"%" PRIu64 "\"\n", c->thread_id); 8955225c85SMarkus Armbruster } 9055225c85SMarkus Armbruster 9155225c85SMarkus Armbruster l = l->next; 9255225c85SMarkus Armbruster } 9355225c85SMarkus Armbruster 9455225c85SMarkus Armbruster qapi_free_HotpluggableCPUList(saved); 9555225c85SMarkus Armbruster } 9655225c85SMarkus Armbruster 9755225c85SMarkus Armbruster void hmp_info_memdev(Monitor *mon, const QDict *qdict) 9855225c85SMarkus Armbruster { 9955225c85SMarkus Armbruster Error *err = NULL; 10055225c85SMarkus Armbruster MemdevList *memdev_list = qmp_query_memdev(&err); 10155225c85SMarkus Armbruster MemdevList *m = memdev_list; 10255225c85SMarkus Armbruster Visitor *v; 10355225c85SMarkus Armbruster char *str; 10455225c85SMarkus Armbruster 10555225c85SMarkus Armbruster while (m) { 10655225c85SMarkus Armbruster v = string_output_visitor_new(false, &str); 1071f584248SMarkus Armbruster visit_type_uint16List(v, NULL, &m->value->host_nodes, &error_abort); 10855225c85SMarkus Armbruster monitor_printf(mon, "memory backend: %s\n", m->value->id); 10955225c85SMarkus Armbruster monitor_printf(mon, " size: %" PRId64 "\n", m->value->size); 11055225c85SMarkus Armbruster monitor_printf(mon, " merge: %s\n", 11155225c85SMarkus Armbruster m->value->merge ? "true" : "false"); 11255225c85SMarkus Armbruster monitor_printf(mon, " dump: %s\n", 11355225c85SMarkus Armbruster m->value->dump ? "true" : "false"); 11455225c85SMarkus Armbruster monitor_printf(mon, " prealloc: %s\n", 11555225c85SMarkus Armbruster m->value->prealloc ? "true" : "false"); 1167428e7baSDavid Hildenbrand monitor_printf(mon, " share: %s\n", 1177428e7baSDavid Hildenbrand m->value->share ? "true" : "false"); 118baa014e3SDavid Hildenbrand if (m->value->has_reserve) { 119baa014e3SDavid Hildenbrand monitor_printf(mon, " reserve: %s\n", 120baa014e3SDavid Hildenbrand m->value->reserve ? "true" : "false"); 121baa014e3SDavid Hildenbrand } 12255225c85SMarkus Armbruster monitor_printf(mon, " policy: %s\n", 12355225c85SMarkus Armbruster HostMemPolicy_str(m->value->policy)); 12455225c85SMarkus Armbruster visit_complete(v, &str); 12555225c85SMarkus Armbruster monitor_printf(mon, " host nodes: %s\n", str); 12655225c85SMarkus Armbruster 12755225c85SMarkus Armbruster g_free(str); 12855225c85SMarkus Armbruster visit_free(v); 12955225c85SMarkus Armbruster m = m->next; 13055225c85SMarkus Armbruster } 13155225c85SMarkus Armbruster 13255225c85SMarkus Armbruster monitor_printf(mon, "\n"); 13355225c85SMarkus Armbruster 13455225c85SMarkus Armbruster qapi_free_MemdevList(memdev_list); 135187c6147SVladimir Sementsov-Ogievskiy hmp_handle_error(mon, err); 13655225c85SMarkus Armbruster } 137