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 22979814179STiejun Chen static bool machine_get_igd_gfx_passthru(Object *obj, Error **errp) 23079814179STiejun Chen { 23179814179STiejun Chen MachineState *ms = MACHINE(obj); 23279814179STiejun Chen 23379814179STiejun Chen return ms->igd_gfx_passthru; 23479814179STiejun Chen } 23579814179STiejun Chen 23679814179STiejun Chen static void machine_set_igd_gfx_passthru(Object *obj, bool value, Error **errp) 23779814179STiejun Chen { 23879814179STiejun Chen MachineState *ms = MACHINE(obj); 23979814179STiejun Chen 24079814179STiejun Chen ms->igd_gfx_passthru = value; 24179814179STiejun Chen } 24279814179STiejun Chen 2436b1b1440SMarcel Apfelbaum static char *machine_get_firmware(Object *obj, Error **errp) 2446b1b1440SMarcel Apfelbaum { 2456b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2466b1b1440SMarcel Apfelbaum 2476b1b1440SMarcel Apfelbaum return g_strdup(ms->firmware); 2486b1b1440SMarcel Apfelbaum } 2496b1b1440SMarcel Apfelbaum 2506b1b1440SMarcel Apfelbaum static void machine_set_firmware(Object *obj, const char *value, Error **errp) 2516b1b1440SMarcel Apfelbaum { 2526b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2536b1b1440SMarcel Apfelbaum 254556068eeSEduardo Habkost g_free(ms->firmware); 2556b1b1440SMarcel Apfelbaum ms->firmware = g_strdup(value); 2566b1b1440SMarcel Apfelbaum } 2576b1b1440SMarcel Apfelbaum 258a52a7fdfSLe Tan static bool machine_get_iommu(Object *obj, Error **errp) 259a52a7fdfSLe Tan { 260a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 261a52a7fdfSLe Tan 262a52a7fdfSLe Tan return ms->iommu; 263a52a7fdfSLe Tan } 264a52a7fdfSLe Tan 265a52a7fdfSLe Tan static void machine_set_iommu(Object *obj, bool value, Error **errp) 266a52a7fdfSLe Tan { 267a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 268a52a7fdfSLe Tan 269a52a7fdfSLe Tan ms->iommu = value; 270a52a7fdfSLe Tan } 271a52a7fdfSLe Tan 2729850c604SAlexander Graf static void machine_set_suppress_vmdesc(Object *obj, bool value, Error **errp) 2739850c604SAlexander Graf { 2749850c604SAlexander Graf MachineState *ms = MACHINE(obj); 2759850c604SAlexander Graf 2769850c604SAlexander Graf ms->suppress_vmdesc = value; 2779850c604SAlexander Graf } 2789850c604SAlexander Graf 2799850c604SAlexander Graf static bool machine_get_suppress_vmdesc(Object *obj, Error **errp) 2809850c604SAlexander Graf { 2819850c604SAlexander Graf MachineState *ms = MACHINE(obj); 2829850c604SAlexander Graf 2839850c604SAlexander Graf return ms->suppress_vmdesc; 2849850c604SAlexander Graf } 2859850c604SAlexander Graf 28633cd52b5SAlexander Graf static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) 28733cd52b5SAlexander Graf { 28833cd52b5SAlexander Graf error_report("Option '-device %s' cannot be handled by this machine", 28933cd52b5SAlexander Graf object_class_get_name(object_get_class(OBJECT(sbdev)))); 29033cd52b5SAlexander Graf exit(1); 29133cd52b5SAlexander Graf } 29233cd52b5SAlexander Graf 29333cd52b5SAlexander Graf static void machine_init_notify(Notifier *notifier, void *data) 29433cd52b5SAlexander Graf { 29533cd52b5SAlexander Graf Object *machine = qdev_get_machine(); 29633cd52b5SAlexander Graf ObjectClass *oc = object_get_class(machine); 29733cd52b5SAlexander Graf MachineClass *mc = MACHINE_CLASS(oc); 29833cd52b5SAlexander Graf 29933cd52b5SAlexander Graf if (mc->has_dynamic_sysbus) { 30033cd52b5SAlexander Graf /* Our machine can handle dynamic sysbus devices, we're all good */ 30133cd52b5SAlexander Graf return; 30233cd52b5SAlexander Graf } 30333cd52b5SAlexander Graf 30433cd52b5SAlexander Graf /* 30533cd52b5SAlexander Graf * Loop through all dynamically created devices and check whether there 30633cd52b5SAlexander Graf * are sysbus devices among them. If there are, error out. 30733cd52b5SAlexander Graf */ 30833cd52b5SAlexander Graf foreach_dynamic_sysbus_device(error_on_sysbus_device, NULL); 30933cd52b5SAlexander Graf } 31033cd52b5SAlexander Graf 311076b35b5SNikunj A Dadhania static void machine_class_init(ObjectClass *oc, void *data) 312076b35b5SNikunj A Dadhania { 313076b35b5SNikunj A Dadhania MachineClass *mc = MACHINE_CLASS(oc); 314076b35b5SNikunj A Dadhania 315076b35b5SNikunj A Dadhania /* Default 128 MB as guest ram size */ 316076b35b5SNikunj A Dadhania mc->default_ram_size = 128 * M_BYTE; 317076b35b5SNikunj A Dadhania } 318076b35b5SNikunj A Dadhania 319dcb3d601SEduardo Habkost static void machine_class_base_init(ObjectClass *oc, void *data) 320dcb3d601SEduardo Habkost { 321dcb3d601SEduardo Habkost if (!object_class_is_abstract(oc)) { 322*98cec76aSEduardo Habkost MachineClass *mc = MACHINE_CLASS(oc); 323dcb3d601SEduardo Habkost const char *cname = object_class_get_name(oc); 324dcb3d601SEduardo Habkost assert(g_str_has_suffix(cname, TYPE_MACHINE_SUFFIX)); 325*98cec76aSEduardo Habkost mc->name = g_strndup(cname, 326*98cec76aSEduardo Habkost strlen(cname) - strlen(TYPE_MACHINE_SUFFIX)); 327dcb3d601SEduardo Habkost } 328dcb3d601SEduardo Habkost } 329dcb3d601SEduardo Habkost 3306b1b1440SMarcel Apfelbaum static void machine_initfn(Object *obj) 3316b1b1440SMarcel Apfelbaum { 33233cd52b5SAlexander Graf MachineState *ms = MACHINE(obj); 33333cd52b5SAlexander Graf 334d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = true; 3354689b77bSMarcel Apfelbaum ms->kvm_shadow_mem = -1; 33647c8ca53SMarcel Apfelbaum ms->dump_guest_core = true; 33775cc7f01SMarcel Apfelbaum ms->mem_merge = true; 338d8870d02SMarcel Apfelbaum 3396b1b1440SMarcel Apfelbaum object_property_add_str(obj, "accel", 3406b1b1440SMarcel Apfelbaum machine_get_accel, machine_set_accel, NULL); 34149d2e648SMarcel Apfelbaum object_property_set_description(obj, "accel", 34249d2e648SMarcel Apfelbaum "Accelerator list", 34349d2e648SMarcel Apfelbaum NULL); 344b0ddb8bfSMarcel Apfelbaum object_property_add_bool(obj, "kernel-irqchip", 345d8870d02SMarcel Apfelbaum NULL, 3466b1b1440SMarcel Apfelbaum machine_set_kernel_irqchip, 3476b1b1440SMarcel Apfelbaum NULL); 34849d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel-irqchip", 34949d2e648SMarcel Apfelbaum "Use KVM in-kernel irqchip", 35049d2e648SMarcel Apfelbaum NULL); 351b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "kvm-shadow-mem", "int", 3526b1b1440SMarcel Apfelbaum machine_get_kvm_shadow_mem, 3536b1b1440SMarcel Apfelbaum machine_set_kvm_shadow_mem, 3546b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 35549d2e648SMarcel Apfelbaum object_property_set_description(obj, "kvm-shadow-mem", 35649d2e648SMarcel Apfelbaum "KVM shadow MMU size", 35749d2e648SMarcel Apfelbaum NULL); 3586b1b1440SMarcel Apfelbaum object_property_add_str(obj, "kernel", 3596b1b1440SMarcel Apfelbaum machine_get_kernel, machine_set_kernel, NULL); 36049d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel", 36149d2e648SMarcel Apfelbaum "Linux kernel image file", 36249d2e648SMarcel Apfelbaum NULL); 3636b1b1440SMarcel Apfelbaum object_property_add_str(obj, "initrd", 3646b1b1440SMarcel Apfelbaum machine_get_initrd, machine_set_initrd, NULL); 36549d2e648SMarcel Apfelbaum object_property_set_description(obj, "initrd", 36649d2e648SMarcel Apfelbaum "Linux initial ramdisk file", 36749d2e648SMarcel Apfelbaum NULL); 3686b1b1440SMarcel Apfelbaum object_property_add_str(obj, "append", 3696b1b1440SMarcel Apfelbaum machine_get_append, machine_set_append, NULL); 37049d2e648SMarcel Apfelbaum object_property_set_description(obj, "append", 37149d2e648SMarcel Apfelbaum "Linux kernel command line", 37249d2e648SMarcel Apfelbaum NULL); 3736b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dtb", 3746b1b1440SMarcel Apfelbaum machine_get_dtb, machine_set_dtb, NULL); 37549d2e648SMarcel Apfelbaum object_property_set_description(obj, "dtb", 37649d2e648SMarcel Apfelbaum "Linux kernel device tree file", 37749d2e648SMarcel Apfelbaum NULL); 3786b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dumpdtb", 3796b1b1440SMarcel Apfelbaum machine_get_dumpdtb, machine_set_dumpdtb, NULL); 38049d2e648SMarcel Apfelbaum object_property_set_description(obj, "dumpdtb", 38149d2e648SMarcel Apfelbaum "Dump current dtb to a file and quit", 38249d2e648SMarcel Apfelbaum NULL); 383b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "phandle-start", "int", 3846b1b1440SMarcel Apfelbaum machine_get_phandle_start, 3856b1b1440SMarcel Apfelbaum machine_set_phandle_start, 3866b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 38749d2e648SMarcel Apfelbaum object_property_set_description(obj, "phandle-start", 38849d2e648SMarcel Apfelbaum "The first phandle ID we may generate dynamically", 38949d2e648SMarcel Apfelbaum NULL); 390b0ddb8bfSMarcel Apfelbaum object_property_add_str(obj, "dt-compatible", 3916b1b1440SMarcel Apfelbaum machine_get_dt_compatible, 3926b1b1440SMarcel Apfelbaum machine_set_dt_compatible, 3936b1b1440SMarcel Apfelbaum NULL); 39449d2e648SMarcel Apfelbaum object_property_set_description(obj, "dt-compatible", 39549d2e648SMarcel Apfelbaum "Overrides the \"compatible\" property of the dt root node", 39649d2e648SMarcel Apfelbaum NULL); 3976b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "dump-guest-core", 3986b1b1440SMarcel Apfelbaum machine_get_dump_guest_core, 3996b1b1440SMarcel Apfelbaum machine_set_dump_guest_core, 4006b1b1440SMarcel Apfelbaum NULL); 40149d2e648SMarcel Apfelbaum object_property_set_description(obj, "dump-guest-core", 40249d2e648SMarcel Apfelbaum "Include guest memory in a core dump", 40349d2e648SMarcel Apfelbaum NULL); 4046b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "mem-merge", 405ac40aa15SLe Tan machine_get_mem_merge, 406ac40aa15SLe Tan machine_set_mem_merge, NULL); 40749d2e648SMarcel Apfelbaum object_property_set_description(obj, "mem-merge", 40849d2e648SMarcel Apfelbaum "Enable/disable memory merge support", 40949d2e648SMarcel Apfelbaum NULL); 410ac40aa15SLe Tan object_property_add_bool(obj, "usb", 411ac40aa15SLe Tan machine_get_usb, 412ac40aa15SLe Tan machine_set_usb, NULL); 41349d2e648SMarcel Apfelbaum object_property_set_description(obj, "usb", 41449d2e648SMarcel Apfelbaum "Set on/off to enable/disable usb", 41549d2e648SMarcel Apfelbaum NULL); 41679814179STiejun Chen object_property_add_bool(obj, "igd-passthru", 41779814179STiejun Chen machine_get_igd_gfx_passthru, 41879814179STiejun Chen machine_set_igd_gfx_passthru, NULL); 41979814179STiejun Chen object_property_set_description(obj, "igd-passthru", 42079814179STiejun Chen "Set on/off to enable/disable igd passthrou", 42179814179STiejun Chen NULL); 4226b1b1440SMarcel Apfelbaum object_property_add_str(obj, "firmware", 423ac40aa15SLe Tan machine_get_firmware, 424ac40aa15SLe Tan machine_set_firmware, NULL); 42549d2e648SMarcel Apfelbaum object_property_set_description(obj, "firmware", 42649d2e648SMarcel Apfelbaum "Firmware image", 42749d2e648SMarcel Apfelbaum NULL); 428a52a7fdfSLe Tan object_property_add_bool(obj, "iommu", 429a52a7fdfSLe Tan machine_get_iommu, 430a52a7fdfSLe Tan machine_set_iommu, NULL); 43149d2e648SMarcel Apfelbaum object_property_set_description(obj, "iommu", 43249d2e648SMarcel Apfelbaum "Set on/off to enable/disable Intel IOMMU (VT-d)", 43349d2e648SMarcel Apfelbaum NULL); 4349850c604SAlexander Graf object_property_add_bool(obj, "suppress-vmdesc", 4359850c604SAlexander Graf machine_get_suppress_vmdesc, 4369850c604SAlexander Graf machine_set_suppress_vmdesc, NULL); 4379850c604SAlexander Graf object_property_set_description(obj, "suppress-vmdesc", 4389850c604SAlexander Graf "Set on to disable self-describing migration", 4399850c604SAlexander Graf NULL); 44033cd52b5SAlexander Graf 44133cd52b5SAlexander Graf /* Register notifier when init is done for sysbus sanity checks */ 44233cd52b5SAlexander Graf ms->sysbus_notifier.notify = machine_init_notify; 44333cd52b5SAlexander Graf qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); 4446b1b1440SMarcel Apfelbaum } 4456b1b1440SMarcel Apfelbaum 4466b1b1440SMarcel Apfelbaum static void machine_finalize(Object *obj) 4476b1b1440SMarcel Apfelbaum { 4486b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 4496b1b1440SMarcel Apfelbaum 4506b1b1440SMarcel Apfelbaum g_free(ms->accel); 4516b1b1440SMarcel Apfelbaum g_free(ms->kernel_filename); 4526b1b1440SMarcel Apfelbaum g_free(ms->initrd_filename); 4536b1b1440SMarcel Apfelbaum g_free(ms->kernel_cmdline); 4546b1b1440SMarcel Apfelbaum g_free(ms->dtb); 4556b1b1440SMarcel Apfelbaum g_free(ms->dumpdtb); 4566b1b1440SMarcel Apfelbaum g_free(ms->dt_compatible); 4576b1b1440SMarcel Apfelbaum g_free(ms->firmware); 4586b1b1440SMarcel Apfelbaum } 45936d20cb2SMarcel Apfelbaum 4605e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine) 4615e97b623SMarcel Apfelbaum { 4625e97b623SMarcel Apfelbaum return machine->usb; 4635e97b623SMarcel Apfelbaum } 4645e97b623SMarcel Apfelbaum 4658caff636SMarcel Apfelbaum bool machine_iommu(MachineState *machine) 4668caff636SMarcel Apfelbaum { 4678caff636SMarcel Apfelbaum return machine->iommu; 4688caff636SMarcel Apfelbaum } 4698caff636SMarcel Apfelbaum 470d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine) 471d8870d02SMarcel Apfelbaum { 472d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_allowed; 473d8870d02SMarcel Apfelbaum } 474d8870d02SMarcel Apfelbaum 475d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine) 476d8870d02SMarcel Apfelbaum { 477d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_required; 478d8870d02SMarcel Apfelbaum } 479d8870d02SMarcel Apfelbaum 4804689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine) 4814689b77bSMarcel Apfelbaum { 4824689b77bSMarcel Apfelbaum return machine->kvm_shadow_mem; 4834689b77bSMarcel Apfelbaum } 4844689b77bSMarcel Apfelbaum 4856cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine) 4866cabe7faSMarcel Apfelbaum { 4876cabe7faSMarcel Apfelbaum return machine->phandle_start; 4886cabe7faSMarcel Apfelbaum } 4896cabe7faSMarcel Apfelbaum 49047c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine) 49147c8ca53SMarcel Apfelbaum { 49247c8ca53SMarcel Apfelbaum return machine->dump_guest_core; 49347c8ca53SMarcel Apfelbaum } 49447c8ca53SMarcel Apfelbaum 49575cc7f01SMarcel Apfelbaum bool machine_mem_merge(MachineState *machine) 49675cc7f01SMarcel Apfelbaum { 49775cc7f01SMarcel Apfelbaum return machine->mem_merge; 49875cc7f01SMarcel Apfelbaum } 49975cc7f01SMarcel Apfelbaum 50036d20cb2SMarcel Apfelbaum static const TypeInfo machine_info = { 50136d20cb2SMarcel Apfelbaum .name = TYPE_MACHINE, 50236d20cb2SMarcel Apfelbaum .parent = TYPE_OBJECT, 50336d20cb2SMarcel Apfelbaum .abstract = true, 50436d20cb2SMarcel Apfelbaum .class_size = sizeof(MachineClass), 505076b35b5SNikunj A Dadhania .class_init = machine_class_init, 506dcb3d601SEduardo Habkost .class_base_init = machine_class_base_init, 50736d20cb2SMarcel Apfelbaum .instance_size = sizeof(MachineState), 5086b1b1440SMarcel Apfelbaum .instance_init = machine_initfn, 5096b1b1440SMarcel Apfelbaum .instance_finalize = machine_finalize, 51036d20cb2SMarcel Apfelbaum }; 51136d20cb2SMarcel Apfelbaum 51236d20cb2SMarcel Apfelbaum static void machine_register_types(void) 51336d20cb2SMarcel Apfelbaum { 51436d20cb2SMarcel Apfelbaum type_register_static(&machine_info); 51536d20cb2SMarcel Apfelbaum } 51636d20cb2SMarcel Apfelbaum 51736d20cb2SMarcel Apfelbaum type_init(machine_register_types) 518