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_usb(MachineState *machine);
30int machine_phandle_start(MachineState *machine);
31bool machine_dump_guest_core(MachineState *machine);
32bool machine_mem_merge(MachineState *machine);
33HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
34void machine_set_cpu_numa_node(MachineState *machine,
35 const CpuInstanceProperties *props,
36 Error **errp);
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76bool device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev);
77
78
79
80
81
82MemoryRegion *machine_consume_memdev(MachineState *machine,
83 HostMemoryBackend *backend);
84
85
86
87
88
89
90
91
92
93typedef struct CPUArchId {
94 uint64_t arch_id;
95 int64_t vcpus_count;
96 CpuInstanceProperties props;
97 Object *cpu;
98 const char *type;
99} CPUArchId;
100
101
102
103
104
105
106typedef struct {
107 int len;
108 CPUArchId cpus[];
109} CPUArchIdList;
110
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
197struct MachineClass {
198
199 ObjectClass parent_class;
200
201
202 const char *family;
203 char *name;
204 const char *alias;
205 const char *desc;
206 const char *deprecation_reason;
207
208 void (*init)(MachineState *state);
209 void (*reset)(MachineState *state);
210 void (*wakeup)(MachineState *state);
211 int (*kvm_type)(MachineState *machine, const char *arg);
212 void (*smp_parse)(MachineState *ms, SMPConfiguration *config, Error **errp);
213
214 BlockInterfaceType block_default_type;
215 int units_per_default_bus;
216 int max_cpus;
217 int min_cpus;
218 int default_cpus;
219 unsigned int no_serial:1,
220 no_parallel:1,
221 no_floppy:1,
222 no_cdrom:1,
223 no_sdcard:1,
224 pci_allow_0_address:1,
225 legacy_fw_cfg_order:1;
226 bool is_default;
227 const char *default_machine_opts;
228 const char *default_boot_order;
229 const char *default_display;
230 GPtrArray *compat_props;
231 const char *hw_version;
232 ram_addr_t default_ram_size;
233 const char *default_cpu_type;
234 bool default_kernel_irqchip_split;
235 bool option_rom_has_mr;
236 bool rom_file_has_mr;
237 int minimum_page_bits;
238 bool has_hotpluggable_cpus;
239 bool ignore_memory_transaction_failures;
240 int numa_mem_align_shift;
241 const char **valid_cpu_types;
242 strList *allowed_dynamic_sysbus_devices;
243 bool auto_enable_numa_with_memhp;
244 bool auto_enable_numa_with_memdev;
245 bool ignore_boot_device_suffixes;
246 bool smbus_no_migration_support;
247 bool nvdimm_supported;
248 bool numa_mem_supported;
249 bool auto_enable_numa;
250 const char *default_ram_id;
251
252 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
253 DeviceState *dev);
254 bool (*hotplug_allowed)(MachineState *state, DeviceState *dev,
255 Error **errp);
256 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
257 unsigned cpu_index);
258 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
259 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
260 ram_addr_t (*fixup_ram_size)(ram_addr_t size);
261};
262
263
264
265
266
267
268
269typedef struct DeviceMemoryState {
270 hwaddr base;
271 MemoryRegion mr;
272} DeviceMemoryState;
273
274
275
276
277
278
279
280
281
282typedef struct CpuTopology {
283 unsigned int cpus;
284 unsigned int dies;
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_6_0[];
357extern const size_t hw_compat_6_0_len;
358
359extern GlobalProperty hw_compat_5_2[];
360extern const size_t hw_compat_5_2_len;
361
362extern GlobalProperty hw_compat_5_1[];
363extern const size_t hw_compat_5_1_len;
364
365extern GlobalProperty hw_compat_5_0[];
366extern const size_t hw_compat_5_0_len;
367
368extern GlobalProperty hw_compat_4_2[];
369extern const size_t hw_compat_4_2_len;
370
371extern GlobalProperty hw_compat_4_1[];
372extern const size_t hw_compat_4_1_len;
373
374extern GlobalProperty hw_compat_4_0[];
375extern const size_t hw_compat_4_0_len;
376
377extern GlobalProperty hw_compat_3_1[];
378extern const size_t hw_compat_3_1_len;
379
380extern GlobalProperty hw_compat_3_0[];
381extern const size_t hw_compat_3_0_len;
382
383extern GlobalProperty hw_compat_2_12[];
384extern const size_t hw_compat_2_12_len;
385
386extern GlobalProperty hw_compat_2_11[];
387extern const size_t hw_compat_2_11_len;
388
389extern GlobalProperty hw_compat_2_10[];
390extern const size_t hw_compat_2_10_len;
391
392extern GlobalProperty hw_compat_2_9[];
393extern const size_t hw_compat_2_9_len;
394
395extern GlobalProperty hw_compat_2_8[];
396extern const size_t hw_compat_2_8_len;
397
398extern GlobalProperty hw_compat_2_7[];
399extern const size_t hw_compat_2_7_len;
400
401extern GlobalProperty hw_compat_2_6[];
402extern const size_t hw_compat_2_6_len;
403
404extern GlobalProperty hw_compat_2_5[];
405extern const size_t hw_compat_2_5_len;
406
407extern GlobalProperty hw_compat_2_4[];
408extern const size_t hw_compat_2_4_len;
409
410extern GlobalProperty hw_compat_2_3[];
411extern const size_t hw_compat_2_3_len;
412
413extern GlobalProperty hw_compat_2_2[];
414extern const size_t hw_compat_2_2_len;
415
416extern GlobalProperty hw_compat_2_1[];
417extern const size_t hw_compat_2_1_len;
418
419#endif
420