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 1318c86e2bSPeter Maydell #include "qemu/osdep.h" 1436d20cb2SMarcel Apfelbaum #include "hw/boards.h" 1532c18a2dSMatt Gingell #include "qapi-visit.h" 166b1b1440SMarcel Apfelbaum #include "qapi/visitor.h" 1733cd52b5SAlexander Graf #include "hw/sysbus.h" 1833cd52b5SAlexander Graf #include "sysemu/sysemu.h" 1933cd52b5SAlexander Graf #include "qemu/error-report.h" 206b1b1440SMarcel Apfelbaum 216b1b1440SMarcel Apfelbaum static char *machine_get_accel(Object *obj, Error **errp) 226b1b1440SMarcel Apfelbaum { 236b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 246b1b1440SMarcel Apfelbaum 256b1b1440SMarcel Apfelbaum return g_strdup(ms->accel); 266b1b1440SMarcel Apfelbaum } 276b1b1440SMarcel Apfelbaum 286b1b1440SMarcel Apfelbaum static void machine_set_accel(Object *obj, const char *value, Error **errp) 296b1b1440SMarcel Apfelbaum { 306b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 316b1b1440SMarcel Apfelbaum 32556068eeSEduardo Habkost g_free(ms->accel); 336b1b1440SMarcel Apfelbaum ms->accel = g_strdup(value); 346b1b1440SMarcel Apfelbaum } 356b1b1440SMarcel Apfelbaum 3632c18a2dSMatt Gingell static void machine_set_kernel_irqchip(Object *obj, Visitor *v, 3732c18a2dSMatt Gingell void *opaque, const char *name, 3832c18a2dSMatt Gingell Error **errp) 396b1b1440SMarcel Apfelbaum { 4032c18a2dSMatt Gingell Error *err = NULL; 416b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 4232c18a2dSMatt Gingell OnOffSplit mode; 436b1b1440SMarcel Apfelbaum 44*51e72bc1SEric Blake visit_type_OnOffSplit(v, name, &mode, &err); 4532c18a2dSMatt Gingell if (err) { 4632c18a2dSMatt Gingell error_propagate(errp, err); 4732c18a2dSMatt Gingell return; 4832c18a2dSMatt Gingell } else { 4932c18a2dSMatt Gingell switch (mode) { 5032c18a2dSMatt Gingell case ON_OFF_SPLIT_ON: 5132c18a2dSMatt Gingell ms->kernel_irqchip_allowed = true; 5232c18a2dSMatt Gingell ms->kernel_irqchip_required = true; 5332c18a2dSMatt Gingell ms->kernel_irqchip_split = false; 5432c18a2dSMatt Gingell break; 5532c18a2dSMatt Gingell case ON_OFF_SPLIT_OFF: 5632c18a2dSMatt Gingell ms->kernel_irqchip_allowed = false; 5732c18a2dSMatt Gingell ms->kernel_irqchip_required = false; 5832c18a2dSMatt Gingell ms->kernel_irqchip_split = false; 5932c18a2dSMatt Gingell break; 6032c18a2dSMatt Gingell case ON_OFF_SPLIT_SPLIT: 6132c18a2dSMatt Gingell ms->kernel_irqchip_allowed = true; 6232c18a2dSMatt Gingell ms->kernel_irqchip_required = true; 6332c18a2dSMatt Gingell ms->kernel_irqchip_split = true; 6432c18a2dSMatt Gingell break; 6532c18a2dSMatt Gingell default: 6632c18a2dSMatt Gingell abort(); 6732c18a2dSMatt Gingell } 6832c18a2dSMatt Gingell } 696b1b1440SMarcel Apfelbaum } 706b1b1440SMarcel Apfelbaum 716b1b1440SMarcel Apfelbaum static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v, 726b1b1440SMarcel Apfelbaum void *opaque, const char *name, 736b1b1440SMarcel Apfelbaum Error **errp) 746b1b1440SMarcel Apfelbaum { 756b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 766b1b1440SMarcel Apfelbaum int64_t value = ms->kvm_shadow_mem; 776b1b1440SMarcel Apfelbaum 78*51e72bc1SEric Blake visit_type_int(v, name, &value, errp); 796b1b1440SMarcel Apfelbaum } 806b1b1440SMarcel Apfelbaum 816b1b1440SMarcel Apfelbaum static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v, 826b1b1440SMarcel Apfelbaum void *opaque, const char *name, 836b1b1440SMarcel Apfelbaum Error **errp) 846b1b1440SMarcel Apfelbaum { 856b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 866b1b1440SMarcel Apfelbaum Error *error = NULL; 876b1b1440SMarcel Apfelbaum int64_t value; 886b1b1440SMarcel Apfelbaum 89*51e72bc1SEric Blake visit_type_int(v, name, &value, &error); 906b1b1440SMarcel Apfelbaum if (error) { 916b1b1440SMarcel Apfelbaum error_propagate(errp, error); 926b1b1440SMarcel Apfelbaum return; 936b1b1440SMarcel Apfelbaum } 946b1b1440SMarcel Apfelbaum 956b1b1440SMarcel Apfelbaum ms->kvm_shadow_mem = value; 966b1b1440SMarcel Apfelbaum } 976b1b1440SMarcel Apfelbaum 986b1b1440SMarcel Apfelbaum static char *machine_get_kernel(Object *obj, Error **errp) 996b1b1440SMarcel Apfelbaum { 1006b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1016b1b1440SMarcel Apfelbaum 1026b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_filename); 1036b1b1440SMarcel Apfelbaum } 1046b1b1440SMarcel Apfelbaum 1056b1b1440SMarcel Apfelbaum static void machine_set_kernel(Object *obj, const char *value, Error **errp) 1066b1b1440SMarcel Apfelbaum { 1076b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1086b1b1440SMarcel Apfelbaum 109556068eeSEduardo Habkost g_free(ms->kernel_filename); 1106b1b1440SMarcel Apfelbaum ms->kernel_filename = g_strdup(value); 1116b1b1440SMarcel Apfelbaum } 1126b1b1440SMarcel Apfelbaum 1136b1b1440SMarcel Apfelbaum static char *machine_get_initrd(Object *obj, Error **errp) 1146b1b1440SMarcel Apfelbaum { 1156b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1166b1b1440SMarcel Apfelbaum 1176b1b1440SMarcel Apfelbaum return g_strdup(ms->initrd_filename); 1186b1b1440SMarcel Apfelbaum } 1196b1b1440SMarcel Apfelbaum 1206b1b1440SMarcel Apfelbaum static void machine_set_initrd(Object *obj, const char *value, Error **errp) 1216b1b1440SMarcel Apfelbaum { 1226b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1236b1b1440SMarcel Apfelbaum 124556068eeSEduardo Habkost g_free(ms->initrd_filename); 1256b1b1440SMarcel Apfelbaum ms->initrd_filename = g_strdup(value); 1266b1b1440SMarcel Apfelbaum } 1276b1b1440SMarcel Apfelbaum 1286b1b1440SMarcel Apfelbaum static char *machine_get_append(Object *obj, Error **errp) 1296b1b1440SMarcel Apfelbaum { 1306b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1316b1b1440SMarcel Apfelbaum 1326b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_cmdline); 1336b1b1440SMarcel Apfelbaum } 1346b1b1440SMarcel Apfelbaum 1356b1b1440SMarcel Apfelbaum static void machine_set_append(Object *obj, const char *value, Error **errp) 1366b1b1440SMarcel Apfelbaum { 1376b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1386b1b1440SMarcel Apfelbaum 139556068eeSEduardo Habkost g_free(ms->kernel_cmdline); 1406b1b1440SMarcel Apfelbaum ms->kernel_cmdline = g_strdup(value); 1416b1b1440SMarcel Apfelbaum } 1426b1b1440SMarcel Apfelbaum 1436b1b1440SMarcel Apfelbaum static char *machine_get_dtb(Object *obj, Error **errp) 1446b1b1440SMarcel Apfelbaum { 1456b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1466b1b1440SMarcel Apfelbaum 1476b1b1440SMarcel Apfelbaum return g_strdup(ms->dtb); 1486b1b1440SMarcel Apfelbaum } 1496b1b1440SMarcel Apfelbaum 1506b1b1440SMarcel Apfelbaum static void machine_set_dtb(Object *obj, const char *value, Error **errp) 1516b1b1440SMarcel Apfelbaum { 1526b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1536b1b1440SMarcel Apfelbaum 154556068eeSEduardo Habkost g_free(ms->dtb); 1556b1b1440SMarcel Apfelbaum ms->dtb = g_strdup(value); 1566b1b1440SMarcel Apfelbaum } 1576b1b1440SMarcel Apfelbaum 1586b1b1440SMarcel Apfelbaum static char *machine_get_dumpdtb(Object *obj, Error **errp) 1596b1b1440SMarcel Apfelbaum { 1606b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1616b1b1440SMarcel Apfelbaum 1626b1b1440SMarcel Apfelbaum return g_strdup(ms->dumpdtb); 1636b1b1440SMarcel Apfelbaum } 1646b1b1440SMarcel Apfelbaum 1656b1b1440SMarcel Apfelbaum static void machine_set_dumpdtb(Object *obj, const char *value, Error **errp) 1666b1b1440SMarcel Apfelbaum { 1676b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1686b1b1440SMarcel Apfelbaum 169556068eeSEduardo Habkost g_free(ms->dumpdtb); 1706b1b1440SMarcel Apfelbaum ms->dumpdtb = g_strdup(value); 1716b1b1440SMarcel Apfelbaum } 1726b1b1440SMarcel Apfelbaum 1736b1b1440SMarcel Apfelbaum static void machine_get_phandle_start(Object *obj, Visitor *v, 1746b1b1440SMarcel Apfelbaum void *opaque, const char *name, 1756b1b1440SMarcel Apfelbaum Error **errp) 1766b1b1440SMarcel Apfelbaum { 1776b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1786b1b1440SMarcel Apfelbaum int64_t value = ms->phandle_start; 1796b1b1440SMarcel Apfelbaum 180*51e72bc1SEric Blake visit_type_int(v, name, &value, errp); 1816b1b1440SMarcel Apfelbaum } 1826b1b1440SMarcel Apfelbaum 1836b1b1440SMarcel Apfelbaum static void machine_set_phandle_start(Object *obj, Visitor *v, 1846b1b1440SMarcel Apfelbaum void *opaque, const char *name, 1856b1b1440SMarcel Apfelbaum Error **errp) 1866b1b1440SMarcel Apfelbaum { 1876b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1886b1b1440SMarcel Apfelbaum Error *error = NULL; 1896b1b1440SMarcel Apfelbaum int64_t value; 1906b1b1440SMarcel Apfelbaum 191*51e72bc1SEric Blake visit_type_int(v, name, &value, &error); 1926b1b1440SMarcel Apfelbaum if (error) { 1936b1b1440SMarcel Apfelbaum error_propagate(errp, error); 1946b1b1440SMarcel Apfelbaum return; 1956b1b1440SMarcel Apfelbaum } 1966b1b1440SMarcel Apfelbaum 1976b1b1440SMarcel Apfelbaum ms->phandle_start = value; 1986b1b1440SMarcel Apfelbaum } 1996b1b1440SMarcel Apfelbaum 2006b1b1440SMarcel Apfelbaum static char *machine_get_dt_compatible(Object *obj, Error **errp) 2016b1b1440SMarcel Apfelbaum { 2026b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2036b1b1440SMarcel Apfelbaum 2046b1b1440SMarcel Apfelbaum return g_strdup(ms->dt_compatible); 2056b1b1440SMarcel Apfelbaum } 2066b1b1440SMarcel Apfelbaum 2076b1b1440SMarcel Apfelbaum static void machine_set_dt_compatible(Object *obj, const char *value, Error **errp) 2086b1b1440SMarcel Apfelbaum { 2096b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2106b1b1440SMarcel Apfelbaum 211556068eeSEduardo Habkost g_free(ms->dt_compatible); 2126b1b1440SMarcel Apfelbaum ms->dt_compatible = g_strdup(value); 2136b1b1440SMarcel Apfelbaum } 2146b1b1440SMarcel Apfelbaum 2156b1b1440SMarcel Apfelbaum static bool machine_get_dump_guest_core(Object *obj, Error **errp) 2166b1b1440SMarcel Apfelbaum { 2176b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2186b1b1440SMarcel Apfelbaum 2196b1b1440SMarcel Apfelbaum return ms->dump_guest_core; 2206b1b1440SMarcel Apfelbaum } 2216b1b1440SMarcel Apfelbaum 2226b1b1440SMarcel Apfelbaum static void machine_set_dump_guest_core(Object *obj, bool value, Error **errp) 2236b1b1440SMarcel Apfelbaum { 2246b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2256b1b1440SMarcel Apfelbaum 2266b1b1440SMarcel Apfelbaum ms->dump_guest_core = value; 2276b1b1440SMarcel Apfelbaum } 2286b1b1440SMarcel Apfelbaum 2296b1b1440SMarcel Apfelbaum static bool machine_get_mem_merge(Object *obj, Error **errp) 2306b1b1440SMarcel Apfelbaum { 2316b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2326b1b1440SMarcel Apfelbaum 2336b1b1440SMarcel Apfelbaum return ms->mem_merge; 2346b1b1440SMarcel Apfelbaum } 2356b1b1440SMarcel Apfelbaum 2366b1b1440SMarcel Apfelbaum static void machine_set_mem_merge(Object *obj, bool value, Error **errp) 2376b1b1440SMarcel Apfelbaum { 2386b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2396b1b1440SMarcel Apfelbaum 2406b1b1440SMarcel Apfelbaum ms->mem_merge = value; 2416b1b1440SMarcel Apfelbaum } 2426b1b1440SMarcel Apfelbaum 2436b1b1440SMarcel Apfelbaum static bool machine_get_usb(Object *obj, Error **errp) 2446b1b1440SMarcel Apfelbaum { 2456b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2466b1b1440SMarcel Apfelbaum 2476b1b1440SMarcel Apfelbaum return ms->usb; 2486b1b1440SMarcel Apfelbaum } 2496b1b1440SMarcel Apfelbaum 2506b1b1440SMarcel Apfelbaum static void machine_set_usb(Object *obj, bool value, Error **errp) 2516b1b1440SMarcel Apfelbaum { 2526b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2536b1b1440SMarcel Apfelbaum 2546b1b1440SMarcel Apfelbaum ms->usb = value; 255c6e76503SPaolo Bonzini ms->usb_disabled = !value; 2566b1b1440SMarcel Apfelbaum } 2576b1b1440SMarcel Apfelbaum 25879814179STiejun Chen static bool machine_get_igd_gfx_passthru(Object *obj, Error **errp) 25979814179STiejun Chen { 26079814179STiejun Chen MachineState *ms = MACHINE(obj); 26179814179STiejun Chen 26279814179STiejun Chen return ms->igd_gfx_passthru; 26379814179STiejun Chen } 26479814179STiejun Chen 26579814179STiejun Chen static void machine_set_igd_gfx_passthru(Object *obj, bool value, Error **errp) 26679814179STiejun Chen { 26779814179STiejun Chen MachineState *ms = MACHINE(obj); 26879814179STiejun Chen 26979814179STiejun Chen ms->igd_gfx_passthru = value; 27079814179STiejun Chen } 27179814179STiejun Chen 2726b1b1440SMarcel Apfelbaum static char *machine_get_firmware(Object *obj, Error **errp) 2736b1b1440SMarcel Apfelbaum { 2746b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2756b1b1440SMarcel Apfelbaum 2766b1b1440SMarcel Apfelbaum return g_strdup(ms->firmware); 2776b1b1440SMarcel Apfelbaum } 2786b1b1440SMarcel Apfelbaum 2796b1b1440SMarcel Apfelbaum static void machine_set_firmware(Object *obj, const char *value, Error **errp) 2806b1b1440SMarcel Apfelbaum { 2816b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2826b1b1440SMarcel Apfelbaum 283556068eeSEduardo Habkost g_free(ms->firmware); 2846b1b1440SMarcel Apfelbaum ms->firmware = g_strdup(value); 2856b1b1440SMarcel Apfelbaum } 2866b1b1440SMarcel Apfelbaum 287a52a7fdfSLe Tan static bool machine_get_iommu(Object *obj, Error **errp) 288a52a7fdfSLe Tan { 289a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 290a52a7fdfSLe Tan 291a52a7fdfSLe Tan return ms->iommu; 292a52a7fdfSLe Tan } 293a52a7fdfSLe Tan 294a52a7fdfSLe Tan static void machine_set_iommu(Object *obj, bool value, Error **errp) 295a52a7fdfSLe Tan { 296a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 297a52a7fdfSLe Tan 298a52a7fdfSLe Tan ms->iommu = value; 299a52a7fdfSLe Tan } 300a52a7fdfSLe Tan 3019850c604SAlexander Graf static void machine_set_suppress_vmdesc(Object *obj, bool value, Error **errp) 3029850c604SAlexander Graf { 3039850c604SAlexander Graf MachineState *ms = MACHINE(obj); 3049850c604SAlexander Graf 3059850c604SAlexander Graf ms->suppress_vmdesc = value; 3069850c604SAlexander Graf } 3079850c604SAlexander Graf 3089850c604SAlexander Graf static bool machine_get_suppress_vmdesc(Object *obj, Error **errp) 3099850c604SAlexander Graf { 3109850c604SAlexander Graf MachineState *ms = MACHINE(obj); 3119850c604SAlexander Graf 3129850c604SAlexander Graf return ms->suppress_vmdesc; 3139850c604SAlexander Graf } 3149850c604SAlexander Graf 31533cd52b5SAlexander Graf static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) 31633cd52b5SAlexander Graf { 31733cd52b5SAlexander Graf error_report("Option '-device %s' cannot be handled by this machine", 31833cd52b5SAlexander Graf object_class_get_name(object_get_class(OBJECT(sbdev)))); 31933cd52b5SAlexander Graf exit(1); 32033cd52b5SAlexander Graf } 32133cd52b5SAlexander Graf 32233cd52b5SAlexander Graf static void machine_init_notify(Notifier *notifier, void *data) 32333cd52b5SAlexander Graf { 32433cd52b5SAlexander Graf Object *machine = qdev_get_machine(); 32533cd52b5SAlexander Graf ObjectClass *oc = object_get_class(machine); 32633cd52b5SAlexander Graf MachineClass *mc = MACHINE_CLASS(oc); 32733cd52b5SAlexander Graf 32833cd52b5SAlexander Graf if (mc->has_dynamic_sysbus) { 32933cd52b5SAlexander Graf /* Our machine can handle dynamic sysbus devices, we're all good */ 33033cd52b5SAlexander Graf return; 33133cd52b5SAlexander Graf } 33233cd52b5SAlexander Graf 33333cd52b5SAlexander Graf /* 33433cd52b5SAlexander Graf * Loop through all dynamically created devices and check whether there 33533cd52b5SAlexander Graf * are sysbus devices among them. If there are, error out. 33633cd52b5SAlexander Graf */ 33733cd52b5SAlexander Graf foreach_dynamic_sysbus_device(error_on_sysbus_device, NULL); 33833cd52b5SAlexander Graf } 33933cd52b5SAlexander Graf 340076b35b5SNikunj A Dadhania static void machine_class_init(ObjectClass *oc, void *data) 341076b35b5SNikunj A Dadhania { 342076b35b5SNikunj A Dadhania MachineClass *mc = MACHINE_CLASS(oc); 343076b35b5SNikunj A Dadhania 344076b35b5SNikunj A Dadhania /* Default 128 MB as guest ram size */ 345076b35b5SNikunj A Dadhania mc->default_ram_size = 128 * M_BYTE; 34671ae9e94SEduardo Habkost mc->rom_file_has_mr = true; 347076b35b5SNikunj A Dadhania } 348076b35b5SNikunj A Dadhania 349dcb3d601SEduardo Habkost static void machine_class_base_init(ObjectClass *oc, void *data) 350dcb3d601SEduardo Habkost { 351dcb3d601SEduardo Habkost if (!object_class_is_abstract(oc)) { 35298cec76aSEduardo Habkost MachineClass *mc = MACHINE_CLASS(oc); 353dcb3d601SEduardo Habkost const char *cname = object_class_get_name(oc); 354dcb3d601SEduardo Habkost assert(g_str_has_suffix(cname, TYPE_MACHINE_SUFFIX)); 35598cec76aSEduardo Habkost mc->name = g_strndup(cname, 35698cec76aSEduardo Habkost strlen(cname) - strlen(TYPE_MACHINE_SUFFIX)); 357dcb3d601SEduardo Habkost } 358dcb3d601SEduardo Habkost } 359dcb3d601SEduardo Habkost 3606b1b1440SMarcel Apfelbaum static void machine_initfn(Object *obj) 3616b1b1440SMarcel Apfelbaum { 36233cd52b5SAlexander Graf MachineState *ms = MACHINE(obj); 36333cd52b5SAlexander Graf 364d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = true; 3654689b77bSMarcel Apfelbaum ms->kvm_shadow_mem = -1; 36647c8ca53SMarcel Apfelbaum ms->dump_guest_core = true; 36775cc7f01SMarcel Apfelbaum ms->mem_merge = true; 368d8870d02SMarcel Apfelbaum 3696b1b1440SMarcel Apfelbaum object_property_add_str(obj, "accel", 3706b1b1440SMarcel Apfelbaum machine_get_accel, machine_set_accel, NULL); 37149d2e648SMarcel Apfelbaum object_property_set_description(obj, "accel", 37249d2e648SMarcel Apfelbaum "Accelerator list", 37349d2e648SMarcel Apfelbaum NULL); 37432c18a2dSMatt Gingell object_property_add(obj, "kernel-irqchip", "OnOffSplit", 375d8870d02SMarcel Apfelbaum NULL, 3766b1b1440SMarcel Apfelbaum machine_set_kernel_irqchip, 37732c18a2dSMatt Gingell NULL, NULL, NULL); 37849d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel-irqchip", 37932c18a2dSMatt Gingell "Configure KVM in-kernel irqchip", 38049d2e648SMarcel Apfelbaum NULL); 381b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "kvm-shadow-mem", "int", 3826b1b1440SMarcel Apfelbaum machine_get_kvm_shadow_mem, 3836b1b1440SMarcel Apfelbaum machine_set_kvm_shadow_mem, 3846b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 38549d2e648SMarcel Apfelbaum object_property_set_description(obj, "kvm-shadow-mem", 38649d2e648SMarcel Apfelbaum "KVM shadow MMU size", 38749d2e648SMarcel Apfelbaum NULL); 3886b1b1440SMarcel Apfelbaum object_property_add_str(obj, "kernel", 3896b1b1440SMarcel Apfelbaum machine_get_kernel, machine_set_kernel, NULL); 39049d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel", 39149d2e648SMarcel Apfelbaum "Linux kernel image file", 39249d2e648SMarcel Apfelbaum NULL); 3936b1b1440SMarcel Apfelbaum object_property_add_str(obj, "initrd", 3946b1b1440SMarcel Apfelbaum machine_get_initrd, machine_set_initrd, NULL); 39549d2e648SMarcel Apfelbaum object_property_set_description(obj, "initrd", 39649d2e648SMarcel Apfelbaum "Linux initial ramdisk file", 39749d2e648SMarcel Apfelbaum NULL); 3986b1b1440SMarcel Apfelbaum object_property_add_str(obj, "append", 3996b1b1440SMarcel Apfelbaum machine_get_append, machine_set_append, NULL); 40049d2e648SMarcel Apfelbaum object_property_set_description(obj, "append", 40149d2e648SMarcel Apfelbaum "Linux kernel command line", 40249d2e648SMarcel Apfelbaum NULL); 4036b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dtb", 4046b1b1440SMarcel Apfelbaum machine_get_dtb, machine_set_dtb, NULL); 40549d2e648SMarcel Apfelbaum object_property_set_description(obj, "dtb", 40649d2e648SMarcel Apfelbaum "Linux kernel device tree file", 40749d2e648SMarcel Apfelbaum NULL); 4086b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dumpdtb", 4096b1b1440SMarcel Apfelbaum machine_get_dumpdtb, machine_set_dumpdtb, NULL); 41049d2e648SMarcel Apfelbaum object_property_set_description(obj, "dumpdtb", 41149d2e648SMarcel Apfelbaum "Dump current dtb to a file and quit", 41249d2e648SMarcel Apfelbaum NULL); 413b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "phandle-start", "int", 4146b1b1440SMarcel Apfelbaum machine_get_phandle_start, 4156b1b1440SMarcel Apfelbaum machine_set_phandle_start, 4166b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 41749d2e648SMarcel Apfelbaum object_property_set_description(obj, "phandle-start", 41849d2e648SMarcel Apfelbaum "The first phandle ID we may generate dynamically", 41949d2e648SMarcel Apfelbaum NULL); 420b0ddb8bfSMarcel Apfelbaum object_property_add_str(obj, "dt-compatible", 4216b1b1440SMarcel Apfelbaum machine_get_dt_compatible, 4226b1b1440SMarcel Apfelbaum machine_set_dt_compatible, 4236b1b1440SMarcel Apfelbaum NULL); 42449d2e648SMarcel Apfelbaum object_property_set_description(obj, "dt-compatible", 42549d2e648SMarcel Apfelbaum "Overrides the \"compatible\" property of the dt root node", 42649d2e648SMarcel Apfelbaum NULL); 4276b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "dump-guest-core", 4286b1b1440SMarcel Apfelbaum machine_get_dump_guest_core, 4296b1b1440SMarcel Apfelbaum machine_set_dump_guest_core, 4306b1b1440SMarcel Apfelbaum NULL); 43149d2e648SMarcel Apfelbaum object_property_set_description(obj, "dump-guest-core", 43249d2e648SMarcel Apfelbaum "Include guest memory in a core dump", 43349d2e648SMarcel Apfelbaum NULL); 4346b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "mem-merge", 435ac40aa15SLe Tan machine_get_mem_merge, 436ac40aa15SLe Tan machine_set_mem_merge, NULL); 43749d2e648SMarcel Apfelbaum object_property_set_description(obj, "mem-merge", 43849d2e648SMarcel Apfelbaum "Enable/disable memory merge support", 43949d2e648SMarcel Apfelbaum NULL); 440ac40aa15SLe Tan object_property_add_bool(obj, "usb", 441ac40aa15SLe Tan machine_get_usb, 442ac40aa15SLe Tan machine_set_usb, NULL); 44349d2e648SMarcel Apfelbaum object_property_set_description(obj, "usb", 44449d2e648SMarcel Apfelbaum "Set on/off to enable/disable usb", 44549d2e648SMarcel Apfelbaum NULL); 44679814179STiejun Chen object_property_add_bool(obj, "igd-passthru", 44779814179STiejun Chen machine_get_igd_gfx_passthru, 44879814179STiejun Chen machine_set_igd_gfx_passthru, NULL); 44979814179STiejun Chen object_property_set_description(obj, "igd-passthru", 45079814179STiejun Chen "Set on/off to enable/disable igd passthrou", 45179814179STiejun Chen NULL); 4526b1b1440SMarcel Apfelbaum object_property_add_str(obj, "firmware", 453ac40aa15SLe Tan machine_get_firmware, 454ac40aa15SLe Tan machine_set_firmware, NULL); 45549d2e648SMarcel Apfelbaum object_property_set_description(obj, "firmware", 45649d2e648SMarcel Apfelbaum "Firmware image", 45749d2e648SMarcel Apfelbaum NULL); 458a52a7fdfSLe Tan object_property_add_bool(obj, "iommu", 459a52a7fdfSLe Tan machine_get_iommu, 460a52a7fdfSLe Tan machine_set_iommu, NULL); 46149d2e648SMarcel Apfelbaum object_property_set_description(obj, "iommu", 46249d2e648SMarcel Apfelbaum "Set on/off to enable/disable Intel IOMMU (VT-d)", 46349d2e648SMarcel Apfelbaum NULL); 4649850c604SAlexander Graf object_property_add_bool(obj, "suppress-vmdesc", 4659850c604SAlexander Graf machine_get_suppress_vmdesc, 4669850c604SAlexander Graf machine_set_suppress_vmdesc, NULL); 4679850c604SAlexander Graf object_property_set_description(obj, "suppress-vmdesc", 4689850c604SAlexander Graf "Set on to disable self-describing migration", 4699850c604SAlexander Graf NULL); 47033cd52b5SAlexander Graf 47133cd52b5SAlexander Graf /* Register notifier when init is done for sysbus sanity checks */ 47233cd52b5SAlexander Graf ms->sysbus_notifier.notify = machine_init_notify; 47333cd52b5SAlexander Graf qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); 4746b1b1440SMarcel Apfelbaum } 4756b1b1440SMarcel Apfelbaum 4766b1b1440SMarcel Apfelbaum static void machine_finalize(Object *obj) 4776b1b1440SMarcel Apfelbaum { 4786b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 4796b1b1440SMarcel Apfelbaum 4806b1b1440SMarcel Apfelbaum g_free(ms->accel); 4816b1b1440SMarcel Apfelbaum g_free(ms->kernel_filename); 4826b1b1440SMarcel Apfelbaum g_free(ms->initrd_filename); 4836b1b1440SMarcel Apfelbaum g_free(ms->kernel_cmdline); 4846b1b1440SMarcel Apfelbaum g_free(ms->dtb); 4856b1b1440SMarcel Apfelbaum g_free(ms->dumpdtb); 4866b1b1440SMarcel Apfelbaum g_free(ms->dt_compatible); 4876b1b1440SMarcel Apfelbaum g_free(ms->firmware); 4886b1b1440SMarcel Apfelbaum } 48936d20cb2SMarcel Apfelbaum 4905e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine) 4915e97b623SMarcel Apfelbaum { 4925e97b623SMarcel Apfelbaum return machine->usb; 4935e97b623SMarcel Apfelbaum } 4945e97b623SMarcel Apfelbaum 495d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine) 496d8870d02SMarcel Apfelbaum { 497d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_allowed; 498d8870d02SMarcel Apfelbaum } 499d8870d02SMarcel Apfelbaum 500d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine) 501d8870d02SMarcel Apfelbaum { 502d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_required; 503d8870d02SMarcel Apfelbaum } 504d8870d02SMarcel Apfelbaum 50532c18a2dSMatt Gingell bool machine_kernel_irqchip_split(MachineState *machine) 50632c18a2dSMatt Gingell { 50732c18a2dSMatt Gingell return machine->kernel_irqchip_split; 50832c18a2dSMatt Gingell } 50932c18a2dSMatt Gingell 5104689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine) 5114689b77bSMarcel Apfelbaum { 5124689b77bSMarcel Apfelbaum return machine->kvm_shadow_mem; 5134689b77bSMarcel Apfelbaum } 5144689b77bSMarcel Apfelbaum 5156cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine) 5166cabe7faSMarcel Apfelbaum { 5176cabe7faSMarcel Apfelbaum return machine->phandle_start; 5186cabe7faSMarcel Apfelbaum } 5196cabe7faSMarcel Apfelbaum 52047c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine) 52147c8ca53SMarcel Apfelbaum { 52247c8ca53SMarcel Apfelbaum return machine->dump_guest_core; 52347c8ca53SMarcel Apfelbaum } 52447c8ca53SMarcel Apfelbaum 52575cc7f01SMarcel Apfelbaum bool machine_mem_merge(MachineState *machine) 52675cc7f01SMarcel Apfelbaum { 52775cc7f01SMarcel Apfelbaum return machine->mem_merge; 52875cc7f01SMarcel Apfelbaum } 52975cc7f01SMarcel Apfelbaum 53036d20cb2SMarcel Apfelbaum static const TypeInfo machine_info = { 53136d20cb2SMarcel Apfelbaum .name = TYPE_MACHINE, 53236d20cb2SMarcel Apfelbaum .parent = TYPE_OBJECT, 53336d20cb2SMarcel Apfelbaum .abstract = true, 53436d20cb2SMarcel Apfelbaum .class_size = sizeof(MachineClass), 535076b35b5SNikunj A Dadhania .class_init = machine_class_init, 536dcb3d601SEduardo Habkost .class_base_init = machine_class_base_init, 53736d20cb2SMarcel Apfelbaum .instance_size = sizeof(MachineState), 5386b1b1440SMarcel Apfelbaum .instance_init = machine_initfn, 5396b1b1440SMarcel Apfelbaum .instance_finalize = machine_finalize, 54036d20cb2SMarcel Apfelbaum }; 54136d20cb2SMarcel Apfelbaum 54236d20cb2SMarcel Apfelbaum static void machine_register_types(void) 54336d20cb2SMarcel Apfelbaum { 54436d20cb2SMarcel Apfelbaum type_register_static(&machine_info); 54536d20cb2SMarcel Apfelbaum } 54636d20cb2SMarcel Apfelbaum 54736d20cb2SMarcel Apfelbaum type_init(machine_register_types) 548