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 "sysemu/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
38void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
39
40
41
42
43MemoryRegion *machine_consume_memdev(MachineState *machine,
44 HostMemoryBackend *backend);
45
46
47
48
49
50
51
52
53
54typedef struct CPUArchId {
55 uint64_t arch_id;
56 int64_t vcpus_count;
57 CpuInstanceProperties props;
58 Object *cpu;
59 const char *type;
60} CPUArchId;
61
62
63
64
65
66
67typedef struct {
68 int len;
69 CPUArchId cpus[];
70} CPUArchIdList;
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
157struct MachineClass {
158
159 ObjectClass parent_class;
160
161
162 const char *family;
163 char *name;
164 const char *alias;
165 const char *desc;
166 const char *deprecation_reason;
167
168 void (*init)(MachineState *state);
169 void (*reset)(MachineState *state);
170 void (*wakeup)(MachineState *state);
171 int (*kvm_type)(MachineState *machine, const char *arg);
172 void (*smp_parse)(MachineState *ms, QemuOpts *opts);
173
174 BlockInterfaceType block_default_type;
175 int units_per_default_bus;
176 int max_cpus;
177 int min_cpus;
178 int default_cpus;
179 unsigned int no_serial:1,
180 no_parallel:1,
181 no_floppy:1,
182 no_cdrom:1,
183 no_sdcard:1,
184 pci_allow_0_address:1,
185 legacy_fw_cfg_order:1;
186 bool is_default;
187 const char *default_machine_opts;
188 const char *default_boot_order;
189 const char *default_display;
190 GPtrArray *compat_props;
191 const char *hw_version;
192 ram_addr_t default_ram_size;
193 const char *default_cpu_type;
194 bool default_kernel_irqchip_split;
195 bool option_rom_has_mr;
196 bool rom_file_has_mr;
197 int minimum_page_bits;
198 bool has_hotpluggable_cpus;
199 bool ignore_memory_transaction_failures;
200 int numa_mem_align_shift;
201 const char **valid_cpu_types;
202 strList *allowed_dynamic_sysbus_devices;
203 bool auto_enable_numa_with_memhp;
204 bool auto_enable_numa_with_memdev;
205 bool ignore_boot_device_suffixes;
206 bool smbus_no_migration_support;
207 bool nvdimm_supported;
208 bool numa_mem_supported;
209 bool auto_enable_numa;
210 const char *default_ram_id;
211
212 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
213 DeviceState *dev);
214 bool (*hotplug_allowed)(MachineState *state, DeviceState *dev,
215 Error **errp);
216 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
217 unsigned cpu_index);
218 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
219 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
220 ram_addr_t (*fixup_ram_size)(ram_addr_t size);
221};
222
223
224
225
226
227
228
229typedef struct DeviceMemoryState {
230 hwaddr base;
231 MemoryRegion mr;
232} DeviceMemoryState;
233
234
235
236
237
238
239
240
241
242typedef struct CpuTopology {
243 unsigned int cpus;
244 unsigned int cores;
245 unsigned int threads;
246 unsigned int sockets;
247 unsigned int max_cpus;
248} CpuTopology;
249
250
251
252
253struct MachineState {
254
255 Object parent_obj;
256 Notifier sysbus_notifier;
257
258
259
260 char *dtb;
261 char *dumpdtb;
262 int phandle_start;
263 char *dt_compatible;
264 bool dump_guest_core;
265 bool mem_merge;
266 bool usb;
267 bool usb_disabled;
268 char *firmware;
269 bool iommu;
270 bool suppress_vmdesc;
271 bool enable_graphics;
272 char *memory_encryption;
273 char *ram_memdev_id;
274
275
276
277
278 MemoryRegion *ram;
279 DeviceMemoryState *device_memory;
280
281 ram_addr_t ram_size;
282 ram_addr_t maxram_size;
283 uint64_t ram_slots;
284 const char *boot_order;
285 char *kernel_filename;
286 char *kernel_cmdline;
287 char *initrd_filename;
288 const char *cpu_type;
289 AccelState *accelerator;
290 CPUArchIdList *possible_cpus;
291 CpuTopology smp;
292 struct NVDIMMState *nvdimms_state;
293 struct NumaState *numa_state;
294};
295
296#define DEFINE_MACHINE(namestr, machine_initfn) \
297 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
298 { \
299 MachineClass *mc = MACHINE_CLASS(oc); \
300 machine_initfn(mc); \
301 } \
302 static const TypeInfo machine_initfn##_typeinfo = { \
303 .name = MACHINE_TYPE_NAME(namestr), \
304 .parent = TYPE_MACHINE, \
305 .class_init = machine_initfn##_class_init, \
306 }; \
307 static void machine_initfn##_register_types(void) \
308 { \
309 type_register_static(&machine_initfn##_typeinfo); \
310 } \
311 type_init(machine_initfn##_register_types)
312
313extern GlobalProperty hw_compat_5_1[];
314extern const size_t hw_compat_5_1_len;
315
316extern GlobalProperty hw_compat_5_0[];
317extern const size_t hw_compat_5_0_len;
318
319extern GlobalProperty hw_compat_4_2[];
320extern const size_t hw_compat_4_2_len;
321
322extern GlobalProperty hw_compat_4_1[];
323extern const size_t hw_compat_4_1_len;
324
325extern GlobalProperty hw_compat_4_0[];
326extern const size_t hw_compat_4_0_len;
327
328extern GlobalProperty hw_compat_3_1[];
329extern const size_t hw_compat_3_1_len;
330
331extern GlobalProperty hw_compat_3_0[];
332extern const size_t hw_compat_3_0_len;
333
334extern GlobalProperty hw_compat_2_12[];
335extern const size_t hw_compat_2_12_len;
336
337extern GlobalProperty hw_compat_2_11[];
338extern const size_t hw_compat_2_11_len;
339
340extern GlobalProperty hw_compat_2_10[];
341extern const size_t hw_compat_2_10_len;
342
343extern GlobalProperty hw_compat_2_9[];
344extern const size_t hw_compat_2_9_len;
345
346extern GlobalProperty hw_compat_2_8[];
347extern const size_t hw_compat_2_8_len;
348
349extern GlobalProperty hw_compat_2_7[];
350extern const size_t hw_compat_2_7_len;
351
352extern GlobalProperty hw_compat_2_6[];
353extern const size_t hw_compat_2_6_len;
354
355extern GlobalProperty hw_compat_2_5[];
356extern const size_t hw_compat_2_5_len;
357
358extern GlobalProperty hw_compat_2_4[];
359extern const size_t hw_compat_2_4_len;
360
361extern GlobalProperty hw_compat_2_3[];
362extern const size_t hw_compat_2_3_len;
363
364extern GlobalProperty hw_compat_2_2[];
365extern const size_t hw_compat_2_2_len;
366
367extern GlobalProperty hw_compat_2_1[];
368extern const size_t hw_compat_2_1_len;
369
370#endif
371