1
2
3#ifndef HW_BOARDS_H
4#define HW_BOARDS_H
5
6#include "sysemu/blockdev.h"
7#include "sysemu/accel.h"
8#include "hw/qdev.h"
9#include "qapi/qapi-types-machine.h"
10#include "qemu/module.h"
11#include "qom/object.h"
12#include "qom/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 {
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
170struct MachineClass {
171
172 ObjectClass parent_class;
173
174
175 const char *family;
176 char *name;
177 const char *alias;
178 const char *desc;
179 const char *deprecation_reason;
180
181 void (*init)(MachineState *state);
182 void (*reset)(MachineState *state);
183 void (*hot_add_cpu)(MachineState *state, const int64_t id, Error **errp);
184 int (*kvm_type)(MachineState *machine, const char *arg);
185 void (*smp_parse)(MachineState *ms, QemuOpts *opts);
186
187 BlockInterfaceType block_default_type;
188 int units_per_default_bus;
189 int max_cpus;
190 int min_cpus;
191 int default_cpus;
192 unsigned int no_serial:1,
193 no_parallel:1,
194 no_floppy:1,
195 no_cdrom:1,
196 no_sdcard:1,
197 pci_allow_0_address:1,
198 legacy_fw_cfg_order:1;
199 int is_default;
200 const char *default_machine_opts;
201 const char *default_boot_order;
202 const char *default_display;
203 GPtrArray *compat_props;
204 const char *hw_version;
205 ram_addr_t default_ram_size;
206 const char *default_cpu_type;
207 bool default_kernel_irqchip_split;
208 bool option_rom_has_mr;
209 bool rom_file_has_mr;
210 int minimum_page_bits;
211 bool has_hotpluggable_cpus;
212 bool ignore_memory_transaction_failures;
213 int numa_mem_align_shift;
214 const char **valid_cpu_types;
215 strList *allowed_dynamic_sysbus_devices;
216 bool auto_enable_numa_with_memhp;
217 void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
218 int nb_nodes, ram_addr_t size);
219 bool ignore_boot_device_suffixes;
220 bool smbus_no_migration_support;
221 bool nvdimm_supported;
222 bool numa_mem_supported;
223
224 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
225 DeviceState *dev);
226 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
227 unsigned cpu_index);
228 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
229 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
230};
231
232
233
234
235
236
237
238typedef struct DeviceMemoryState {
239 hwaddr base;
240 MemoryRegion mr;
241} DeviceMemoryState;
242
243
244
245
246
247
248
249
250typedef struct CpuTopology {
251 unsigned int cpus;
252 unsigned int cores;
253 unsigned int threads;
254 unsigned int max_cpus;
255} CpuTopology;
256
257
258
259
260struct MachineState {
261
262 Object parent_obj;
263 Notifier sysbus_notifier;
264
265
266
267 char *accel;
268 bool kernel_irqchip_allowed;
269 bool kernel_irqchip_required;
270 bool kernel_irqchip_split;
271 int kvm_shadow_mem;
272 char *dtb;
273 char *dumpdtb;
274 int phandle_start;
275 char *dt_compatible;
276 bool dump_guest_core;
277 bool mem_merge;
278 bool usb;
279 bool usb_disabled;
280 bool igd_gfx_passthru;
281 char *firmware;
282 bool iommu;
283 bool suppress_vmdesc;
284 bool enforce_config_section;
285 bool enable_graphics;
286 char *memory_encryption;
287 DeviceMemoryState *device_memory;
288
289 ram_addr_t ram_size;
290 ram_addr_t maxram_size;
291 uint64_t ram_slots;
292 const char *boot_order;
293 char *kernel_filename;
294 char *kernel_cmdline;
295 char *initrd_filename;
296 const char *cpu_type;
297 AccelState *accelerator;
298 CPUArchIdList *possible_cpus;
299 CpuTopology smp;
300 struct NVDIMMState *nvdimms_state;
301};
302
303#define DEFINE_MACHINE(namestr, machine_initfn) \
304 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
305 { \
306 MachineClass *mc = MACHINE_CLASS(oc); \
307 machine_initfn(mc); \
308 } \
309 static const TypeInfo machine_initfn##_typeinfo = { \
310 .name = MACHINE_TYPE_NAME(namestr), \
311 .parent = TYPE_MACHINE, \
312 .class_init = machine_initfn##_class_init, \
313 }; \
314 static void machine_initfn##_register_types(void) \
315 { \
316 type_register_static(&machine_initfn##_typeinfo); \
317 } \
318 type_init(machine_initfn##_register_types)
319
320extern GlobalProperty hw_compat_4_0[];
321extern const size_t hw_compat_4_0_len;
322
323extern GlobalProperty hw_compat_3_1[];
324extern const size_t hw_compat_3_1_len;
325
326extern GlobalProperty hw_compat_3_0[];
327extern const size_t hw_compat_3_0_len;
328
329extern GlobalProperty hw_compat_2_12[];
330extern const size_t hw_compat_2_12_len;
331
332extern GlobalProperty hw_compat_2_11[];
333extern const size_t hw_compat_2_11_len;
334
335extern GlobalProperty hw_compat_2_10[];
336extern const size_t hw_compat_2_10_len;
337
338extern GlobalProperty hw_compat_2_9[];
339extern const size_t hw_compat_2_9_len;
340
341extern GlobalProperty hw_compat_2_8[];
342extern const size_t hw_compat_2_8_len;
343
344extern GlobalProperty hw_compat_2_7[];
345extern const size_t hw_compat_2_7_len;
346
347extern GlobalProperty hw_compat_2_6[];
348extern const size_t hw_compat_2_6_len;
349
350extern GlobalProperty hw_compat_2_5[];
351extern const size_t hw_compat_2_5_len;
352
353extern GlobalProperty hw_compat_2_4[];
354extern const size_t hw_compat_2_4_len;
355
356extern GlobalProperty hw_compat_2_3[];
357extern const size_t hw_compat_2_3_len;
358
359extern GlobalProperty hw_compat_2_2[];
360extern const size_t hw_compat_2_2_len;
361
362extern GlobalProperty hw_compat_2_1[];
363extern const size_t hw_compat_2_1_len;
364
365#endif
366