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; 2266b1b1440SMarcel Apfelbaum } 2276b1b1440SMarcel Apfelbaum 2286b1b1440SMarcel Apfelbaum static char *machine_get_firmware(Object *obj, Error **errp) 2296b1b1440SMarcel Apfelbaum { 2306b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2316b1b1440SMarcel Apfelbaum 2326b1b1440SMarcel Apfelbaum return g_strdup(ms->firmware); 2336b1b1440SMarcel Apfelbaum } 2346b1b1440SMarcel Apfelbaum 2356b1b1440SMarcel Apfelbaum static void machine_set_firmware(Object *obj, const char *value, Error **errp) 2366b1b1440SMarcel Apfelbaum { 2376b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2386b1b1440SMarcel Apfelbaum 239556068eeSEduardo Habkost g_free(ms->firmware); 2406b1b1440SMarcel Apfelbaum ms->firmware = g_strdup(value); 2416b1b1440SMarcel Apfelbaum } 2426b1b1440SMarcel Apfelbaum 243a52a7fdfSLe Tan static bool machine_get_iommu(Object *obj, Error **errp) 244a52a7fdfSLe Tan { 245a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 246a52a7fdfSLe Tan 247a52a7fdfSLe Tan return ms->iommu; 248a52a7fdfSLe Tan } 249a52a7fdfSLe Tan 250a52a7fdfSLe Tan static void machine_set_iommu(Object *obj, bool value, Error **errp) 251a52a7fdfSLe Tan { 252a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 253a52a7fdfSLe Tan 254a52a7fdfSLe Tan ms->iommu = value; 255a52a7fdfSLe Tan } 256a52a7fdfSLe Tan 25733cd52b5SAlexander Graf static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) 25833cd52b5SAlexander Graf { 25933cd52b5SAlexander Graf error_report("Option '-device %s' cannot be handled by this machine", 26033cd52b5SAlexander Graf object_class_get_name(object_get_class(OBJECT(sbdev)))); 26133cd52b5SAlexander Graf exit(1); 26233cd52b5SAlexander Graf } 26333cd52b5SAlexander Graf 26433cd52b5SAlexander Graf static void machine_init_notify(Notifier *notifier, void *data) 26533cd52b5SAlexander Graf { 26633cd52b5SAlexander Graf Object *machine = qdev_get_machine(); 26733cd52b5SAlexander Graf ObjectClass *oc = object_get_class(machine); 26833cd52b5SAlexander Graf MachineClass *mc = MACHINE_CLASS(oc); 26933cd52b5SAlexander Graf 27033cd52b5SAlexander Graf if (mc->has_dynamic_sysbus) { 27133cd52b5SAlexander Graf /* Our machine can handle dynamic sysbus devices, we're all good */ 27233cd52b5SAlexander Graf return; 27333cd52b5SAlexander Graf } 27433cd52b5SAlexander Graf 27533cd52b5SAlexander Graf /* 27633cd52b5SAlexander Graf * Loop through all dynamically created devices and check whether there 27733cd52b5SAlexander Graf * are sysbus devices among them. If there are, error out. 27833cd52b5SAlexander Graf */ 27933cd52b5SAlexander Graf foreach_dynamic_sysbus_device(error_on_sysbus_device, NULL); 28033cd52b5SAlexander Graf } 28133cd52b5SAlexander Graf 2826b1b1440SMarcel Apfelbaum static void machine_initfn(Object *obj) 2836b1b1440SMarcel Apfelbaum { 28433cd52b5SAlexander Graf MachineState *ms = MACHINE(obj); 28533cd52b5SAlexander Graf 286d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = true; 2874689b77bSMarcel Apfelbaum ms->kvm_shadow_mem = -1; 288*47c8ca53SMarcel Apfelbaum ms->dump_guest_core = true; 289d8870d02SMarcel Apfelbaum 2906b1b1440SMarcel Apfelbaum object_property_add_str(obj, "accel", 2916b1b1440SMarcel Apfelbaum machine_get_accel, machine_set_accel, NULL); 29249d2e648SMarcel Apfelbaum object_property_set_description(obj, "accel", 29349d2e648SMarcel Apfelbaum "Accelerator list", 29449d2e648SMarcel Apfelbaum NULL); 295b0ddb8bfSMarcel Apfelbaum object_property_add_bool(obj, "kernel-irqchip", 296d8870d02SMarcel Apfelbaum NULL, 2976b1b1440SMarcel Apfelbaum machine_set_kernel_irqchip, 2986b1b1440SMarcel Apfelbaum NULL); 29949d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel-irqchip", 30049d2e648SMarcel Apfelbaum "Use KVM in-kernel irqchip", 30149d2e648SMarcel Apfelbaum NULL); 302b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "kvm-shadow-mem", "int", 3036b1b1440SMarcel Apfelbaum machine_get_kvm_shadow_mem, 3046b1b1440SMarcel Apfelbaum machine_set_kvm_shadow_mem, 3056b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 30649d2e648SMarcel Apfelbaum object_property_set_description(obj, "kvm-shadow-mem", 30749d2e648SMarcel Apfelbaum "KVM shadow MMU size", 30849d2e648SMarcel Apfelbaum NULL); 3096b1b1440SMarcel Apfelbaum object_property_add_str(obj, "kernel", 3106b1b1440SMarcel Apfelbaum machine_get_kernel, machine_set_kernel, NULL); 31149d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel", 31249d2e648SMarcel Apfelbaum "Linux kernel image file", 31349d2e648SMarcel Apfelbaum NULL); 3146b1b1440SMarcel Apfelbaum object_property_add_str(obj, "initrd", 3156b1b1440SMarcel Apfelbaum machine_get_initrd, machine_set_initrd, NULL); 31649d2e648SMarcel Apfelbaum object_property_set_description(obj, "initrd", 31749d2e648SMarcel Apfelbaum "Linux initial ramdisk file", 31849d2e648SMarcel Apfelbaum NULL); 3196b1b1440SMarcel Apfelbaum object_property_add_str(obj, "append", 3206b1b1440SMarcel Apfelbaum machine_get_append, machine_set_append, NULL); 32149d2e648SMarcel Apfelbaum object_property_set_description(obj, "append", 32249d2e648SMarcel Apfelbaum "Linux kernel command line", 32349d2e648SMarcel Apfelbaum NULL); 3246b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dtb", 3256b1b1440SMarcel Apfelbaum machine_get_dtb, machine_set_dtb, NULL); 32649d2e648SMarcel Apfelbaum object_property_set_description(obj, "dtb", 32749d2e648SMarcel Apfelbaum "Linux kernel device tree file", 32849d2e648SMarcel Apfelbaum NULL); 3296b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dumpdtb", 3306b1b1440SMarcel Apfelbaum machine_get_dumpdtb, machine_set_dumpdtb, NULL); 33149d2e648SMarcel Apfelbaum object_property_set_description(obj, "dumpdtb", 33249d2e648SMarcel Apfelbaum "Dump current dtb to a file and quit", 33349d2e648SMarcel Apfelbaum NULL); 334b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "phandle-start", "int", 3356b1b1440SMarcel Apfelbaum machine_get_phandle_start, 3366b1b1440SMarcel Apfelbaum machine_set_phandle_start, 3376b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 33849d2e648SMarcel Apfelbaum object_property_set_description(obj, "phandle-start", 33949d2e648SMarcel Apfelbaum "The first phandle ID we may generate dynamically", 34049d2e648SMarcel Apfelbaum NULL); 341b0ddb8bfSMarcel Apfelbaum object_property_add_str(obj, "dt-compatible", 3426b1b1440SMarcel Apfelbaum machine_get_dt_compatible, 3436b1b1440SMarcel Apfelbaum machine_set_dt_compatible, 3446b1b1440SMarcel Apfelbaum NULL); 34549d2e648SMarcel Apfelbaum object_property_set_description(obj, "dt-compatible", 34649d2e648SMarcel Apfelbaum "Overrides the \"compatible\" property of the dt root node", 34749d2e648SMarcel Apfelbaum NULL); 3486b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "dump-guest-core", 3496b1b1440SMarcel Apfelbaum machine_get_dump_guest_core, 3506b1b1440SMarcel Apfelbaum machine_set_dump_guest_core, 3516b1b1440SMarcel Apfelbaum NULL); 35249d2e648SMarcel Apfelbaum object_property_set_description(obj, "dump-guest-core", 35349d2e648SMarcel Apfelbaum "Include guest memory in a core dump", 35449d2e648SMarcel Apfelbaum NULL); 3556b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "mem-merge", 356ac40aa15SLe Tan machine_get_mem_merge, 357ac40aa15SLe Tan machine_set_mem_merge, NULL); 35849d2e648SMarcel Apfelbaum object_property_set_description(obj, "mem-merge", 35949d2e648SMarcel Apfelbaum "Enable/disable memory merge support", 36049d2e648SMarcel Apfelbaum NULL); 361ac40aa15SLe Tan object_property_add_bool(obj, "usb", 362ac40aa15SLe Tan machine_get_usb, 363ac40aa15SLe Tan machine_set_usb, NULL); 36449d2e648SMarcel Apfelbaum object_property_set_description(obj, "usb", 36549d2e648SMarcel Apfelbaum "Set on/off to enable/disable usb", 36649d2e648SMarcel Apfelbaum NULL); 3676b1b1440SMarcel Apfelbaum object_property_add_str(obj, "firmware", 368ac40aa15SLe Tan machine_get_firmware, 369ac40aa15SLe Tan machine_set_firmware, NULL); 37049d2e648SMarcel Apfelbaum object_property_set_description(obj, "firmware", 37149d2e648SMarcel Apfelbaum "Firmware image", 37249d2e648SMarcel Apfelbaum NULL); 373a52a7fdfSLe Tan object_property_add_bool(obj, "iommu", 374a52a7fdfSLe Tan machine_get_iommu, 375a52a7fdfSLe Tan machine_set_iommu, NULL); 37649d2e648SMarcel Apfelbaum object_property_set_description(obj, "iommu", 37749d2e648SMarcel Apfelbaum "Set on/off to enable/disable Intel IOMMU (VT-d)", 37849d2e648SMarcel Apfelbaum NULL); 37933cd52b5SAlexander Graf 38033cd52b5SAlexander Graf /* Register notifier when init is done for sysbus sanity checks */ 38133cd52b5SAlexander Graf ms->sysbus_notifier.notify = machine_init_notify; 38233cd52b5SAlexander Graf qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); 3836b1b1440SMarcel Apfelbaum } 3846b1b1440SMarcel Apfelbaum 3856b1b1440SMarcel Apfelbaum static void machine_finalize(Object *obj) 3866b1b1440SMarcel Apfelbaum { 3876b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 3886b1b1440SMarcel Apfelbaum 3896b1b1440SMarcel Apfelbaum g_free(ms->accel); 3906b1b1440SMarcel Apfelbaum g_free(ms->kernel_filename); 3916b1b1440SMarcel Apfelbaum g_free(ms->initrd_filename); 3926b1b1440SMarcel Apfelbaum g_free(ms->kernel_cmdline); 3936b1b1440SMarcel Apfelbaum g_free(ms->dtb); 3946b1b1440SMarcel Apfelbaum g_free(ms->dumpdtb); 3956b1b1440SMarcel Apfelbaum g_free(ms->dt_compatible); 3966b1b1440SMarcel Apfelbaum g_free(ms->firmware); 3976b1b1440SMarcel Apfelbaum } 39836d20cb2SMarcel Apfelbaum 3995e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine) 4005e97b623SMarcel Apfelbaum { 4015e97b623SMarcel Apfelbaum return machine->usb; 4025e97b623SMarcel Apfelbaum } 4035e97b623SMarcel Apfelbaum 4048caff636SMarcel Apfelbaum bool machine_iommu(MachineState *machine) 4058caff636SMarcel Apfelbaum { 4068caff636SMarcel Apfelbaum return machine->iommu; 4078caff636SMarcel Apfelbaum } 4088caff636SMarcel Apfelbaum 409d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine) 410d8870d02SMarcel Apfelbaum { 411d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_allowed; 412d8870d02SMarcel Apfelbaum } 413d8870d02SMarcel Apfelbaum 414d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine) 415d8870d02SMarcel Apfelbaum { 416d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_required; 417d8870d02SMarcel Apfelbaum } 418d8870d02SMarcel Apfelbaum 4194689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine) 4204689b77bSMarcel Apfelbaum { 4214689b77bSMarcel Apfelbaum return machine->kvm_shadow_mem; 4224689b77bSMarcel Apfelbaum } 4234689b77bSMarcel Apfelbaum 4246cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine) 4256cabe7faSMarcel Apfelbaum { 4266cabe7faSMarcel Apfelbaum return machine->phandle_start; 4276cabe7faSMarcel Apfelbaum } 4286cabe7faSMarcel Apfelbaum 429*47c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine) 430*47c8ca53SMarcel Apfelbaum { 431*47c8ca53SMarcel Apfelbaum return machine->dump_guest_core; 432*47c8ca53SMarcel Apfelbaum } 433*47c8ca53SMarcel Apfelbaum 43436d20cb2SMarcel Apfelbaum static const TypeInfo machine_info = { 43536d20cb2SMarcel Apfelbaum .name = TYPE_MACHINE, 43636d20cb2SMarcel Apfelbaum .parent = TYPE_OBJECT, 43736d20cb2SMarcel Apfelbaum .abstract = true, 43836d20cb2SMarcel Apfelbaum .class_size = sizeof(MachineClass), 43936d20cb2SMarcel Apfelbaum .instance_size = sizeof(MachineState), 4406b1b1440SMarcel Apfelbaum .instance_init = machine_initfn, 4416b1b1440SMarcel Apfelbaum .instance_finalize = machine_finalize, 44236d20cb2SMarcel Apfelbaum }; 44336d20cb2SMarcel Apfelbaum 44436d20cb2SMarcel Apfelbaum static void machine_register_types(void) 44536d20cb2SMarcel Apfelbaum { 44636d20cb2SMarcel Apfelbaum type_register_static(&machine_info); 44736d20cb2SMarcel Apfelbaum } 44836d20cb2SMarcel Apfelbaum 44936d20cb2SMarcel Apfelbaum type_init(machine_register_types) 450