blob: d64b5481e8343018fc24d1840149db04f409d3d1 [file] [log] [blame]
pbrook87ecb682007-11-17 17:14:51 +00001/* Declarations for use by board files for creating devices. */
2
3#ifndef HW_BOARDS_H
4#define HW_BOARDS_H
5
Markus Armbrusterd4842052019-08-12 07:23:46 +02006#include "exec/memory.h"
Igor Mammedovaa8b1832020-02-19 11:08:36 -05007#include "sysemu/hostmem.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +01008#include "sysemu/blockdev.h"
Claudio Fontana940e43a2021-02-04 17:39:24 +01009#include "qemu/accel.h"
Markus Armbruster8ac25c82019-06-19 22:10:41 +020010#include "qapi/qapi-types-machine.h"
Markus Armbruster0b8fa322019-05-23 16:35:07 +020011#include "qemu/module.h"
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +020012#include "qom/object.h"
Markus Armbruster2e5b09f2019-07-09 17:20:52 +020013#include "hw/core/cpu.h"
Gerd Hoffmannb6b61142009-07-15 13:48:21 +020014
Paolo Bonzinidfabb8b2014-05-14 17:43:15 +080015#define TYPE_MACHINE_SUFFIX "-machine"
Eduardo Habkostc84a8f02015-08-20 14:54:27 -070016
17/* Machine class name that needs to be used for class-name-based machine
18 * type lookup to work.
19 */
20#define MACHINE_TYPE_NAME(machinename) (machinename TYPE_MACHINE_SUFFIX)
21
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +020022#define TYPE_MACHINE "machine"
Marcel Apfelbaumc8897e82014-03-18 17:26:35 +020023#undef MACHINE /* BSD defines it and QEMU does not use it */
Eduardo Habkosta489d192020-09-16 14:25:18 -040024OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +020025
Marcel Apfelbaum0056ae22014-03-05 19:30:47 +020026extern MachineState *current_machine;
27
Igor Mammedov482dfe92017-05-10 13:29:58 +020028void machine_run_board_init(MachineState *machine);
Marcel Apfelbaum5e97b622015-01-06 15:29:13 +020029bool machine_usb(MachineState *machine);
Marcel Apfelbaum6cabe7f2015-02-04 17:43:53 +020030int machine_phandle_start(MachineState *machine);
Marcel Apfelbaum47c8ca52015-02-04 17:43:54 +020031bool machine_dump_guest_core(MachineState *machine);
Marcel Apfelbaum75cc7f02015-02-04 17:43:55 +020032bool machine_mem_merge(MachineState *machine);
Igor Mammedovf2d672c2017-02-09 12:08:38 +010033HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
Igor Mammedov7c88e652017-05-10 13:29:50 +020034void machine_set_cpu_numa_node(MachineState *machine,
35 const CpuInstanceProperties *props,
36 Error **errp);
Philippe Mathieu-Daudé3e2f1492021-11-11 10:21:23 +010037void machine_parse_smp_config(MachineState *ms,
38 const SMPConfiguration *config, Error **errp);
Marcel Apfelbaum5e97b622015-01-06 15:29:13 +020039
Peter Maydell387c0e82021-03-25 15:33:07 +000040/**
41 * machine_class_allow_dynamic_sysbus_dev: Add type to list of valid devices
42 * @mc: Machine class
43 * @type: type to allow (should be a subtype of TYPE_SYS_BUS_DEVICE)
44 *
45 * Add the QOM type @type to the list of devices of which are subtypes
46 * of TYPE_SYS_BUS_DEVICE but which are still permitted to be dynamically
47 * created (eg by the user on the command line with -device).
48 * By default if the user tries to create any devices on the command line
49 * that are subtypes of TYPE_SYS_BUS_DEVICE they will get an error message;
50 * for the special cases which are permitted for this machine model, the
51 * machine model class init code must call this function to add them
52 * to the list of specifically permitted devices.
53 */
Eduardo Habkost0bd19092017-11-25 13:16:05 -020054void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
Peter Maydell387c0e82021-03-25 15:33:07 +000055
Peter Maydell0fb124d2021-03-25 15:33:08 +000056/**
Damien Heddeb5fdf412021-10-29 16:22:56 +020057 * device_type_is_dynamic_sysbus: Check if type is an allowed sysbus device
58 * type for the machine class.
59 * @mc: Machine class
60 * @type: type to check (should be a subtype of TYPE_SYS_BUS_DEVICE)
61 *
62 * Returns: true if @type is a type in the machine's list of
63 * dynamically pluggable sysbus devices; otherwise false.
64 *
65 * Check if the QOM type @type is in the list of allowed sysbus device
66 * types (see machine_class_allowed_dynamic_sysbus_dev()).
67 * Note that if @type has a parent type in the list, it is allowed too.
68 */
69bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type);
70
71/**
Peter Maydell0fb124d2021-03-25 15:33:08 +000072 * device_is_dynamic_sysbus: test whether device is a dynamic sysbus device
73 * @mc: Machine class
74 * @dev: device to check
75 *
76 * Returns: true if @dev is a sysbus device on the machine's list
77 * of dynamically pluggable sysbus devices; otherwise false.
78 *
79 * This function checks whether @dev is a valid dynamic sysbus device,
80 * by first confirming that it is a sysbus device and then checking it
81 * against the list of permitted dynamic sysbus devices which has been
82 * set up by the machine using machine_class_allow_dynamic_sysbus_dev().
83 *
84 * It is valid to call this with something that is not a subclass of
85 * TYPE_SYS_BUS_DEVICE; the function will return false in this case.
86 * This allows hotplug callback functions to be written as:
87 * if (device_is_dynamic_sysbus(mc, dev)) {
88 * handle dynamic sysbus case;
89 * } else if (some other kind of hotplug) {
90 * handle that;
91 * }
92 */
93bool device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev);
94
Igor Mammedov82b911a2020-02-19 11:08:38 -050095/*
96 * Checks that backend isn't used, preps it for exclusive usage and
97 * returns migratable MemoryRegion provided by backend.
98 */
99MemoryRegion *machine_consume_memdev(MachineState *machine,
100 HostMemoryBackend *backend);
Eduardo Habkost0bd19092017-11-25 13:16:05 -0200101
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200102/**
Igor Mammedov3811ef12016-03-03 15:28:56 +0100103 * CPUArchId:
104 * @arch_id - architecture-dependent CPU ID of present or possible CPU
105 * @cpu - pointer to corresponding CPU object if it's present on NULL otherwise
Igor Mammedovd342eb72018-01-10 16:22:50 +0100106 * @type - QOM class name of possible @cpu object
Igor Mammedovc67ae932017-02-09 12:08:34 +0100107 * @props - CPU object properties, initialized by board
Igor Mammedovf2d672c2017-02-09 12:08:38 +0100108 * #vcpus_count - number of threads provided by @cpu object
Igor Mammedov3811ef12016-03-03 15:28:56 +0100109 */
Markus Armbrustera44432b2019-08-12 07:23:53 +0200110typedef struct CPUArchId {
Igor Mammedov3811ef12016-03-03 15:28:56 +0100111 uint64_t arch_id;
Igor Mammedovf2d672c2017-02-09 12:08:38 +0100112 int64_t vcpus_count;
Igor Mammedovc67ae932017-02-09 12:08:34 +0100113 CpuInstanceProperties props;
Igor Mammedov8aba3842017-02-09 12:08:36 +0100114 Object *cpu;
Igor Mammedovd342eb72018-01-10 16:22:50 +0100115 const char *type;
Igor Mammedov3811ef12016-03-03 15:28:56 +0100116} CPUArchId;
117
118/**
119 * CPUArchIdList:
120 * @len - number of @CPUArchId items in @cpus array
121 * @cpus - array of present or possible CPUs for current machine configuration
122 */
123typedef struct {
124 int len;
Philippe Mathieu-Daudé880a7812020-03-04 16:38:16 +0100125 CPUArchId cpus[];
Igor Mammedov3811ef12016-03-03 15:28:56 +0100126} CPUArchIdList;
127
128/**
Yanan Wange4a97a82021-09-29 10:58:12 +0800129 * SMPCompatProps:
Yanan Wang2b526192021-09-29 10:58:14 +0800130 * @prefer_sockets - whether sockets are preferred over cores in smp parsing
Yanan Wange4a97a82021-09-29 10:58:12 +0800131 * @dies_supported - whether dies are supported by the machine
Yanan Wang864c3b52021-12-28 17:22:09 +0800132 * @clusters_supported - whether clusters are supported by the machine
Yanan Wange4a97a82021-09-29 10:58:12 +0800133 */
134typedef struct {
Yanan Wang2b526192021-09-29 10:58:14 +0800135 bool prefer_sockets;
Yanan Wange4a97a82021-09-29 10:58:12 +0800136 bool dies_supported;
Yanan Wang864c3b52021-12-28 17:22:09 +0800137 bool clusters_supported;
Yanan Wange4a97a82021-09-29 10:58:12 +0800138} SMPCompatProps;
139
140/**
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200141 * MachineClass:
Thomas Huth08fe6822018-06-25 11:05:12 +0200142 * @deprecation_reason: If set, the machine is marked as deprecated. The
143 * string should provide some clear information about what to use instead.
Emilio G. Cota72649612017-11-13 13:55:27 +0000144 * @max_cpus: maximum number of CPUs supported. Default: 1
145 * @min_cpus: minimum number of CPUs supported. Default: 1
146 * @default_cpus: number of CPUs instantiated if none are specified. Default: 1
Philippe Mathieu-Daudéea0ac7f2020-02-07 17:19:47 +0100147 * @is_default:
148 * If true QEMU will use this machine by default if no '-M' option is given.
Igor Mammedovb7454542014-06-02 15:25:03 +0200149 * @get_hotplug_handler: this function is called during bus-less
150 * device hotplug. If defined it returns pointer to an instance
151 * of HotplugHandler object, which handles hotplug operation
152 * for a given @dev. It may return NULL if @dev doesn't require
153 * any actions to be performed by hotplug handler.
Igor Mammedovea089ee2017-05-10 13:29:45 +0200154 * @cpu_index_to_instance_props:
155 * used to provide @cpu_index to socket/core/thread number mapping, allowing
156 * legacy code to perform maping from cpu_index to topology properties
157 * Returns: tuple of socket/core/thread ids given cpu_index belongs to.
Igor Mammedov57924bc2015-03-19 17:09:21 +0000158 * used to provide @cpu_index to socket number mapping, allowing
159 * a machine to group CPU threads belonging to the same socket/package
160 * Returns: socket number given cpu_index belongs to.
Eduardo Habkostfac862f2015-11-12 15:29:54 -0200161 * @hw_version:
162 * Value of QEMU_VERSION when the machine was added to QEMU.
163 * Set only by old machines because they need to keep
164 * compatibility on code that exposed QEMU_VERSION to guests in
165 * the past (and now use qemu_hw_version()).
Igor Mammedov3811ef12016-03-03 15:28:56 +0100166 * @possible_cpu_arch_ids:
167 * Returns an array of @CPUArchId architecture-dependent CPU IDs
168 * which includes CPU IDs for present and possible to hotplug CPUs.
169 * Caller is responsible for freeing returned list.
Igor Mammedov79e07932017-06-01 12:53:28 +0200170 * @get_default_cpu_node_id:
171 * returns default board specific node_id value for CPU slot specified by
172 * index @idx in @ms->possible_cpus[]
Igor Mammedovc5514d02017-02-10 11:20:57 +0100173 * @has_hotpluggable_cpus:
174 * If true, board supports CPUs creation with -device/device_add.
Igor Mammedov6063d4c2017-09-13 18:04:55 +0200175 * @default_cpu_type:
176 * specifies default CPU_TYPE, which will be used for parsing target
177 * specific features and for creating CPUs if CPU name wasn't provided
178 * explicitly at CLI
Peter Maydell20bccb82016-10-24 16:26:49 +0100179 * @minimum_page_bits:
180 * If non-zero, the board promises never to create a CPU with a page size
181 * smaller than this, so QEMU can use a more efficient larger page
182 * size than the target architecture's minimum. (Attempting to create
183 * such a CPU will fail.) Note that changing this is a migration
184 * compatibility break for the machine.
Peter Maydelled860122017-09-07 13:54:54 +0100185 * @ignore_memory_transaction_failures:
186 * If this is flag is true then the CPU will ignore memory transaction
187 * failures which should cause the CPU to take an exception due to an
188 * access to an unassigned physical address; the transaction will instead
189 * return zero (for a read) or be ignored (for a write). This should be
190 * set only by legacy board models which rely on the old RAZ/WI behaviour
191 * for handling devices that QEMU does not yet model. New board models
192 * should instead use "unimplemented-device" for all memory ranges where
193 * the guest will attempt to probe for a device that QEMU doesn't
194 * implement and a stub device is required.
Eric Augerdc0ca802019-03-04 11:13:33 +0100195 * @kvm_type:
196 * Return the type of KVM corresponding to the kvm-type string option or
197 * computed based on other criteria such as the host kernel capabilities.
Andrew Jones516fc0a2021-03-10 14:52:17 +0100198 * kvm-type may be NULL if it is not needed.
Igor Mammedovcd5ff832019-06-10 15:10:07 +0200199 * @numa_mem_supported:
200 * true if '--numa node.mem' option is supported and false otherwise
Peter Xud2321d32019-09-16 16:07:16 +0800201 * @hotplug_allowed:
202 * If the hook is provided, then it'll be called for each device
203 * hotplug to check whether the device hotplug is allowed. Return
204 * true to grant allowance or false to reject the hotplug. When
205 * false is returned, an error must be set to show the reason of
206 * the rejection. If the hook is not provided, all hotplug will be
207 * allowed.
Igor Mammedov900c0ba2020-02-19 11:08:37 -0500208 * @default_ram_id:
209 * Specifies inital RAM MemoryRegion name to be used for default backend
210 * creation if user explicitly hasn't specified backend with "memory-backend"
211 * property.
212 * It also will be used as a way to optin into "-m" option support.
213 * If it's not set by board, '-m' will be ignored and generic code will
214 * not create default RAM MemoryRegion.
Christian Borntraeger5c30ef92020-04-01 08:37:54 -0400215 * @fixup_ram_size:
216 * Amends user provided ram size (with -m option) using machine
217 * specific algorithm. To be used by old machine types for compat
218 * purposes only.
219 * Applies only to default memory backend, i.e., explicit memory backend
220 * wasn't used.
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200221 */
222struct MachineClass {
223 /*< private >*/
224 ObjectClass parent_class;
225 /*< public >*/
226
Laszlo Ersek2709f262014-09-22 22:38:35 +0200227 const char *family; /* NULL iff @name identifies a standalone machtype */
Marc-André Lureau8ea75372016-07-13 12:45:50 +0200228 char *name;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300229 const char *alias;
230 const char *desc;
Thomas Huth08fe6822018-06-25 11:05:12 +0200231 const char *deprecation_reason;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300232
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +0300233 void (*init)(MachineState *state);
Like Xua0628592019-05-19 04:54:20 +0800234 void (*reset)(MachineState *state);
Nicholas Piggin4b5e06c2019-07-22 15:32:13 +1000235 void (*wakeup)(MachineState *state);
Eric Augerdc0ca802019-03-04 11:13:33 +0100236 int (*kvm_type)(MachineState *machine, const char *arg);
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300237
238 BlockInterfaceType block_default_type;
John Snow16026512014-10-01 14:19:26 -0400239 int units_per_default_bus;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300240 int max_cpus;
Emilio G. Cota72649612017-11-13 13:55:27 +0000241 int min_cpus;
242 int default_cpus;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300243 unsigned int no_serial:1,
244 no_parallel:1,
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300245 no_floppy:1,
246 no_cdrom:1,
Alexander Graf33cd52b2014-07-01 16:14:41 +0200247 no_sdcard:1,
Gerd Hoffmannbab47d92016-04-07 09:12:58 -0500248 pci_allow_0_address:1,
249 legacy_fw_cfg_order:1;
Philippe Mathieu-Daudéea0ac7f2020-02-07 17:19:47 +0100250 bool is_default;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300251 const char *default_machine_opts;
252 const char *default_boot_order;
Gerd Hoffmann6f004942014-10-28 10:09:11 +0100253 const char *default_display;
Marc-André Lureaub66bbee2018-12-01 23:44:11 +0400254 GPtrArray *compat_props;
Marcel Apfelbaum00b4fbe2014-04-09 20:34:50 +0300255 const char *hw_version;
Nikunj A Dadhania076b35b2015-05-07 15:33:57 +1000256 ram_addr_t default_ram_size;
Igor Mammedov6063d4c2017-09-13 18:04:55 +0200257 const char *default_cpu_type;
Peter Xub2fc91d2018-12-20 13:40:35 +0800258 bool default_kernel_irqchip_split;
Eduardo Habkost71ae9e92015-12-01 20:58:08 -0200259 bool option_rom_has_mr;
260 bool rom_file_has_mr;
Peter Maydell20bccb82016-10-24 16:26:49 +0100261 int minimum_page_bits;
Igor Mammedovc5514d02017-02-10 11:20:57 +0100262 bool has_hotpluggable_cpus;
Peter Maydelled860122017-09-07 13:54:54 +0100263 bool ignore_memory_transaction_failures;
Laurent Vivier55641212017-03-21 11:25:42 +0100264 int numa_mem_align_shift;
Alistair Francisc9cf6362017-10-03 13:05:09 -0700265 const char **valid_cpu_types;
Eduardo Habkost0bd19092017-11-25 13:16:05 -0200266 strList *allowed_dynamic_sysbus_devices;
Dou Liyang7b8be492017-11-14 10:34:01 +0800267 bool auto_enable_numa_with_memhp;
David Hildenbrand195784a2020-06-26 09:22:48 +0200268 bool auto_enable_numa_with_memdev;
Mark Cave-Ayland907aac22018-08-10 13:40:27 +0100269 bool ignore_boot_device_suffixes;
Corey Minyard7fccf2a2018-11-14 14:41:01 -0600270 bool smbus_no_migration_support;
Eric Augerf6a0d062019-03-08 19:20:53 +0100271 bool nvdimm_supported;
Igor Mammedovcd5ff832019-06-10 15:10:07 +0200272 bool numa_mem_supported;
Tao Xu0533ef52019-09-05 16:32:38 +0800273 bool auto_enable_numa;
Yanan Wange4a97a82021-09-29 10:58:12 +0800274 SMPCompatProps smp_props;
Igor Mammedov900c0ba2020-02-19 11:08:37 -0500275 const char *default_ram_id;
Igor Mammedovb7454542014-06-02 15:25:03 +0200276
277 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
278 DeviceState *dev);
Peter Xud2321d32019-09-16 16:07:16 +0800279 bool (*hotplug_allowed)(MachineState *state, DeviceState *dev,
280 Error **errp);
Igor Mammedovea089ee2017-05-10 13:29:45 +0200281 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
282 unsigned cpu_index);
Igor Mammedov80e5db32017-01-18 18:13:20 +0100283 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
Igor Mammedov79e07932017-06-01 12:53:28 +0200284 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
Christian Borntraeger5c30ef92020-04-01 08:37:54 -0400285 ram_addr_t (*fixup_ram_size)(ram_addr_t size);
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200286};
287
288/**
David Hildenbrande017da32018-04-23 18:51:23 +0200289 * DeviceMemoryState:
David Hildenbrandb0c14ec2018-04-23 18:51:17 +0200290 * @base: address in guest physical address space where the memory
291 * address space for memory devices starts
292 * @mr: address space container for memory devices
293 */
David Hildenbrande017da32018-04-23 18:51:23 +0200294typedef struct DeviceMemoryState {
David Hildenbrandb0c14ec2018-04-23 18:51:17 +0200295 hwaddr base;
296 MemoryRegion mr;
David Hildenbrande017da32018-04-23 18:51:23 +0200297} DeviceMemoryState;
David Hildenbrandb0c14ec2018-04-23 18:51:17 +0200298
299/**
Like Xuedeeec92019-05-19 04:54:19 +0800300 * CpuTopology:
301 * @cpus: the number of present logical processors on the machine
Babu Moger8cb30e32020-03-11 17:53:06 -0500302 * @sockets: the number of sockets on the machine
Yanan Wang003f2302021-09-29 10:58:11 +0800303 * @dies: the number of dies in one socket
Yanan Wang864c3b52021-12-28 17:22:09 +0800304 * @clusters: the number of clusters in one die
305 * @cores: the number of cores in one cluster
Yanan Wang003f2302021-09-29 10:58:11 +0800306 * @threads: the number of threads in one core
Like Xuedeeec92019-05-19 04:54:19 +0800307 * @max_cpus: the maximum number of logical processors on the machine
308 */
309typedef struct CpuTopology {
310 unsigned int cpus;
Yanan Wang003f2302021-09-29 10:58:11 +0800311 unsigned int sockets;
Paolo Bonzini67872eb2021-06-17 17:53:03 +0200312 unsigned int dies;
Yanan Wang864c3b52021-12-28 17:22:09 +0800313 unsigned int clusters;
Like Xuedeeec92019-05-19 04:54:19 +0800314 unsigned int cores;
315 unsigned int threads;
Like Xuedeeec92019-05-19 04:54:19 +0800316 unsigned int max_cpus;
317} CpuTopology;
318
319/**
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200320 * MachineState:
321 */
322struct MachineState {
323 /*< private >*/
324 Object parent_obj;
Alexander Graf33cd52b2014-07-01 16:14:41 +0200325
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200326 /*< public >*/
327
Alex Bennéea6487d32021-03-03 17:36:36 +0000328 void *fdt;
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200329 char *dtb;
330 char *dumpdtb;
331 int phandle_start;
332 char *dt_compatible;
333 bool dump_guest_core;
334 bool mem_merge;
335 bool usb;
Paolo Bonzinic6e76502015-03-23 18:05:28 +0100336 bool usb_disabled;
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200337 char *firmware;
Le Tana52a7fd2014-08-16 13:55:40 +0800338 bool iommu;
Alexander Graf9850c602015-02-23 13:56:42 +0100339 bool suppress_vmdesc;
Eduardo Habkostcfc58cf2016-04-19 16:55:25 -0300340 bool enable_graphics;
David Gibsone0292d72020-12-04 12:51:51 +1100341 ConfidentialGuestSupport *cgs;
Igor Mammedovaa8b1832020-02-19 11:08:36 -0500342 char *ram_memdev_id;
Igor Mammedov82b911a2020-02-19 11:08:38 -0500343 /*
344 * convenience alias to ram_memdev_id backend memory region
345 * or to numa container memory region
346 */
347 MemoryRegion *ram;
David Hildenbrande017da32018-04-23 18:51:23 +0200348 DeviceMemoryState *device_memory;
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200349
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +0300350 ram_addr_t ram_size;
Igor Mammedovc270fb92014-06-02 15:25:02 +0200351 ram_addr_t maxram_size;
352 uint64_t ram_slots;
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +0300353 const char *boot_order;
Paolo Bonzini4b7acd22020-11-13 02:41:38 -0500354 const char *boot_once;
Marcel Apfelbaum6b1b1442014-05-26 15:40:58 +0300355 char *kernel_filename;
356 char *kernel_cmdline;
357 char *initrd_filename;
Igor Mammedov6063d4c2017-09-13 18:04:55 +0200358 const char *cpu_type;
Eduardo Habkostac2da552014-09-26 17:45:31 -0300359 AccelState *accelerator;
Igor Mammedov38690a12017-02-09 12:08:32 +0100360 CPUArchIdList *possible_cpus;
Like Xuedeeec92019-05-19 04:54:19 +0800361 CpuTopology smp;
Eric Augerf6a0d062019-03-08 19:20:53 +0100362 struct NVDIMMState *nvdimms_state;
Tao Xuaa570202019-08-09 14:57:22 +0800363 struct NumaState *numa_state;
Marcel Apfelbaum36d20cb2014-03-05 19:30:45 +0200364};
365
Eduardo Habkosted0b6de2015-09-04 15:37:06 -0300366#define DEFINE_MACHINE(namestr, machine_initfn) \
367 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
368 { \
369 MachineClass *mc = MACHINE_CLASS(oc); \
370 machine_initfn(mc); \
371 } \
372 static const TypeInfo machine_initfn##_typeinfo = { \
373 .name = MACHINE_TYPE_NAME(namestr), \
374 .parent = TYPE_MACHINE, \
375 .class_init = machine_initfn##_class_init, \
376 }; \
377 static void machine_initfn##_register_types(void) \
378 { \
379 type_register_static(&machine_initfn##_typeinfo); \
380 } \
Eduardo Habkost0e6aac82016-02-16 18:59:04 -0200381 type_init(machine_initfn##_register_types)
Eduardo Habkosted0b6de2015-09-04 15:37:06 -0300382
Cornelia Huck0ca70362022-03-16 15:55:21 +0100383extern GlobalProperty hw_compat_7_0[];
384extern const size_t hw_compat_7_0_len;
385
Cornelia Huck01854af2021-12-17 15:39:48 +0100386extern GlobalProperty hw_compat_6_2[];
387extern const size_t hw_compat_6_2_len;
388
Yanan Wang52e64f52021-08-31 09:54:26 +0800389extern GlobalProperty hw_compat_6_1[];
390extern const size_t hw_compat_6_1_len;
391
Cornelia Huckda7e13c2021-03-31 13:19:00 +0200392extern GlobalProperty hw_compat_6_0[];
393extern const size_t hw_compat_6_0_len;
394
Cornelia Huck576a00b2020-11-09 18:39:28 +0100395extern GlobalProperty hw_compat_5_2[];
396extern const size_t hw_compat_5_2_len;
397
Cornelia Huck3ff3c5d2020-08-19 16:40:16 +0200398extern GlobalProperty hw_compat_5_1[];
399extern const size_t hw_compat_5_1_len;
400
Cornelia Huck541aaa12020-04-29 16:46:05 +0200401extern GlobalProperty hw_compat_5_0[];
402extern const size_t hw_compat_5_0_len;
403
Evgeny Yakovlev5f258572019-11-05 21:22:17 +0300404extern GlobalProperty hw_compat_4_2[];
405extern const size_t hw_compat_4_2_len;
406
Cornelia Huck9aec2e52019-07-24 12:35:24 +0200407extern GlobalProperty hw_compat_4_1[];
408extern const size_t hw_compat_4_1_len;
409
Cornelia Huck9bf26502019-04-11 12:20:25 +0200410extern GlobalProperty hw_compat_4_0[];
411extern const size_t hw_compat_4_0_len;
412
Marc-André Lureauabd93cc2018-12-12 19:36:30 +0400413extern GlobalProperty hw_compat_3_1[];
414extern const size_t hw_compat_3_1_len;
415
Marc-André Lureauddb32352018-12-12 19:36:30 +0400416extern GlobalProperty hw_compat_3_0[];
417extern const size_t hw_compat_3_0_len;
418
Marc-André Lureau0d473102018-12-12 19:36:30 +0400419extern GlobalProperty hw_compat_2_12[];
420extern const size_t hw_compat_2_12_len;
421
Marc-André Lureau43df70a2018-12-12 19:36:30 +0400422extern GlobalProperty hw_compat_2_11[];
423extern const size_t hw_compat_2_11_len;
424
Marc-André Lureau503224f2018-12-12 19:36:30 +0400425extern GlobalProperty hw_compat_2_10[];
426extern const size_t hw_compat_2_10_len;
427
Marc-André Lureau3e803152018-12-12 19:36:30 +0400428extern GlobalProperty hw_compat_2_9[];
429extern const size_t hw_compat_2_9_len;
430
Marc-André Lureauedc24cc2018-12-12 19:36:30 +0400431extern GlobalProperty hw_compat_2_8[];
432extern const size_t hw_compat_2_8_len;
433
Marc-André Lureau5a995062018-12-12 19:36:30 +0400434extern GlobalProperty hw_compat_2_7[];
435extern const size_t hw_compat_2_7_len;
436
Marc-André Lureauff8f2612018-12-12 19:36:30 +0400437extern GlobalProperty hw_compat_2_6[];
438extern const size_t hw_compat_2_6_len;
439
Marc-André Lureaufe759612018-12-12 19:36:30 +0400440extern GlobalProperty hw_compat_2_5[];
441extern const size_t hw_compat_2_5_len;
442
Marc-André Lureau2f99b9c2018-12-12 19:36:30 +0400443extern GlobalProperty hw_compat_2_4[];
444extern const size_t hw_compat_2_4_len;
445
Marc-André Lureau8995dd92018-12-12 19:36:30 +0400446extern GlobalProperty hw_compat_2_3[];
447extern const size_t hw_compat_2_3_len;
448
Marc-André Lureau1c300442018-12-12 19:36:30 +0400449extern GlobalProperty hw_compat_2_2[];
450extern const size_t hw_compat_2_2_len;
451
Marc-André Lureauc4fc5692018-12-12 19:36:30 +0400452extern GlobalProperty hw_compat_2_1[];
453extern const size_t hw_compat_2_1_len;
454
pbrook87ecb682007-11-17 17:14:51 +0000455#endif