1
2
3#ifndef HW_BOARDS_H
4#define HW_BOARDS_H
5
6#include "exec/memory.h"
7#include "sysemu/hostmem.h"
8#include "sysemu/blockdev.h"
9#include "qemu/accel.h"
10#include "qapi/qapi-types-machine.h"
11#include "qemu/module.h"
12#include "qom/object.h"
13#include "hw/core/cpu.h"
14
15#define TYPE_MACHINE_SUFFIX "-machine"
16
17
18
19
20#define MACHINE_TYPE_NAME(machinename) (machinename TYPE_MACHINE_SUFFIX)
21
22#define TYPE_MACHINE "machine"
23#undef MACHINE
24OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)
25
26extern MachineState *current_machine;
27
28void machine_run_board_init(MachineState *machine);
29bool machine_smp_parse(MachineState *ms, QemuOpts *opts, Error **errp);
30bool machine_usb(MachineState *machine);
31int machine_phandle_start(MachineState *machine);
32bool machine_dump_guest_core(MachineState *machine);
33bool machine_mem_merge(MachineState *machine);
34HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
35void machine_set_cpu_numa_node(MachineState *machine,
36 const CpuInstanceProperties *props,
37 Error **errp);
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77bool device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev);
78
79
80
81
82
83MemoryRegion *machine_consume_memdev(MachineState *machine,
84 HostMemoryBackend *backend);
85
86
87
88
89
90
91
92
93
94typedef struct CPUArchId {
95 uint64_t arch_id;
96 int64_t vcpus_count;
97 CpuInstanceProperties props;
98 Object *cpu;
99 const char *type;
100} CPUArchId;
101
102
103
104
105
106
107typedef struct {
108 int len;
109 CPUArchId cpus[];
110} CPUArchIdList;
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198struct MachineClass {
199
200 ObjectClass parent_class;
201
202
203 const char *family;
204 char *name;
205 const char *alias;
206 const char *desc;
207 const char *deprecation_reason;
208
209 void (*init)(MachineState *state);
210 void (*reset)(MachineState *state);
211 void (*wakeup)(MachineState *state);
212 int (*kvm_type)(MachineState *machine, const char *arg);
213 void (*smp_parse)(MachineState *ms, QemuOpts *opts);
214
215 BlockInterfaceType block_default_type;
216 int units_per_default_bus;
217 int max_cpus;
218 int min_cpus;
219 int default_cpus;
220 unsigned int no_serial:1,
221 no_parallel:1,
222 no_floppy:1,
223 no_cdrom:1,
224 no_sdcard:1,
225 pci_allow_0_address:1,
226 legacy_fw_cfg_order:1;
227 bool is_default;
228 const char *default_machine_opts;
229 const char *default_boot_order;
230 const char *default_display;
231 GPtrArray *compat_props;
232 const char *hw_version;
233 ram_addr_t default_ram_size;
234 const char *default_cpu_type;
235 bool default_kernel_irqchip_split;
236 bool option_rom_has_mr;
237 bool rom_file_has_mr;
238 int minimum_page_bits;
239 bool has_hotpluggable_cpus;
240 bool ignore_memory_transaction_failures;
241 int numa_mem_align_shift;
242 const char **valid_cpu_types;
243 strList *allowed_dynamic_sysbus_devices;
244 bool auto_enable_numa_with_memhp;
245 bool auto_enable_numa_with_memdev;
246 bool ignore_boot_device_suffixes;
247 bool smbus_no_migration_support;
248 bool nvdimm_supported;
249 bool numa_mem_supported;
250 bool auto_enable_numa;
251 const char *default_ram_id;
252
253 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
254 DeviceState *dev);
255 bool (*hotplug_allowed)(MachineState *state, DeviceState *dev,
256 Error **errp);
257 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
258 unsigned cpu_index);
259 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
260 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
261 ram_addr_t (*fixup_ram_size)(ram_addr_t size);
262};
263
264
265
266
267
268
269
270typedef struct DeviceMemoryState {
271 hwaddr base;
272 MemoryRegion mr;
273} DeviceMemoryState;
274
275
276
277
278
279
280
281
282
283typedef struct CpuTopology {
284 unsigned int cpus;
285 unsigned int cores;
286 unsigned int threads;
287 unsigned int sockets;
288 unsigned int max_cpus;
289} CpuTopology;
290
291
292
293
294struct MachineState {
295
296 Object parent_obj;
297 Notifier sysbus_notifier;
298
299
300
301 void *fdt;
302 char *dtb;
303 char *dumpdtb;
304 int phandle_start;
305 char *dt_compatible;
306 bool dump_guest_core;
307 bool mem_merge;
308 bool usb;
309 bool usb_disabled;
310 char *firmware;
311 bool iommu;
312 bool suppress_vmdesc;
313 bool enable_graphics;
314 ConfidentialGuestSupport *cgs;
315 char *ram_memdev_id;
316
317
318
319
320 MemoryRegion *ram;
321 DeviceMemoryState *device_memory;
322
323 ram_addr_t ram_size;
324 ram_addr_t maxram_size;
325 uint64_t ram_slots;
326 const char *boot_order;
327 const char *boot_once;
328 char *kernel_filename;
329 char *kernel_cmdline;
330 char *initrd_filename;
331 const char *cpu_type;
332 AccelState *accelerator;
333 CPUArchIdList *possible_cpus;
334 CpuTopology smp;
335 struct NVDIMMState *nvdimms_state;
336 struct NumaState *numa_state;
337};
338
339#define DEFINE_MACHINE(namestr, machine_initfn) \
340 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
341 { \
342 MachineClass *mc = MACHINE_CLASS(oc); \
343 machine_initfn(mc); \
344 } \
345 static const TypeInfo machine_initfn##_typeinfo = { \
346 .name = MACHINE_TYPE_NAME(namestr), \
347 .parent = TYPE_MACHINE, \
348 .class_init = machine_initfn##_class_init, \
349 }; \
350 static void machine_initfn##_register_types(void) \
351 { \
352 type_register_static(&machine_initfn##_typeinfo); \
353 } \
354 type_init(machine_initfn##_register_types)
355
356extern GlobalProperty hw_compat_5_2[];
357extern const size_t hw_compat_5_2_len;
358
359extern GlobalProperty hw_compat_5_1[];
360extern const size_t hw_compat_5_1_len;
361
362extern GlobalProperty hw_compat_5_0[];
363extern const size_t hw_compat_5_0_len;
364
365extern GlobalProperty hw_compat_4_2[];
366extern const size_t hw_compat_4_2_len;
367
368extern GlobalProperty hw_compat_4_1[];
369extern const size_t hw_compat_4_1_len;
370
371extern GlobalProperty hw_compat_4_0[];
372extern const size_t hw_compat_4_0_len;
373
374extern GlobalProperty hw_compat_3_1[];
375extern const size_t hw_compat_3_1_len;
376
377extern GlobalProperty hw_compat_3_0[];
378extern const size_t hw_compat_3_0_len;
379
380extern GlobalProperty hw_compat_2_12[];
381extern const size_t hw_compat_2_12_len;
382
383extern GlobalProperty hw_compat_2_11[];
384extern const size_t hw_compat_2_11_len;
385
386extern GlobalProperty hw_compat_2_10[];
387extern const size_t hw_compat_2_10_len;
388
389extern GlobalProperty hw_compat_2_9[];
390extern const size_t hw_compat_2_9_len;
391
392extern GlobalProperty hw_compat_2_8[];
393extern const size_t hw_compat_2_8_len;
394
395extern GlobalProperty hw_compat_2_7[];
396extern const size_t hw_compat_2_7_len;
397
398extern GlobalProperty hw_compat_2_6[];
399extern const size_t hw_compat_2_6_len;
400
401extern GlobalProperty hw_compat_2_5[];
402extern const size_t hw_compat_2_5_len;
403
404extern GlobalProperty hw_compat_2_4[];
405extern const size_t hw_compat_2_4_len;
406
407extern GlobalProperty hw_compat_2_3[];
408extern const size_t hw_compat_2_3_len;
409
410extern GlobalProperty hw_compat_2_2[];
411extern const size_t hw_compat_2_2_len;
412
413extern GlobalProperty hw_compat_2_1[];
414extern const size_t hw_compat_2_1_len;
415
416#endif
417