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);
72void machine_register_compat_props(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
161struct MachineClass {
162
163 ObjectClass parent_class;
164
165
166 const char *family;
167 char *name;
168 const char *alias;
169 const char *desc;
170 const char *deprecation_reason;
171
172 void (*init)(MachineState *state);
173 void (*reset)(void);
174 void (*hot_add_cpu)(const int64_t id, Error **errp);
175 int (*kvm_type)(const char *arg);
176
177 BlockInterfaceType block_default_type;
178 int units_per_default_bus;
179 int max_cpus;
180 int min_cpus;
181 int default_cpus;
182 unsigned int no_serial:1,
183 no_parallel:1,
184 use_virtcon:1,
185 no_floppy:1,
186 no_cdrom:1,
187 no_sdcard:1,
188 pci_allow_0_address:1,
189 legacy_fw_cfg_order:1;
190 int is_default;
191 const char *default_machine_opts;
192 const char *default_boot_order;
193 const char *default_display;
194 GArray *compat_props;
195 const char *hw_version;
196 ram_addr_t default_ram_size;
197 const char *default_cpu_type;
198 bool option_rom_has_mr;
199 bool rom_file_has_mr;
200 int minimum_page_bits;
201 bool has_hotpluggable_cpus;
202 bool ignore_memory_transaction_failures;
203 int numa_mem_align_shift;
204 const char **valid_cpu_types;
205 strList *allowed_dynamic_sysbus_devices;
206 bool auto_enable_numa_with_memhp;
207 void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
208 int nb_nodes, ram_addr_t size);
209 bool ignore_boot_device_suffixes;
210
211 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
212 DeviceState *dev);
213 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
214 unsigned cpu_index);
215 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
216 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
217};
218
219
220
221
222
223
224
225typedef struct DeviceMemoryState {
226 hwaddr base;
227 MemoryRegion mr;
228} DeviceMemoryState;
229
230
231
232
233struct MachineState {
234
235 Object parent_obj;
236 Notifier sysbus_notifier;
237
238
239
240 char *accel;
241 bool kernel_irqchip_allowed;
242 bool kernel_irqchip_required;
243 bool kernel_irqchip_split;
244 int kvm_shadow_mem;
245 char *dtb;
246 char *dumpdtb;
247 int phandle_start;
248 char *dt_compatible;
249 bool dump_guest_core;
250 bool mem_merge;
251 bool usb;
252 bool usb_disabled;
253 bool igd_gfx_passthru;
254 char *firmware;
255 bool iommu;
256 bool suppress_vmdesc;
257 bool enforce_config_section;
258 bool enable_graphics;
259 char *memory_encryption;
260 DeviceMemoryState *device_memory;
261
262 ram_addr_t ram_size;
263 ram_addr_t maxram_size;
264 uint64_t ram_slots;
265 const char *boot_order;
266 char *kernel_filename;
267 char *kernel_cmdline;
268 char *initrd_filename;
269 const char *cpu_type;
270 AccelState *accelerator;
271 CPUArchIdList *possible_cpus;
272};
273
274#define DEFINE_MACHINE(namestr, machine_initfn) \
275 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
276 { \
277 MachineClass *mc = MACHINE_CLASS(oc); \
278 machine_initfn(mc); \
279 } \
280 static const TypeInfo machine_initfn##_typeinfo = { \
281 .name = MACHINE_TYPE_NAME(namestr), \
282 .parent = TYPE_MACHINE, \
283 .class_init = machine_initfn##_class_init, \
284 }; \
285 static void machine_initfn##_register_types(void) \
286 { \
287 type_register_static(&machine_initfn##_typeinfo); \
288 } \
289 type_init(machine_initfn##_register_types)
290
291#define SET_MACHINE_COMPAT(m, COMPAT) \
292 do { \
293 int i; \
294 static GlobalProperty props[] = { \
295 COMPAT \
296 { } \
297 }; \
298 if (!m->compat_props) { \
299 m->compat_props = g_array_new(false, false, sizeof(void *)); \
300 } \
301 for (i = 0; props[i].driver != NULL; i++) { \
302 GlobalProperty *prop = &props[i]; \
303 g_array_append_val(m->compat_props, prop); \
304 } \
305 } while (0)
306
307#endif
308