136d20cb2SMarcel Apfelbaum /* 236d20cb2SMarcel Apfelbaum * QEMU Machine 336d20cb2SMarcel Apfelbaum * 436d20cb2SMarcel Apfelbaum * Copyright (C) 2014 Red Hat Inc 536d20cb2SMarcel Apfelbaum * 636d20cb2SMarcel Apfelbaum * Authors: 736d20cb2SMarcel Apfelbaum * Marcel Apfelbaum <marcel.a@redhat.com> 836d20cb2SMarcel Apfelbaum * 936d20cb2SMarcel Apfelbaum * This work is licensed under the terms of the GNU GPL, version 2 or later. 1036d20cb2SMarcel Apfelbaum * See the COPYING file in the top-level directory. 1136d20cb2SMarcel Apfelbaum */ 1236d20cb2SMarcel Apfelbaum 1336d20cb2SMarcel Apfelbaum #include "hw/boards.h" 146b1b1440SMarcel Apfelbaum #include "qapi/visitor.h" 1533cd52b5SAlexander Graf #include "hw/sysbus.h" 1633cd52b5SAlexander Graf #include "sysemu/sysemu.h" 1733cd52b5SAlexander Graf #include "qemu/error-report.h" 186b1b1440SMarcel Apfelbaum 196b1b1440SMarcel Apfelbaum static char *machine_get_accel(Object *obj, Error **errp) 206b1b1440SMarcel Apfelbaum { 216b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 226b1b1440SMarcel Apfelbaum 236b1b1440SMarcel Apfelbaum return g_strdup(ms->accel); 246b1b1440SMarcel Apfelbaum } 256b1b1440SMarcel Apfelbaum 266b1b1440SMarcel Apfelbaum static void machine_set_accel(Object *obj, const char *value, Error **errp) 276b1b1440SMarcel Apfelbaum { 286b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 296b1b1440SMarcel Apfelbaum 30556068eeSEduardo Habkost g_free(ms->accel); 316b1b1440SMarcel Apfelbaum ms->accel = g_strdup(value); 326b1b1440SMarcel Apfelbaum } 336b1b1440SMarcel Apfelbaum 346b1b1440SMarcel Apfelbaum static void machine_set_kernel_irqchip(Object *obj, bool value, Error **errp) 356b1b1440SMarcel Apfelbaum { 366b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 376b1b1440SMarcel Apfelbaum 38d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = value; 39d8870d02SMarcel Apfelbaum ms->kernel_irqchip_required = value; 406b1b1440SMarcel Apfelbaum } 416b1b1440SMarcel Apfelbaum 426b1b1440SMarcel Apfelbaum static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v, 436b1b1440SMarcel Apfelbaum void *opaque, const char *name, 446b1b1440SMarcel Apfelbaum Error **errp) 456b1b1440SMarcel Apfelbaum { 466b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 476b1b1440SMarcel Apfelbaum int64_t value = ms->kvm_shadow_mem; 486b1b1440SMarcel Apfelbaum 496b1b1440SMarcel Apfelbaum visit_type_int(v, &value, name, errp); 506b1b1440SMarcel Apfelbaum } 516b1b1440SMarcel Apfelbaum 526b1b1440SMarcel Apfelbaum static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v, 536b1b1440SMarcel Apfelbaum void *opaque, const char *name, 546b1b1440SMarcel Apfelbaum Error **errp) 556b1b1440SMarcel Apfelbaum { 566b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 576b1b1440SMarcel Apfelbaum Error *error = NULL; 586b1b1440SMarcel Apfelbaum int64_t value; 596b1b1440SMarcel Apfelbaum 606b1b1440SMarcel Apfelbaum visit_type_int(v, &value, name, &error); 616b1b1440SMarcel Apfelbaum if (error) { 626b1b1440SMarcel Apfelbaum error_propagate(errp, error); 636b1b1440SMarcel Apfelbaum return; 646b1b1440SMarcel Apfelbaum } 656b1b1440SMarcel Apfelbaum 666b1b1440SMarcel Apfelbaum ms->kvm_shadow_mem = value; 676b1b1440SMarcel Apfelbaum } 686b1b1440SMarcel Apfelbaum 696b1b1440SMarcel Apfelbaum static char *machine_get_kernel(Object *obj, Error **errp) 706b1b1440SMarcel Apfelbaum { 716b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 726b1b1440SMarcel Apfelbaum 736b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_filename); 746b1b1440SMarcel Apfelbaum } 756b1b1440SMarcel Apfelbaum 766b1b1440SMarcel Apfelbaum static void machine_set_kernel(Object *obj, const char *value, Error **errp) 776b1b1440SMarcel Apfelbaum { 786b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 796b1b1440SMarcel Apfelbaum 80556068eeSEduardo Habkost g_free(ms->kernel_filename); 816b1b1440SMarcel Apfelbaum ms->kernel_filename = g_strdup(value); 826b1b1440SMarcel Apfelbaum } 836b1b1440SMarcel Apfelbaum 846b1b1440SMarcel Apfelbaum static char *machine_get_initrd(Object *obj, Error **errp) 856b1b1440SMarcel Apfelbaum { 866b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 876b1b1440SMarcel Apfelbaum 886b1b1440SMarcel Apfelbaum return g_strdup(ms->initrd_filename); 896b1b1440SMarcel Apfelbaum } 906b1b1440SMarcel Apfelbaum 916b1b1440SMarcel Apfelbaum static void machine_set_initrd(Object *obj, const char *value, Error **errp) 926b1b1440SMarcel Apfelbaum { 936b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 946b1b1440SMarcel Apfelbaum 95556068eeSEduardo Habkost g_free(ms->initrd_filename); 966b1b1440SMarcel Apfelbaum ms->initrd_filename = g_strdup(value); 976b1b1440SMarcel Apfelbaum } 986b1b1440SMarcel Apfelbaum 996b1b1440SMarcel Apfelbaum static char *machine_get_append(Object *obj, Error **errp) 1006b1b1440SMarcel Apfelbaum { 1016b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1026b1b1440SMarcel Apfelbaum 1036b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_cmdline); 1046b1b1440SMarcel Apfelbaum } 1056b1b1440SMarcel Apfelbaum 1066b1b1440SMarcel Apfelbaum static void machine_set_append(Object *obj, const char *value, Error **errp) 1076b1b1440SMarcel Apfelbaum { 1086b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1096b1b1440SMarcel Apfelbaum 110556068eeSEduardo Habkost g_free(ms->kernel_cmdline); 1116b1b1440SMarcel Apfelbaum ms->kernel_cmdline = g_strdup(value); 1126b1b1440SMarcel Apfelbaum } 1136b1b1440SMarcel Apfelbaum 1146b1b1440SMarcel Apfelbaum static char *machine_get_dtb(Object *obj, Error **errp) 1156b1b1440SMarcel Apfelbaum { 1166b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1176b1b1440SMarcel Apfelbaum 1186b1b1440SMarcel Apfelbaum return g_strdup(ms->dtb); 1196b1b1440SMarcel Apfelbaum } 1206b1b1440SMarcel Apfelbaum 1216b1b1440SMarcel Apfelbaum static void machine_set_dtb(Object *obj, const char *value, Error **errp) 1226b1b1440SMarcel Apfelbaum { 1236b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1246b1b1440SMarcel Apfelbaum 125556068eeSEduardo Habkost g_free(ms->dtb); 1266b1b1440SMarcel Apfelbaum ms->dtb = g_strdup(value); 1276b1b1440SMarcel Apfelbaum } 1286b1b1440SMarcel Apfelbaum 1296b1b1440SMarcel Apfelbaum static char *machine_get_dumpdtb(Object *obj, Error **errp) 1306b1b1440SMarcel Apfelbaum { 1316b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1326b1b1440SMarcel Apfelbaum 1336b1b1440SMarcel Apfelbaum return g_strdup(ms->dumpdtb); 1346b1b1440SMarcel Apfelbaum } 1356b1b1440SMarcel Apfelbaum 1366b1b1440SMarcel Apfelbaum static void machine_set_dumpdtb(Object *obj, const char *value, Error **errp) 1376b1b1440SMarcel Apfelbaum { 1386b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1396b1b1440SMarcel Apfelbaum 140556068eeSEduardo Habkost g_free(ms->dumpdtb); 1416b1b1440SMarcel Apfelbaum ms->dumpdtb = g_strdup(value); 1426b1b1440SMarcel Apfelbaum } 1436b1b1440SMarcel Apfelbaum 1446b1b1440SMarcel Apfelbaum static void machine_get_phandle_start(Object *obj, Visitor *v, 1456b1b1440SMarcel Apfelbaum void *opaque, const char *name, 1466b1b1440SMarcel Apfelbaum Error **errp) 1476b1b1440SMarcel Apfelbaum { 1486b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1496b1b1440SMarcel Apfelbaum int64_t value = ms->phandle_start; 1506b1b1440SMarcel Apfelbaum 1516b1b1440SMarcel Apfelbaum visit_type_int(v, &value, name, errp); 1526b1b1440SMarcel Apfelbaum } 1536b1b1440SMarcel Apfelbaum 1546b1b1440SMarcel Apfelbaum static void machine_set_phandle_start(Object *obj, Visitor *v, 1556b1b1440SMarcel Apfelbaum void *opaque, const char *name, 1566b1b1440SMarcel Apfelbaum Error **errp) 1576b1b1440SMarcel Apfelbaum { 1586b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1596b1b1440SMarcel Apfelbaum Error *error = NULL; 1606b1b1440SMarcel Apfelbaum int64_t value; 1616b1b1440SMarcel Apfelbaum 1626b1b1440SMarcel Apfelbaum visit_type_int(v, &value, name, &error); 1636b1b1440SMarcel Apfelbaum if (error) { 1646b1b1440SMarcel Apfelbaum error_propagate(errp, error); 1656b1b1440SMarcel Apfelbaum return; 1666b1b1440SMarcel Apfelbaum } 1676b1b1440SMarcel Apfelbaum 1686b1b1440SMarcel Apfelbaum ms->phandle_start = value; 1696b1b1440SMarcel Apfelbaum } 1706b1b1440SMarcel Apfelbaum 1716b1b1440SMarcel Apfelbaum static char *machine_get_dt_compatible(Object *obj, Error **errp) 1726b1b1440SMarcel Apfelbaum { 1736b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1746b1b1440SMarcel Apfelbaum 1756b1b1440SMarcel Apfelbaum return g_strdup(ms->dt_compatible); 1766b1b1440SMarcel Apfelbaum } 1776b1b1440SMarcel Apfelbaum 1786b1b1440SMarcel Apfelbaum static void machine_set_dt_compatible(Object *obj, const char *value, Error **errp) 1796b1b1440SMarcel Apfelbaum { 1806b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1816b1b1440SMarcel Apfelbaum 182556068eeSEduardo Habkost g_free(ms->dt_compatible); 1836b1b1440SMarcel Apfelbaum ms->dt_compatible = g_strdup(value); 1846b1b1440SMarcel Apfelbaum } 1856b1b1440SMarcel Apfelbaum 1866b1b1440SMarcel Apfelbaum static bool machine_get_dump_guest_core(Object *obj, Error **errp) 1876b1b1440SMarcel Apfelbaum { 1886b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1896b1b1440SMarcel Apfelbaum 1906b1b1440SMarcel Apfelbaum return ms->dump_guest_core; 1916b1b1440SMarcel Apfelbaum } 1926b1b1440SMarcel Apfelbaum 1936b1b1440SMarcel Apfelbaum static void machine_set_dump_guest_core(Object *obj, bool value, Error **errp) 1946b1b1440SMarcel Apfelbaum { 1956b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1966b1b1440SMarcel Apfelbaum 1976b1b1440SMarcel Apfelbaum ms->dump_guest_core = value; 1986b1b1440SMarcel Apfelbaum } 1996b1b1440SMarcel Apfelbaum 2006b1b1440SMarcel Apfelbaum static bool machine_get_mem_merge(Object *obj, Error **errp) 2016b1b1440SMarcel Apfelbaum { 2026b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2036b1b1440SMarcel Apfelbaum 2046b1b1440SMarcel Apfelbaum return ms->mem_merge; 2056b1b1440SMarcel Apfelbaum } 2066b1b1440SMarcel Apfelbaum 2076b1b1440SMarcel Apfelbaum static void machine_set_mem_merge(Object *obj, bool value, Error **errp) 2086b1b1440SMarcel Apfelbaum { 2096b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2106b1b1440SMarcel Apfelbaum 2116b1b1440SMarcel Apfelbaum ms->mem_merge = value; 2126b1b1440SMarcel Apfelbaum } 2136b1b1440SMarcel Apfelbaum 2146b1b1440SMarcel Apfelbaum static bool machine_get_usb(Object *obj, Error **errp) 2156b1b1440SMarcel Apfelbaum { 2166b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2176b1b1440SMarcel Apfelbaum 2186b1b1440SMarcel Apfelbaum return ms->usb; 2196b1b1440SMarcel Apfelbaum } 2206b1b1440SMarcel Apfelbaum 2216b1b1440SMarcel Apfelbaum static void machine_set_usb(Object *obj, bool value, Error **errp) 2226b1b1440SMarcel Apfelbaum { 2236b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2246b1b1440SMarcel Apfelbaum 2256b1b1440SMarcel Apfelbaum ms->usb = value; 226c6e76503SPaolo Bonzini ms->usb_disabled = !value; 2276b1b1440SMarcel Apfelbaum } 2286b1b1440SMarcel Apfelbaum 2296b1b1440SMarcel Apfelbaum static char *machine_get_firmware(Object *obj, Error **errp) 2306b1b1440SMarcel Apfelbaum { 2316b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2326b1b1440SMarcel Apfelbaum 2336b1b1440SMarcel Apfelbaum return g_strdup(ms->firmware); 2346b1b1440SMarcel Apfelbaum } 2356b1b1440SMarcel Apfelbaum 2366b1b1440SMarcel Apfelbaum static void machine_set_firmware(Object *obj, const char *value, Error **errp) 2376b1b1440SMarcel Apfelbaum { 2386b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2396b1b1440SMarcel Apfelbaum 240556068eeSEduardo Habkost g_free(ms->firmware); 2416b1b1440SMarcel Apfelbaum ms->firmware = g_strdup(value); 2426b1b1440SMarcel Apfelbaum } 2436b1b1440SMarcel Apfelbaum 244a52a7fdfSLe Tan static bool machine_get_iommu(Object *obj, Error **errp) 245a52a7fdfSLe Tan { 246a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 247a52a7fdfSLe Tan 248a52a7fdfSLe Tan return ms->iommu; 249a52a7fdfSLe Tan } 250a52a7fdfSLe Tan 251a52a7fdfSLe Tan static void machine_set_iommu(Object *obj, bool value, Error **errp) 252a52a7fdfSLe Tan { 253a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 254a52a7fdfSLe Tan 255a52a7fdfSLe Tan ms->iommu = value; 256a52a7fdfSLe Tan } 257a52a7fdfSLe Tan 2589850c604SAlexander Graf static void machine_set_suppress_vmdesc(Object *obj, bool value, Error **errp) 2599850c604SAlexander Graf { 2609850c604SAlexander Graf MachineState *ms = MACHINE(obj); 2619850c604SAlexander Graf 2629850c604SAlexander Graf ms->suppress_vmdesc = value; 2639850c604SAlexander Graf } 2649850c604SAlexander Graf 2659850c604SAlexander Graf static bool machine_get_suppress_vmdesc(Object *obj, Error **errp) 2669850c604SAlexander Graf { 2679850c604SAlexander Graf MachineState *ms = MACHINE(obj); 2689850c604SAlexander Graf 2699850c604SAlexander Graf return ms->suppress_vmdesc; 2709850c604SAlexander Graf } 2719850c604SAlexander Graf 27233cd52b5SAlexander Graf static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) 27333cd52b5SAlexander Graf { 27433cd52b5SAlexander Graf error_report("Option '-device %s' cannot be handled by this machine", 27533cd52b5SAlexander Graf object_class_get_name(object_get_class(OBJECT(sbdev)))); 27633cd52b5SAlexander Graf exit(1); 27733cd52b5SAlexander Graf } 27833cd52b5SAlexander Graf 27933cd52b5SAlexander Graf static void machine_init_notify(Notifier *notifier, void *data) 28033cd52b5SAlexander Graf { 28133cd52b5SAlexander Graf Object *machine = qdev_get_machine(); 28233cd52b5SAlexander Graf ObjectClass *oc = object_get_class(machine); 28333cd52b5SAlexander Graf MachineClass *mc = MACHINE_CLASS(oc); 28433cd52b5SAlexander Graf 28533cd52b5SAlexander Graf if (mc->has_dynamic_sysbus) { 28633cd52b5SAlexander Graf /* Our machine can handle dynamic sysbus devices, we're all good */ 28733cd52b5SAlexander Graf return; 28833cd52b5SAlexander Graf } 28933cd52b5SAlexander Graf 29033cd52b5SAlexander Graf /* 29133cd52b5SAlexander Graf * Loop through all dynamically created devices and check whether there 29233cd52b5SAlexander Graf * are sysbus devices among them. If there are, error out. 29333cd52b5SAlexander Graf */ 29433cd52b5SAlexander Graf foreach_dynamic_sysbus_device(error_on_sysbus_device, NULL); 29533cd52b5SAlexander Graf } 29633cd52b5SAlexander Graf 297*076b35b5SNikunj A Dadhania static void machine_class_init(ObjectClass *oc, void *data) 298*076b35b5SNikunj A Dadhania { 299*076b35b5SNikunj A Dadhania MachineClass *mc = MACHINE_CLASS(oc); 300*076b35b5SNikunj A Dadhania 301*076b35b5SNikunj A Dadhania /* Default 128 MB as guest ram size */ 302*076b35b5SNikunj A Dadhania mc->default_ram_size = 128 * M_BYTE; 303*076b35b5SNikunj A Dadhania } 304*076b35b5SNikunj A Dadhania 3056b1b1440SMarcel Apfelbaum static void machine_initfn(Object *obj) 3066b1b1440SMarcel Apfelbaum { 30733cd52b5SAlexander Graf MachineState *ms = MACHINE(obj); 30833cd52b5SAlexander Graf 309d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = true; 3104689b77bSMarcel Apfelbaum ms->kvm_shadow_mem = -1; 31147c8ca53SMarcel Apfelbaum ms->dump_guest_core = true; 31275cc7f01SMarcel Apfelbaum ms->mem_merge = true; 313d8870d02SMarcel Apfelbaum 3146b1b1440SMarcel Apfelbaum object_property_add_str(obj, "accel", 3156b1b1440SMarcel Apfelbaum machine_get_accel, machine_set_accel, NULL); 31649d2e648SMarcel Apfelbaum object_property_set_description(obj, "accel", 31749d2e648SMarcel Apfelbaum "Accelerator list", 31849d2e648SMarcel Apfelbaum NULL); 319b0ddb8bfSMarcel Apfelbaum object_property_add_bool(obj, "kernel-irqchip", 320d8870d02SMarcel Apfelbaum NULL, 3216b1b1440SMarcel Apfelbaum machine_set_kernel_irqchip, 3226b1b1440SMarcel Apfelbaum NULL); 32349d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel-irqchip", 32449d2e648SMarcel Apfelbaum "Use KVM in-kernel irqchip", 32549d2e648SMarcel Apfelbaum NULL); 326b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "kvm-shadow-mem", "int", 3276b1b1440SMarcel Apfelbaum machine_get_kvm_shadow_mem, 3286b1b1440SMarcel Apfelbaum machine_set_kvm_shadow_mem, 3296b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 33049d2e648SMarcel Apfelbaum object_property_set_description(obj, "kvm-shadow-mem", 33149d2e648SMarcel Apfelbaum "KVM shadow MMU size", 33249d2e648SMarcel Apfelbaum NULL); 3336b1b1440SMarcel Apfelbaum object_property_add_str(obj, "kernel", 3346b1b1440SMarcel Apfelbaum machine_get_kernel, machine_set_kernel, NULL); 33549d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel", 33649d2e648SMarcel Apfelbaum "Linux kernel image file", 33749d2e648SMarcel Apfelbaum NULL); 3386b1b1440SMarcel Apfelbaum object_property_add_str(obj, "initrd", 3396b1b1440SMarcel Apfelbaum machine_get_initrd, machine_set_initrd, NULL); 34049d2e648SMarcel Apfelbaum object_property_set_description(obj, "initrd", 34149d2e648SMarcel Apfelbaum "Linux initial ramdisk file", 34249d2e648SMarcel Apfelbaum NULL); 3436b1b1440SMarcel Apfelbaum object_property_add_str(obj, "append", 3446b1b1440SMarcel Apfelbaum machine_get_append, machine_set_append, NULL); 34549d2e648SMarcel Apfelbaum object_property_set_description(obj, "append", 34649d2e648SMarcel Apfelbaum "Linux kernel command line", 34749d2e648SMarcel Apfelbaum NULL); 3486b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dtb", 3496b1b1440SMarcel Apfelbaum machine_get_dtb, machine_set_dtb, NULL); 35049d2e648SMarcel Apfelbaum object_property_set_description(obj, "dtb", 35149d2e648SMarcel Apfelbaum "Linux kernel device tree file", 35249d2e648SMarcel Apfelbaum NULL); 3536b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dumpdtb", 3546b1b1440SMarcel Apfelbaum machine_get_dumpdtb, machine_set_dumpdtb, NULL); 35549d2e648SMarcel Apfelbaum object_property_set_description(obj, "dumpdtb", 35649d2e648SMarcel Apfelbaum "Dump current dtb to a file and quit", 35749d2e648SMarcel Apfelbaum NULL); 358b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "phandle-start", "int", 3596b1b1440SMarcel Apfelbaum machine_get_phandle_start, 3606b1b1440SMarcel Apfelbaum machine_set_phandle_start, 3616b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 36249d2e648SMarcel Apfelbaum object_property_set_description(obj, "phandle-start", 36349d2e648SMarcel Apfelbaum "The first phandle ID we may generate dynamically", 36449d2e648SMarcel Apfelbaum NULL); 365b0ddb8bfSMarcel Apfelbaum object_property_add_str(obj, "dt-compatible", 3666b1b1440SMarcel Apfelbaum machine_get_dt_compatible, 3676b1b1440SMarcel Apfelbaum machine_set_dt_compatible, 3686b1b1440SMarcel Apfelbaum NULL); 36949d2e648SMarcel Apfelbaum object_property_set_description(obj, "dt-compatible", 37049d2e648SMarcel Apfelbaum "Overrides the \"compatible\" property of the dt root node", 37149d2e648SMarcel Apfelbaum NULL); 3726b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "dump-guest-core", 3736b1b1440SMarcel Apfelbaum machine_get_dump_guest_core, 3746b1b1440SMarcel Apfelbaum machine_set_dump_guest_core, 3756b1b1440SMarcel Apfelbaum NULL); 37649d2e648SMarcel Apfelbaum object_property_set_description(obj, "dump-guest-core", 37749d2e648SMarcel Apfelbaum "Include guest memory in a core dump", 37849d2e648SMarcel Apfelbaum NULL); 3796b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "mem-merge", 380ac40aa15SLe Tan machine_get_mem_merge, 381ac40aa15SLe Tan machine_set_mem_merge, NULL); 38249d2e648SMarcel Apfelbaum object_property_set_description(obj, "mem-merge", 38349d2e648SMarcel Apfelbaum "Enable/disable memory merge support", 38449d2e648SMarcel Apfelbaum NULL); 385ac40aa15SLe Tan object_property_add_bool(obj, "usb", 386ac40aa15SLe Tan machine_get_usb, 387ac40aa15SLe Tan machine_set_usb, NULL); 38849d2e648SMarcel Apfelbaum object_property_set_description(obj, "usb", 38949d2e648SMarcel Apfelbaum "Set on/off to enable/disable usb", 39049d2e648SMarcel Apfelbaum NULL); 3916b1b1440SMarcel Apfelbaum object_property_add_str(obj, "firmware", 392ac40aa15SLe Tan machine_get_firmware, 393ac40aa15SLe Tan machine_set_firmware, NULL); 39449d2e648SMarcel Apfelbaum object_property_set_description(obj, "firmware", 39549d2e648SMarcel Apfelbaum "Firmware image", 39649d2e648SMarcel Apfelbaum NULL); 397a52a7fdfSLe Tan object_property_add_bool(obj, "iommu", 398a52a7fdfSLe Tan machine_get_iommu, 399a52a7fdfSLe Tan machine_set_iommu, NULL); 40049d2e648SMarcel Apfelbaum object_property_set_description(obj, "iommu", 40149d2e648SMarcel Apfelbaum "Set on/off to enable/disable Intel IOMMU (VT-d)", 40249d2e648SMarcel Apfelbaum NULL); 4039850c604SAlexander Graf object_property_add_bool(obj, "suppress-vmdesc", 4049850c604SAlexander Graf machine_get_suppress_vmdesc, 4059850c604SAlexander Graf machine_set_suppress_vmdesc, NULL); 4069850c604SAlexander Graf object_property_set_description(obj, "suppress-vmdesc", 4079850c604SAlexander Graf "Set on to disable self-describing migration", 4089850c604SAlexander Graf NULL); 40933cd52b5SAlexander Graf 41033cd52b5SAlexander Graf /* Register notifier when init is done for sysbus sanity checks */ 41133cd52b5SAlexander Graf ms->sysbus_notifier.notify = machine_init_notify; 41233cd52b5SAlexander Graf qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); 4136b1b1440SMarcel Apfelbaum } 4146b1b1440SMarcel Apfelbaum 4156b1b1440SMarcel Apfelbaum static void machine_finalize(Object *obj) 4166b1b1440SMarcel Apfelbaum { 4176b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 4186b1b1440SMarcel Apfelbaum 4196b1b1440SMarcel Apfelbaum g_free(ms->accel); 4206b1b1440SMarcel Apfelbaum g_free(ms->kernel_filename); 4216b1b1440SMarcel Apfelbaum g_free(ms->initrd_filename); 4226b1b1440SMarcel Apfelbaum g_free(ms->kernel_cmdline); 4236b1b1440SMarcel Apfelbaum g_free(ms->dtb); 4246b1b1440SMarcel Apfelbaum g_free(ms->dumpdtb); 4256b1b1440SMarcel Apfelbaum g_free(ms->dt_compatible); 4266b1b1440SMarcel Apfelbaum g_free(ms->firmware); 4276b1b1440SMarcel Apfelbaum } 42836d20cb2SMarcel Apfelbaum 4295e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine) 4305e97b623SMarcel Apfelbaum { 4315e97b623SMarcel Apfelbaum return machine->usb; 4325e97b623SMarcel Apfelbaum } 4335e97b623SMarcel Apfelbaum 4348caff636SMarcel Apfelbaum bool machine_iommu(MachineState *machine) 4358caff636SMarcel Apfelbaum { 4368caff636SMarcel Apfelbaum return machine->iommu; 4378caff636SMarcel Apfelbaum } 4388caff636SMarcel Apfelbaum 439d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine) 440d8870d02SMarcel Apfelbaum { 441d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_allowed; 442d8870d02SMarcel Apfelbaum } 443d8870d02SMarcel Apfelbaum 444d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine) 445d8870d02SMarcel Apfelbaum { 446d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_required; 447d8870d02SMarcel Apfelbaum } 448d8870d02SMarcel Apfelbaum 4494689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine) 4504689b77bSMarcel Apfelbaum { 4514689b77bSMarcel Apfelbaum return machine->kvm_shadow_mem; 4524689b77bSMarcel Apfelbaum } 4534689b77bSMarcel Apfelbaum 4546cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine) 4556cabe7faSMarcel Apfelbaum { 4566cabe7faSMarcel Apfelbaum return machine->phandle_start; 4576cabe7faSMarcel Apfelbaum } 4586cabe7faSMarcel Apfelbaum 45947c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine) 46047c8ca53SMarcel Apfelbaum { 46147c8ca53SMarcel Apfelbaum return machine->dump_guest_core; 46247c8ca53SMarcel Apfelbaum } 46347c8ca53SMarcel Apfelbaum 46475cc7f01SMarcel Apfelbaum bool machine_mem_merge(MachineState *machine) 46575cc7f01SMarcel Apfelbaum { 46675cc7f01SMarcel Apfelbaum return machine->mem_merge; 46775cc7f01SMarcel Apfelbaum } 46875cc7f01SMarcel Apfelbaum 46936d20cb2SMarcel Apfelbaum static const TypeInfo machine_info = { 47036d20cb2SMarcel Apfelbaum .name = TYPE_MACHINE, 47136d20cb2SMarcel Apfelbaum .parent = TYPE_OBJECT, 47236d20cb2SMarcel Apfelbaum .abstract = true, 47336d20cb2SMarcel Apfelbaum .class_size = sizeof(MachineClass), 474*076b35b5SNikunj A Dadhania .class_init = machine_class_init, 47536d20cb2SMarcel Apfelbaum .instance_size = sizeof(MachineState), 4766b1b1440SMarcel Apfelbaum .instance_init = machine_initfn, 4776b1b1440SMarcel Apfelbaum .instance_finalize = machine_finalize, 47836d20cb2SMarcel Apfelbaum }; 47936d20cb2SMarcel Apfelbaum 48036d20cb2SMarcel Apfelbaum static void machine_register_types(void) 48136d20cb2SMarcel Apfelbaum { 48236d20cb2SMarcel Apfelbaum type_register_static(&machine_info); 48336d20cb2SMarcel Apfelbaum } 48436d20cb2SMarcel Apfelbaum 48536d20cb2SMarcel Apfelbaum type_init(machine_register_types) 486