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