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
79
80
81
82
83
84
85
86typedef struct {
87 uint64_t arch_id;
88 int64_t vcpus_count;
89 CpuInstanceProperties props;
90 Object *cpu;
91} CPUArchId;
92
93
94
95
96
97
98typedef struct {
99 int len;
100 CPUArchId cpus[0];
101} CPUArchIdList;
102
103
104
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
135struct MachineClass {
136
137 ObjectClass parent_class;
138
139
140 const char *family;
141 char *name;
142 const char *alias;
143 const char *desc;
144
145 void (*init)(MachineState *state);
146 void (*reset)(void);
147 void (*hot_add_cpu)(const int64_t id, Error **errp);
148 int (*kvm_type)(const char *arg);
149
150 BlockInterfaceType block_default_type;
151 int units_per_default_bus;
152 int max_cpus;
153 unsigned int no_serial:1,
154 no_parallel:1,
155 use_virtcon:1,
156 use_sclp:1,
157 no_floppy:1,
158 no_cdrom:1,
159 no_sdcard:1,
160 has_dynamic_sysbus:1,
161 pci_allow_0_address:1,
162 legacy_fw_cfg_order:1;
163 int is_default;
164 const char *default_machine_opts;
165 const char *default_boot_order;
166 const char *default_display;
167 GArray *compat_props;
168 const char *hw_version;
169 ram_addr_t default_ram_size;
170 bool option_rom_has_mr;
171 bool rom_file_has_mr;
172 int minimum_page_bits;
173 bool has_hotpluggable_cpus;
174 int numa_mem_align_shift;
175 void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
176 int nb_nodes, ram_addr_t size);
177
178 HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
179 DeviceState *dev);
180 CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
181 unsigned cpu_index);
182 const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
183};
184
185
186
187
188struct MachineState {
189
190 Object parent_obj;
191 Notifier sysbus_notifier;
192
193
194
195 char *accel;
196 bool kernel_irqchip_allowed;
197 bool kernel_irqchip_required;
198 bool kernel_irqchip_split;
199 int kvm_shadow_mem;
200 char *dtb;
201 char *dumpdtb;
202 int phandle_start;
203 char *dt_compatible;
204 bool dump_guest_core;
205 bool mem_merge;
206 bool usb;
207 bool usb_disabled;
208 bool igd_gfx_passthru;
209 char *firmware;
210 bool iommu;
211 bool suppress_vmdesc;
212 bool enforce_config_section;
213 bool enable_graphics;
214
215 ram_addr_t ram_size;
216 ram_addr_t maxram_size;
217 uint64_t ram_slots;
218 const char *boot_order;
219 char *kernel_filename;
220 char *kernel_cmdline;
221 char *initrd_filename;
222 const char *cpu_model;
223 AccelState *accelerator;
224 CPUArchIdList *possible_cpus;
225};
226
227#define DEFINE_MACHINE(namestr, machine_initfn) \
228 static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
229 { \
230 MachineClass *mc = MACHINE_CLASS(oc); \
231 machine_initfn(mc); \
232 } \
233 static const TypeInfo machine_initfn##_typeinfo = { \
234 .name = MACHINE_TYPE_NAME(namestr), \
235 .parent = TYPE_MACHINE, \
236 .class_init = machine_initfn##_class_init, \
237 }; \
238 static void machine_initfn##_register_types(void) \
239 { \
240 type_register_static(&machine_initfn##_typeinfo); \
241 } \
242 type_init(machine_initfn##_register_types)
243
244#define SET_MACHINE_COMPAT(m, COMPAT) \
245 do { \
246 int i; \
247 static GlobalProperty props[] = { \
248 COMPAT \
249 { } \
250 }; \
251 if (!m->compat_props) { \
252 m->compat_props = g_array_new(false, false, sizeof(void *)); \
253 } \
254 for (i = 0; props[i].driver != NULL; i++) { \
255 GlobalProperty *prop = &props[i]; \
256 g_array_append_val(m->compat_props, prop); \
257 } \
258 } while (0)
259
260#endif
261