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
40
41void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
42 const char *name,
43 uint64_t ram_size);
44
45#define TYPE_MACHINE_SUFFIX "-machine"
46
47
48
49
50#define MACHINE_TYPE_NAME(machinename) (machinename TYPE_MACHINE_SUFFIX)
51
52#define TYPE_MACHINE "machine"
53#undef MACHINE
54#define MACHINE(obj) \
55 OBJECT_CHECK(MachineState, (obj), TYPE_MACHINE)
56#define MACHINE_GET_CLASS(obj) \
57 OBJECT_GET_CLASS(MachineClass, (obj), TYPE_MACHINE)
58#define MACHINE_CLASS(klass) \
59 OBJECT_CLASS_CHECK(MachineClass, (klass), TYPE_MACHINE)
60
61MachineClass *find_default_machine(void);
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);
73void machine_register_compat_props(MachineState *machine);
74HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
75void machine_set_cpu_numa_node(MachineState *machine,
76 const CpuInstanceProperties *props,
77 Error **errp);
78
79void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
80
81
82
83
84
85
86
87
88
89
90typedef struct {
91 uint64_t arch_id;
92 int64_t vcpus_count;
93 CpuInstanceProperties props;
94 Object *cpu;
95 const char *type;
96} CPUArchId;
97
98
99
100
101
102
103typedef struct {
104 int len;
105 CPUArchId cpus[0];
106} CPUArchIdList;
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
160struct MachineClass {
161
162 ObjectClass parent_class;
163
164
165 const char *family;
166 char *name;
167 const char *alias;
168 const char *desc;
169
170 void (*init)(MachineState *state);
171 void (*reset)(void);
172 void (*hot_add_cpu)(const int64_t id, Error **errp);
173 int (*kvm_type)(const char *arg);
174
175 BlockInterfaceType block_default_type;
176 int units_per_default_bus;
177 int max_cpus;
178 int min_cpus;
179 int default_cpus;
180 unsigned int no_serial:1,
181 no_parallel:1,
182 use_virtcon:1,
183 use_sclp:1,
184 no_floppy:1,
185 no_cdrom:1,
186 no_sdcard:1,
187 pci_allow_0_address:1,
188 legacy_fw_cfg_order:1;
189 int is_default;
190 const char *default_machine_opts;
191 const char *default_boot_order;
192 const char *default_display;
193 GArray *compat_props;
194 const char *hw_version;
195 ram_addr_t default_ram_size;
196 const char *default_cpu_type;
197 bool option_rom_has_mr;
198 bool rom_file_has_mr;
199 int minimum_page_bits;
200 bool has_hotpluggable_cpus;
201 bool ignore_memory_transaction_failures;
202 int numa_mem_align_shift;
203 const char **valid_cpu_types;
204 strList *allowed_dynamic_sysbus_devices;
205 bool auto_enable_numa_with_memhp;
206 void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
207 int nb_nodes, ram_addr_t size);
208
209 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
210 DeviceState *dev);
211 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
212 unsigned cpu_index);
213 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
214 int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
215};
216
217
218
219
220struct MachineState {
221
222 Object parent_obj;
223 Notifier sysbus_notifier;
224
225
226
227 char *accel;
228 bool kernel_irqchip_allowed;
229 bool kernel_irqchip_required;
230 bool kernel_irqchip_split;
231 int kvm_shadow_mem;
232 char *dtb;
233 char *dumpdtb;
234 int phandle_start;
235 char *dt_compatible;
236 bool dump_guest_core;
237 bool mem_merge;
238 bool usb;
239 bool usb_disabled;
240 bool igd_gfx_passthru;
241 char *firmware;
242 bool iommu;
243 bool suppress_vmdesc;
244 bool enforce_config_section;
245 bool enable_graphics;
246 char *memory_encryption;
247
248 ram_addr_t ram_size;
249 ram_addr_t maxram_size;
250 uint64_t ram_slots;
251 const char *boot_order;
252 char *kernel_filename;
253 char *kernel_cmdline;
254 char *initrd_filename;
255 const char *cpu_type;
256 AccelState *accelerator;
257 CPUArchIdList *possible_cpus;
258};
259
260#define DEFINE_MACHINE(namestr, machine_initfn) \
261 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
262 { \
263 MachineClass *mc = MACHINE_CLASS(oc); \
264 machine_initfn(mc); \
265 } \
266 static const TypeInfo machine_initfn##_typeinfo = { \
267 .name = MACHINE_TYPE_NAME(namestr), \
268 .parent = TYPE_MACHINE, \
269 .class_init = machine_initfn##_class_init, \
270 }; \
271 static void machine_initfn##_register_types(void) \
272 { \
273 type_register_static(&machine_initfn##_typeinfo); \
274 } \
275 type_init(machine_initfn##_register_types)
276
277#define SET_MACHINE_COMPAT(m, COMPAT) \
278 do { \
279 int i; \
280 static GlobalProperty props[] = { \
281 COMPAT \
282 { } \
283 }; \
284 if (!m->compat_props) { \
285 m->compat_props = g_array_new(false, false, sizeof(void *)); \
286 } \
287 for (i = 0; props[i].driver != NULL; i++) { \
288 GlobalProperty *prop = &props[i]; \
289 g_array_append_val(m->compat_props, prop); \
290 } \
291 } while (0)
292
293#endif
294