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" 15*da34e65cSMarkus Armbruster #include "qapi/error.h" 1632c18a2dSMatt Gingell #include "qapi-visit.h" 176b1b1440SMarcel Apfelbaum #include "qapi/visitor.h" 1833cd52b5SAlexander Graf #include "hw/sysbus.h" 1933cd52b5SAlexander Graf #include "sysemu/sysemu.h" 2033cd52b5SAlexander Graf #include "qemu/error-report.h" 216b1b1440SMarcel Apfelbaum 226b1b1440SMarcel Apfelbaum static char *machine_get_accel(Object *obj, Error **errp) 236b1b1440SMarcel Apfelbaum { 246b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 256b1b1440SMarcel Apfelbaum 266b1b1440SMarcel Apfelbaum return g_strdup(ms->accel); 276b1b1440SMarcel Apfelbaum } 286b1b1440SMarcel Apfelbaum 296b1b1440SMarcel Apfelbaum static void machine_set_accel(Object *obj, const char *value, Error **errp) 306b1b1440SMarcel Apfelbaum { 316b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 326b1b1440SMarcel Apfelbaum 33556068eeSEduardo Habkost g_free(ms->accel); 346b1b1440SMarcel Apfelbaum ms->accel = g_strdup(value); 356b1b1440SMarcel Apfelbaum } 366b1b1440SMarcel Apfelbaum 3732c18a2dSMatt Gingell static void machine_set_kernel_irqchip(Object *obj, Visitor *v, 38d7bce999SEric Blake const char *name, void *opaque, 3932c18a2dSMatt Gingell Error **errp) 406b1b1440SMarcel Apfelbaum { 4132c18a2dSMatt Gingell Error *err = NULL; 426b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 4332c18a2dSMatt Gingell OnOffSplit mode; 446b1b1440SMarcel Apfelbaum 4551e72bc1SEric Blake visit_type_OnOffSplit(v, name, &mode, &err); 4632c18a2dSMatt Gingell if (err) { 4732c18a2dSMatt Gingell error_propagate(errp, err); 4832c18a2dSMatt Gingell return; 4932c18a2dSMatt Gingell } else { 5032c18a2dSMatt Gingell switch (mode) { 5132c18a2dSMatt Gingell case ON_OFF_SPLIT_ON: 5232c18a2dSMatt Gingell ms->kernel_irqchip_allowed = true; 5332c18a2dSMatt Gingell ms->kernel_irqchip_required = true; 5432c18a2dSMatt Gingell ms->kernel_irqchip_split = false; 5532c18a2dSMatt Gingell break; 5632c18a2dSMatt Gingell case ON_OFF_SPLIT_OFF: 5732c18a2dSMatt Gingell ms->kernel_irqchip_allowed = false; 5832c18a2dSMatt Gingell ms->kernel_irqchip_required = false; 5932c18a2dSMatt Gingell ms->kernel_irqchip_split = false; 6032c18a2dSMatt Gingell break; 6132c18a2dSMatt Gingell case ON_OFF_SPLIT_SPLIT: 6232c18a2dSMatt Gingell ms->kernel_irqchip_allowed = true; 6332c18a2dSMatt Gingell ms->kernel_irqchip_required = true; 6432c18a2dSMatt Gingell ms->kernel_irqchip_split = true; 6532c18a2dSMatt Gingell break; 6632c18a2dSMatt Gingell default: 6732c18a2dSMatt Gingell abort(); 6832c18a2dSMatt Gingell } 6932c18a2dSMatt Gingell } 706b1b1440SMarcel Apfelbaum } 716b1b1440SMarcel Apfelbaum 726b1b1440SMarcel Apfelbaum static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v, 73d7bce999SEric Blake const char *name, void *opaque, 746b1b1440SMarcel Apfelbaum Error **errp) 756b1b1440SMarcel Apfelbaum { 766b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 776b1b1440SMarcel Apfelbaum int64_t value = ms->kvm_shadow_mem; 786b1b1440SMarcel Apfelbaum 7951e72bc1SEric Blake visit_type_int(v, name, &value, errp); 806b1b1440SMarcel Apfelbaum } 816b1b1440SMarcel Apfelbaum 826b1b1440SMarcel Apfelbaum static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v, 83d7bce999SEric Blake const char *name, void *opaque, 846b1b1440SMarcel Apfelbaum Error **errp) 856b1b1440SMarcel Apfelbaum { 866b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 876b1b1440SMarcel Apfelbaum Error *error = NULL; 886b1b1440SMarcel Apfelbaum int64_t value; 896b1b1440SMarcel Apfelbaum 9051e72bc1SEric Blake visit_type_int(v, name, &value, &error); 916b1b1440SMarcel Apfelbaum if (error) { 926b1b1440SMarcel Apfelbaum error_propagate(errp, error); 936b1b1440SMarcel Apfelbaum return; 946b1b1440SMarcel Apfelbaum } 956b1b1440SMarcel Apfelbaum 966b1b1440SMarcel Apfelbaum ms->kvm_shadow_mem = value; 976b1b1440SMarcel Apfelbaum } 986b1b1440SMarcel Apfelbaum 996b1b1440SMarcel Apfelbaum static char *machine_get_kernel(Object *obj, Error **errp) 1006b1b1440SMarcel Apfelbaum { 1016b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1026b1b1440SMarcel Apfelbaum 1036b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_filename); 1046b1b1440SMarcel Apfelbaum } 1056b1b1440SMarcel Apfelbaum 1066b1b1440SMarcel Apfelbaum static void machine_set_kernel(Object *obj, const char *value, Error **errp) 1076b1b1440SMarcel Apfelbaum { 1086b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1096b1b1440SMarcel Apfelbaum 110556068eeSEduardo Habkost g_free(ms->kernel_filename); 1116b1b1440SMarcel Apfelbaum ms->kernel_filename = g_strdup(value); 1126b1b1440SMarcel Apfelbaum } 1136b1b1440SMarcel Apfelbaum 1146b1b1440SMarcel Apfelbaum static char *machine_get_initrd(Object *obj, Error **errp) 1156b1b1440SMarcel Apfelbaum { 1166b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1176b1b1440SMarcel Apfelbaum 1186b1b1440SMarcel Apfelbaum return g_strdup(ms->initrd_filename); 1196b1b1440SMarcel Apfelbaum } 1206b1b1440SMarcel Apfelbaum 1216b1b1440SMarcel Apfelbaum static void machine_set_initrd(Object *obj, const char *value, Error **errp) 1226b1b1440SMarcel Apfelbaum { 1236b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1246b1b1440SMarcel Apfelbaum 125556068eeSEduardo Habkost g_free(ms->initrd_filename); 1266b1b1440SMarcel Apfelbaum ms->initrd_filename = g_strdup(value); 1276b1b1440SMarcel Apfelbaum } 1286b1b1440SMarcel Apfelbaum 1296b1b1440SMarcel Apfelbaum static char *machine_get_append(Object *obj, Error **errp) 1306b1b1440SMarcel Apfelbaum { 1316b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1326b1b1440SMarcel Apfelbaum 1336b1b1440SMarcel Apfelbaum return g_strdup(ms->kernel_cmdline); 1346b1b1440SMarcel Apfelbaum } 1356b1b1440SMarcel Apfelbaum 1366b1b1440SMarcel Apfelbaum static void machine_set_append(Object *obj, const char *value, Error **errp) 1376b1b1440SMarcel Apfelbaum { 1386b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1396b1b1440SMarcel Apfelbaum 140556068eeSEduardo Habkost g_free(ms->kernel_cmdline); 1416b1b1440SMarcel Apfelbaum ms->kernel_cmdline = g_strdup(value); 1426b1b1440SMarcel Apfelbaum } 1436b1b1440SMarcel Apfelbaum 1446b1b1440SMarcel Apfelbaum static char *machine_get_dtb(Object *obj, Error **errp) 1456b1b1440SMarcel Apfelbaum { 1466b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1476b1b1440SMarcel Apfelbaum 1486b1b1440SMarcel Apfelbaum return g_strdup(ms->dtb); 1496b1b1440SMarcel Apfelbaum } 1506b1b1440SMarcel Apfelbaum 1516b1b1440SMarcel Apfelbaum static void machine_set_dtb(Object *obj, const char *value, Error **errp) 1526b1b1440SMarcel Apfelbaum { 1536b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1546b1b1440SMarcel Apfelbaum 155556068eeSEduardo Habkost g_free(ms->dtb); 1566b1b1440SMarcel Apfelbaum ms->dtb = g_strdup(value); 1576b1b1440SMarcel Apfelbaum } 1586b1b1440SMarcel Apfelbaum 1596b1b1440SMarcel Apfelbaum static char *machine_get_dumpdtb(Object *obj, Error **errp) 1606b1b1440SMarcel Apfelbaum { 1616b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1626b1b1440SMarcel Apfelbaum 1636b1b1440SMarcel Apfelbaum return g_strdup(ms->dumpdtb); 1646b1b1440SMarcel Apfelbaum } 1656b1b1440SMarcel Apfelbaum 1666b1b1440SMarcel Apfelbaum static void machine_set_dumpdtb(Object *obj, const char *value, Error **errp) 1676b1b1440SMarcel Apfelbaum { 1686b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1696b1b1440SMarcel Apfelbaum 170556068eeSEduardo Habkost g_free(ms->dumpdtb); 1716b1b1440SMarcel Apfelbaum ms->dumpdtb = g_strdup(value); 1726b1b1440SMarcel Apfelbaum } 1736b1b1440SMarcel Apfelbaum 1746b1b1440SMarcel Apfelbaum static void machine_get_phandle_start(Object *obj, Visitor *v, 175d7bce999SEric Blake const char *name, void *opaque, 1766b1b1440SMarcel Apfelbaum Error **errp) 1776b1b1440SMarcel Apfelbaum { 1786b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1796b1b1440SMarcel Apfelbaum int64_t value = ms->phandle_start; 1806b1b1440SMarcel Apfelbaum 18151e72bc1SEric Blake visit_type_int(v, name, &value, errp); 1826b1b1440SMarcel Apfelbaum } 1836b1b1440SMarcel Apfelbaum 1846b1b1440SMarcel Apfelbaum static void machine_set_phandle_start(Object *obj, Visitor *v, 185d7bce999SEric Blake const char *name, void *opaque, 1866b1b1440SMarcel Apfelbaum Error **errp) 1876b1b1440SMarcel Apfelbaum { 1886b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 1896b1b1440SMarcel Apfelbaum Error *error = NULL; 1906b1b1440SMarcel Apfelbaum int64_t value; 1916b1b1440SMarcel Apfelbaum 19251e72bc1SEric Blake visit_type_int(v, name, &value, &error); 1936b1b1440SMarcel Apfelbaum if (error) { 1946b1b1440SMarcel Apfelbaum error_propagate(errp, error); 1956b1b1440SMarcel Apfelbaum return; 1966b1b1440SMarcel Apfelbaum } 1976b1b1440SMarcel Apfelbaum 1986b1b1440SMarcel Apfelbaum ms->phandle_start = value; 1996b1b1440SMarcel Apfelbaum } 2006b1b1440SMarcel Apfelbaum 2016b1b1440SMarcel Apfelbaum static char *machine_get_dt_compatible(Object *obj, Error **errp) 2026b1b1440SMarcel Apfelbaum { 2036b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2046b1b1440SMarcel Apfelbaum 2056b1b1440SMarcel Apfelbaum return g_strdup(ms->dt_compatible); 2066b1b1440SMarcel Apfelbaum } 2076b1b1440SMarcel Apfelbaum 2086b1b1440SMarcel Apfelbaum static void machine_set_dt_compatible(Object *obj, const char *value, Error **errp) 2096b1b1440SMarcel Apfelbaum { 2106b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2116b1b1440SMarcel Apfelbaum 212556068eeSEduardo Habkost g_free(ms->dt_compatible); 2136b1b1440SMarcel Apfelbaum ms->dt_compatible = g_strdup(value); 2146b1b1440SMarcel Apfelbaum } 2156b1b1440SMarcel Apfelbaum 2166b1b1440SMarcel Apfelbaum static bool machine_get_dump_guest_core(Object *obj, Error **errp) 2176b1b1440SMarcel Apfelbaum { 2186b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2196b1b1440SMarcel Apfelbaum 2206b1b1440SMarcel Apfelbaum return ms->dump_guest_core; 2216b1b1440SMarcel Apfelbaum } 2226b1b1440SMarcel Apfelbaum 2236b1b1440SMarcel Apfelbaum static void machine_set_dump_guest_core(Object *obj, bool value, Error **errp) 2246b1b1440SMarcel Apfelbaum { 2256b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2266b1b1440SMarcel Apfelbaum 2276b1b1440SMarcel Apfelbaum ms->dump_guest_core = value; 2286b1b1440SMarcel Apfelbaum } 2296b1b1440SMarcel Apfelbaum 2306b1b1440SMarcel Apfelbaum static bool machine_get_mem_merge(Object *obj, Error **errp) 2316b1b1440SMarcel Apfelbaum { 2326b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2336b1b1440SMarcel Apfelbaum 2346b1b1440SMarcel Apfelbaum return ms->mem_merge; 2356b1b1440SMarcel Apfelbaum } 2366b1b1440SMarcel Apfelbaum 2376b1b1440SMarcel Apfelbaum static void machine_set_mem_merge(Object *obj, bool value, Error **errp) 2386b1b1440SMarcel Apfelbaum { 2396b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2406b1b1440SMarcel Apfelbaum 2416b1b1440SMarcel Apfelbaum ms->mem_merge = value; 2426b1b1440SMarcel Apfelbaum } 2436b1b1440SMarcel Apfelbaum 2446b1b1440SMarcel Apfelbaum static bool machine_get_usb(Object *obj, Error **errp) 2456b1b1440SMarcel Apfelbaum { 2466b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2476b1b1440SMarcel Apfelbaum 2486b1b1440SMarcel Apfelbaum return ms->usb; 2496b1b1440SMarcel Apfelbaum } 2506b1b1440SMarcel Apfelbaum 2516b1b1440SMarcel Apfelbaum static void machine_set_usb(Object *obj, bool value, Error **errp) 2526b1b1440SMarcel Apfelbaum { 2536b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2546b1b1440SMarcel Apfelbaum 2556b1b1440SMarcel Apfelbaum ms->usb = value; 256c6e76503SPaolo Bonzini ms->usb_disabled = !value; 2576b1b1440SMarcel Apfelbaum } 2586b1b1440SMarcel Apfelbaum 25979814179STiejun Chen static bool machine_get_igd_gfx_passthru(Object *obj, Error **errp) 26079814179STiejun Chen { 26179814179STiejun Chen MachineState *ms = MACHINE(obj); 26279814179STiejun Chen 26379814179STiejun Chen return ms->igd_gfx_passthru; 26479814179STiejun Chen } 26579814179STiejun Chen 26679814179STiejun Chen static void machine_set_igd_gfx_passthru(Object *obj, bool value, Error **errp) 26779814179STiejun Chen { 26879814179STiejun Chen MachineState *ms = MACHINE(obj); 26979814179STiejun Chen 27079814179STiejun Chen ms->igd_gfx_passthru = value; 27179814179STiejun Chen } 27279814179STiejun Chen 2736b1b1440SMarcel Apfelbaum static char *machine_get_firmware(Object *obj, Error **errp) 2746b1b1440SMarcel Apfelbaum { 2756b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2766b1b1440SMarcel Apfelbaum 2776b1b1440SMarcel Apfelbaum return g_strdup(ms->firmware); 2786b1b1440SMarcel Apfelbaum } 2796b1b1440SMarcel Apfelbaum 2806b1b1440SMarcel Apfelbaum static void machine_set_firmware(Object *obj, const char *value, Error **errp) 2816b1b1440SMarcel Apfelbaum { 2826b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 2836b1b1440SMarcel Apfelbaum 284556068eeSEduardo Habkost g_free(ms->firmware); 2856b1b1440SMarcel Apfelbaum ms->firmware = g_strdup(value); 2866b1b1440SMarcel Apfelbaum } 2876b1b1440SMarcel Apfelbaum 288a52a7fdfSLe Tan static bool machine_get_iommu(Object *obj, Error **errp) 289a52a7fdfSLe Tan { 290a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 291a52a7fdfSLe Tan 292a52a7fdfSLe Tan return ms->iommu; 293a52a7fdfSLe Tan } 294a52a7fdfSLe Tan 295a52a7fdfSLe Tan static void machine_set_iommu(Object *obj, bool value, Error **errp) 296a52a7fdfSLe Tan { 297a52a7fdfSLe Tan MachineState *ms = MACHINE(obj); 298a52a7fdfSLe Tan 299a52a7fdfSLe Tan ms->iommu = value; 300a52a7fdfSLe Tan } 301a52a7fdfSLe Tan 3029850c604SAlexander Graf static void machine_set_suppress_vmdesc(Object *obj, bool value, Error **errp) 3039850c604SAlexander Graf { 3049850c604SAlexander Graf MachineState *ms = MACHINE(obj); 3059850c604SAlexander Graf 3069850c604SAlexander Graf ms->suppress_vmdesc = value; 3079850c604SAlexander Graf } 3089850c604SAlexander Graf 3099850c604SAlexander Graf static bool machine_get_suppress_vmdesc(Object *obj, Error **errp) 3109850c604SAlexander Graf { 3119850c604SAlexander Graf MachineState *ms = MACHINE(obj); 3129850c604SAlexander Graf 3139850c604SAlexander Graf return ms->suppress_vmdesc; 3149850c604SAlexander Graf } 3159850c604SAlexander Graf 316902c053dSGreg Kurz static void machine_set_enforce_config_section(Object *obj, bool value, 317902c053dSGreg Kurz Error **errp) 318902c053dSGreg Kurz { 319902c053dSGreg Kurz MachineState *ms = MACHINE(obj); 320902c053dSGreg Kurz 321902c053dSGreg Kurz ms->enforce_config_section = value; 322902c053dSGreg Kurz } 323902c053dSGreg Kurz 324902c053dSGreg Kurz static bool machine_get_enforce_config_section(Object *obj, Error **errp) 325902c053dSGreg Kurz { 326902c053dSGreg Kurz MachineState *ms = MACHINE(obj); 327902c053dSGreg Kurz 328902c053dSGreg Kurz return ms->enforce_config_section; 329902c053dSGreg Kurz } 330902c053dSGreg Kurz 33133cd52b5SAlexander Graf static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque) 33233cd52b5SAlexander Graf { 33333cd52b5SAlexander Graf error_report("Option '-device %s' cannot be handled by this machine", 33433cd52b5SAlexander Graf object_class_get_name(object_get_class(OBJECT(sbdev)))); 33533cd52b5SAlexander Graf exit(1); 33633cd52b5SAlexander Graf } 33733cd52b5SAlexander Graf 33833cd52b5SAlexander Graf static void machine_init_notify(Notifier *notifier, void *data) 33933cd52b5SAlexander Graf { 34033cd52b5SAlexander Graf Object *machine = qdev_get_machine(); 34133cd52b5SAlexander Graf ObjectClass *oc = object_get_class(machine); 34233cd52b5SAlexander Graf MachineClass *mc = MACHINE_CLASS(oc); 34333cd52b5SAlexander Graf 34433cd52b5SAlexander Graf if (mc->has_dynamic_sysbus) { 34533cd52b5SAlexander Graf /* Our machine can handle dynamic sysbus devices, we're all good */ 34633cd52b5SAlexander Graf return; 34733cd52b5SAlexander Graf } 34833cd52b5SAlexander Graf 34933cd52b5SAlexander Graf /* 35033cd52b5SAlexander Graf * Loop through all dynamically created devices and check whether there 35133cd52b5SAlexander Graf * are sysbus devices among them. If there are, error out. 35233cd52b5SAlexander Graf */ 35333cd52b5SAlexander Graf foreach_dynamic_sysbus_device(error_on_sysbus_device, NULL); 35433cd52b5SAlexander Graf } 35533cd52b5SAlexander Graf 356076b35b5SNikunj A Dadhania static void machine_class_init(ObjectClass *oc, void *data) 357076b35b5SNikunj A Dadhania { 358076b35b5SNikunj A Dadhania MachineClass *mc = MACHINE_CLASS(oc); 359076b35b5SNikunj A Dadhania 360076b35b5SNikunj A Dadhania /* Default 128 MB as guest ram size */ 361076b35b5SNikunj A Dadhania mc->default_ram_size = 128 * M_BYTE; 36271ae9e94SEduardo Habkost mc->rom_file_has_mr = true; 363076b35b5SNikunj A Dadhania } 364076b35b5SNikunj A Dadhania 365dcb3d601SEduardo Habkost static void machine_class_base_init(ObjectClass *oc, void *data) 366dcb3d601SEduardo Habkost { 367dcb3d601SEduardo Habkost if (!object_class_is_abstract(oc)) { 36898cec76aSEduardo Habkost MachineClass *mc = MACHINE_CLASS(oc); 369dcb3d601SEduardo Habkost const char *cname = object_class_get_name(oc); 370dcb3d601SEduardo Habkost assert(g_str_has_suffix(cname, TYPE_MACHINE_SUFFIX)); 37198cec76aSEduardo Habkost mc->name = g_strndup(cname, 37298cec76aSEduardo Habkost strlen(cname) - strlen(TYPE_MACHINE_SUFFIX)); 373dcb3d601SEduardo Habkost } 374dcb3d601SEduardo Habkost } 375dcb3d601SEduardo Habkost 3766b1b1440SMarcel Apfelbaum static void machine_initfn(Object *obj) 3776b1b1440SMarcel Apfelbaum { 37833cd52b5SAlexander Graf MachineState *ms = MACHINE(obj); 37933cd52b5SAlexander Graf 380d8870d02SMarcel Apfelbaum ms->kernel_irqchip_allowed = true; 3814689b77bSMarcel Apfelbaum ms->kvm_shadow_mem = -1; 38247c8ca53SMarcel Apfelbaum ms->dump_guest_core = true; 38375cc7f01SMarcel Apfelbaum ms->mem_merge = true; 384d8870d02SMarcel Apfelbaum 3856b1b1440SMarcel Apfelbaum object_property_add_str(obj, "accel", 3866b1b1440SMarcel Apfelbaum machine_get_accel, machine_set_accel, NULL); 38749d2e648SMarcel Apfelbaum object_property_set_description(obj, "accel", 38849d2e648SMarcel Apfelbaum "Accelerator list", 38949d2e648SMarcel Apfelbaum NULL); 39032c18a2dSMatt Gingell object_property_add(obj, "kernel-irqchip", "OnOffSplit", 391d8870d02SMarcel Apfelbaum NULL, 3926b1b1440SMarcel Apfelbaum machine_set_kernel_irqchip, 39332c18a2dSMatt Gingell NULL, NULL, NULL); 39449d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel-irqchip", 39532c18a2dSMatt Gingell "Configure KVM in-kernel irqchip", 39649d2e648SMarcel Apfelbaum NULL); 397b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "kvm-shadow-mem", "int", 3986b1b1440SMarcel Apfelbaum machine_get_kvm_shadow_mem, 3996b1b1440SMarcel Apfelbaum machine_set_kvm_shadow_mem, 4006b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 40149d2e648SMarcel Apfelbaum object_property_set_description(obj, "kvm-shadow-mem", 40249d2e648SMarcel Apfelbaum "KVM shadow MMU size", 40349d2e648SMarcel Apfelbaum NULL); 4046b1b1440SMarcel Apfelbaum object_property_add_str(obj, "kernel", 4056b1b1440SMarcel Apfelbaum machine_get_kernel, machine_set_kernel, NULL); 40649d2e648SMarcel Apfelbaum object_property_set_description(obj, "kernel", 40749d2e648SMarcel Apfelbaum "Linux kernel image file", 40849d2e648SMarcel Apfelbaum NULL); 4096b1b1440SMarcel Apfelbaum object_property_add_str(obj, "initrd", 4106b1b1440SMarcel Apfelbaum machine_get_initrd, machine_set_initrd, NULL); 41149d2e648SMarcel Apfelbaum object_property_set_description(obj, "initrd", 41249d2e648SMarcel Apfelbaum "Linux initial ramdisk file", 41349d2e648SMarcel Apfelbaum NULL); 4146b1b1440SMarcel Apfelbaum object_property_add_str(obj, "append", 4156b1b1440SMarcel Apfelbaum machine_get_append, machine_set_append, NULL); 41649d2e648SMarcel Apfelbaum object_property_set_description(obj, "append", 41749d2e648SMarcel Apfelbaum "Linux kernel command line", 41849d2e648SMarcel Apfelbaum NULL); 4196b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dtb", 4206b1b1440SMarcel Apfelbaum machine_get_dtb, machine_set_dtb, NULL); 42149d2e648SMarcel Apfelbaum object_property_set_description(obj, "dtb", 42249d2e648SMarcel Apfelbaum "Linux kernel device tree file", 42349d2e648SMarcel Apfelbaum NULL); 4246b1b1440SMarcel Apfelbaum object_property_add_str(obj, "dumpdtb", 4256b1b1440SMarcel Apfelbaum machine_get_dumpdtb, machine_set_dumpdtb, NULL); 42649d2e648SMarcel Apfelbaum object_property_set_description(obj, "dumpdtb", 42749d2e648SMarcel Apfelbaum "Dump current dtb to a file and quit", 42849d2e648SMarcel Apfelbaum NULL); 429b0ddb8bfSMarcel Apfelbaum object_property_add(obj, "phandle-start", "int", 4306b1b1440SMarcel Apfelbaum machine_get_phandle_start, 4316b1b1440SMarcel Apfelbaum machine_set_phandle_start, 4326b1b1440SMarcel Apfelbaum NULL, NULL, NULL); 43349d2e648SMarcel Apfelbaum object_property_set_description(obj, "phandle-start", 43449d2e648SMarcel Apfelbaum "The first phandle ID we may generate dynamically", 43549d2e648SMarcel Apfelbaum NULL); 436b0ddb8bfSMarcel Apfelbaum object_property_add_str(obj, "dt-compatible", 4376b1b1440SMarcel Apfelbaum machine_get_dt_compatible, 4386b1b1440SMarcel Apfelbaum machine_set_dt_compatible, 4396b1b1440SMarcel Apfelbaum NULL); 44049d2e648SMarcel Apfelbaum object_property_set_description(obj, "dt-compatible", 44149d2e648SMarcel Apfelbaum "Overrides the \"compatible\" property of the dt root node", 44249d2e648SMarcel Apfelbaum NULL); 4436b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "dump-guest-core", 4446b1b1440SMarcel Apfelbaum machine_get_dump_guest_core, 4456b1b1440SMarcel Apfelbaum machine_set_dump_guest_core, 4466b1b1440SMarcel Apfelbaum NULL); 44749d2e648SMarcel Apfelbaum object_property_set_description(obj, "dump-guest-core", 44849d2e648SMarcel Apfelbaum "Include guest memory in a core dump", 44949d2e648SMarcel Apfelbaum NULL); 4506b1b1440SMarcel Apfelbaum object_property_add_bool(obj, "mem-merge", 451ac40aa15SLe Tan machine_get_mem_merge, 452ac40aa15SLe Tan machine_set_mem_merge, NULL); 45349d2e648SMarcel Apfelbaum object_property_set_description(obj, "mem-merge", 45449d2e648SMarcel Apfelbaum "Enable/disable memory merge support", 45549d2e648SMarcel Apfelbaum NULL); 456ac40aa15SLe Tan object_property_add_bool(obj, "usb", 457ac40aa15SLe Tan machine_get_usb, 458ac40aa15SLe Tan machine_set_usb, NULL); 45949d2e648SMarcel Apfelbaum object_property_set_description(obj, "usb", 46049d2e648SMarcel Apfelbaum "Set on/off to enable/disable usb", 46149d2e648SMarcel Apfelbaum NULL); 46279814179STiejun Chen object_property_add_bool(obj, "igd-passthru", 46379814179STiejun Chen machine_get_igd_gfx_passthru, 46479814179STiejun Chen machine_set_igd_gfx_passthru, NULL); 46579814179STiejun Chen object_property_set_description(obj, "igd-passthru", 46679814179STiejun Chen "Set on/off to enable/disable igd passthrou", 46779814179STiejun Chen NULL); 4686b1b1440SMarcel Apfelbaum object_property_add_str(obj, "firmware", 469ac40aa15SLe Tan machine_get_firmware, 470ac40aa15SLe Tan machine_set_firmware, NULL); 47149d2e648SMarcel Apfelbaum object_property_set_description(obj, "firmware", 47249d2e648SMarcel Apfelbaum "Firmware image", 47349d2e648SMarcel Apfelbaum NULL); 474a52a7fdfSLe Tan object_property_add_bool(obj, "iommu", 475a52a7fdfSLe Tan machine_get_iommu, 476a52a7fdfSLe Tan machine_set_iommu, NULL); 47749d2e648SMarcel Apfelbaum object_property_set_description(obj, "iommu", 47849d2e648SMarcel Apfelbaum "Set on/off to enable/disable Intel IOMMU (VT-d)", 47949d2e648SMarcel Apfelbaum NULL); 4809850c604SAlexander Graf object_property_add_bool(obj, "suppress-vmdesc", 4819850c604SAlexander Graf machine_get_suppress_vmdesc, 4829850c604SAlexander Graf machine_set_suppress_vmdesc, NULL); 4839850c604SAlexander Graf object_property_set_description(obj, "suppress-vmdesc", 4849850c604SAlexander Graf "Set on to disable self-describing migration", 4859850c604SAlexander Graf NULL); 486902c053dSGreg Kurz object_property_add_bool(obj, "enforce-config-section", 487902c053dSGreg Kurz machine_get_enforce_config_section, 488902c053dSGreg Kurz machine_set_enforce_config_section, NULL); 489902c053dSGreg Kurz object_property_set_description(obj, "enforce-config-section", 490902c053dSGreg Kurz "Set on to enforce configuration section migration", 491902c053dSGreg Kurz NULL); 49233cd52b5SAlexander Graf 49333cd52b5SAlexander Graf /* Register notifier when init is done for sysbus sanity checks */ 49433cd52b5SAlexander Graf ms->sysbus_notifier.notify = machine_init_notify; 49533cd52b5SAlexander Graf qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); 4966b1b1440SMarcel Apfelbaum } 4976b1b1440SMarcel Apfelbaum 4986b1b1440SMarcel Apfelbaum static void machine_finalize(Object *obj) 4996b1b1440SMarcel Apfelbaum { 5006b1b1440SMarcel Apfelbaum MachineState *ms = MACHINE(obj); 5016b1b1440SMarcel Apfelbaum 5026b1b1440SMarcel Apfelbaum g_free(ms->accel); 5036b1b1440SMarcel Apfelbaum g_free(ms->kernel_filename); 5046b1b1440SMarcel Apfelbaum g_free(ms->initrd_filename); 5056b1b1440SMarcel Apfelbaum g_free(ms->kernel_cmdline); 5066b1b1440SMarcel Apfelbaum g_free(ms->dtb); 5076b1b1440SMarcel Apfelbaum g_free(ms->dumpdtb); 5086b1b1440SMarcel Apfelbaum g_free(ms->dt_compatible); 5096b1b1440SMarcel Apfelbaum g_free(ms->firmware); 5106b1b1440SMarcel Apfelbaum } 51136d20cb2SMarcel Apfelbaum 5125e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine) 5135e97b623SMarcel Apfelbaum { 5145e97b623SMarcel Apfelbaum return machine->usb; 5155e97b623SMarcel Apfelbaum } 5165e97b623SMarcel Apfelbaum 517d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine) 518d8870d02SMarcel Apfelbaum { 519d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_allowed; 520d8870d02SMarcel Apfelbaum } 521d8870d02SMarcel Apfelbaum 522d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine) 523d8870d02SMarcel Apfelbaum { 524d8870d02SMarcel Apfelbaum return machine->kernel_irqchip_required; 525d8870d02SMarcel Apfelbaum } 526d8870d02SMarcel Apfelbaum 52732c18a2dSMatt Gingell bool machine_kernel_irqchip_split(MachineState *machine) 52832c18a2dSMatt Gingell { 52932c18a2dSMatt Gingell return machine->kernel_irqchip_split; 53032c18a2dSMatt Gingell } 53132c18a2dSMatt Gingell 5324689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine) 5334689b77bSMarcel Apfelbaum { 5344689b77bSMarcel Apfelbaum return machine->kvm_shadow_mem; 5354689b77bSMarcel Apfelbaum } 5364689b77bSMarcel Apfelbaum 5376cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine) 5386cabe7faSMarcel Apfelbaum { 5396cabe7faSMarcel Apfelbaum return machine->phandle_start; 5406cabe7faSMarcel Apfelbaum } 5416cabe7faSMarcel Apfelbaum 54247c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine) 54347c8ca53SMarcel Apfelbaum { 54447c8ca53SMarcel Apfelbaum return machine->dump_guest_core; 54547c8ca53SMarcel Apfelbaum } 54647c8ca53SMarcel Apfelbaum 54775cc7f01SMarcel Apfelbaum bool machine_mem_merge(MachineState *machine) 54875cc7f01SMarcel Apfelbaum { 54975cc7f01SMarcel Apfelbaum return machine->mem_merge; 55075cc7f01SMarcel Apfelbaum } 55175cc7f01SMarcel Apfelbaum 55236d20cb2SMarcel Apfelbaum static const TypeInfo machine_info = { 55336d20cb2SMarcel Apfelbaum .name = TYPE_MACHINE, 55436d20cb2SMarcel Apfelbaum .parent = TYPE_OBJECT, 55536d20cb2SMarcel Apfelbaum .abstract = true, 55636d20cb2SMarcel Apfelbaum .class_size = sizeof(MachineClass), 557076b35b5SNikunj A Dadhania .class_init = machine_class_init, 558dcb3d601SEduardo Habkost .class_base_init = machine_class_base_init, 55936d20cb2SMarcel Apfelbaum .instance_size = sizeof(MachineState), 5606b1b1440SMarcel Apfelbaum .instance_init = machine_initfn, 5616b1b1440SMarcel Apfelbaum .instance_finalize = machine_finalize, 56236d20cb2SMarcel Apfelbaum }; 56336d20cb2SMarcel Apfelbaum 56436d20cb2SMarcel Apfelbaum static void machine_register_types(void) 56536d20cb2SMarcel Apfelbaum { 56636d20cb2SMarcel Apfelbaum type_register_static(&machine_info); 56736d20cb2SMarcel Apfelbaum } 56836d20cb2SMarcel Apfelbaum 56936d20cb2SMarcel Apfelbaum type_init(machine_register_types) 570