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