1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include "qemu/osdep.h"
32#include "qemu/datadir.h"
33#include "qemu/units.h"
34#include "qemu/option.h"
35#include "monitor/qdev.h"
36#include "hw/sysbus.h"
37#include "hw/arm/boot.h"
38#include "hw/arm/primecell.h"
39#include "hw/arm/virt.h"
40#include "hw/block/flash.h"
41#include "hw/vfio/vfio-calxeda-xgmac.h"
42#include "hw/vfio/vfio-amd-xgbe.h"
43#include "hw/display/ramfb.h"
44#include "net/net.h"
45#include "sysemu/device_tree.h"
46#include "sysemu/numa.h"
47#include "sysemu/runstate.h"
48#include "sysemu/tpm.h"
49#include "sysemu/tcg.h"
50#include "sysemu/kvm.h"
51#include "sysemu/hvf.h"
52#include "sysemu/qtest.h"
53#include "hw/loader.h"
54#include "qapi/error.h"
55#include "qemu/bitops.h"
56#include "qemu/error-report.h"
57#include "qemu/module.h"
58#include "hw/pci-host/gpex.h"
59#include "hw/virtio/virtio-pci.h"
60#include "hw/core/sysbus-fdt.h"
61#include "hw/platform-bus.h"
62#include "hw/qdev-properties.h"
63#include "hw/arm/fdt.h"
64#include "hw/intc/arm_gic.h"
65#include "hw/intc/arm_gicv3_common.h"
66#include "hw/irq.h"
67#include "kvm_arm.h"
68#include "hw/firmware/smbios.h"
69#include "qapi/visitor.h"
70#include "qapi/qapi-visit-common.h"
71#include "standard-headers/linux/input.h"
72#include "hw/arm/smmuv3.h"
73#include "hw/acpi/acpi.h"
74#include "target/arm/internals.h"
75#include "hw/mem/memory-device.h"
76#include "hw/mem/pc-dimm.h"
77#include "hw/mem/nvdimm.h"
78#include "hw/acpi/generic_event_device.h"
79#include "hw/virtio/virtio-mem-pci.h"
80#include "hw/virtio/virtio-iommu.h"
81#include "hw/char/pl011.h"
82#include "qemu/guest-random.h"
83
84#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
85 static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
86 void *data) \
87 { \
88 MachineClass *mc = MACHINE_CLASS(oc); \
89 virt_machine_##major##_##minor##_options(mc); \
90 mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
91 if (latest) { \
92 mc->alias = "virt"; \
93 } \
94 } \
95 static const TypeInfo machvirt_##major##_##minor##_info = { \
96 .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
97 .parent = TYPE_VIRT_MACHINE, \
98 .class_init = virt_##major##_##minor##_class_init, \
99 }; \
100 static void machvirt_machine_##major##_##minor##_init(void) \
101 { \
102 type_register_static(&machvirt_##major##_##minor##_info); \
103 } \
104 type_init(machvirt_machine_##major##_##minor##_init);
105
106#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
107 DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
108#define DEFINE_VIRT_MACHINE(major, minor) \
109 DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
110
111
112
113#define NUM_IRQS 256
114
115#define PLATFORM_BUS_NUM_IRQS 64
116
117
118#define LEGACY_RAMLIMIT_GB 255
119#define LEGACY_RAMLIMIT_BYTES (LEGACY_RAMLIMIT_GB * GiB)
120
121
122
123
124
125
126
127
128
129
130
131
132
133static const MemMapEntry base_memmap[] = {
134
135 [VIRT_FLASH] = { 0, 0x08000000 },
136 [VIRT_CPUPERIPHS] = { 0x08000000, 0x00020000 },
137
138 [VIRT_GIC_DIST] = { 0x08000000, 0x00010000 },
139 [VIRT_GIC_CPU] = { 0x08010000, 0x00010000 },
140 [VIRT_GIC_V2M] = { 0x08020000, 0x00001000 },
141 [VIRT_GIC_HYP] = { 0x08030000, 0x00010000 },
142 [VIRT_GIC_VCPU] = { 0x08040000, 0x00010000 },
143
144 [VIRT_GIC_ITS] = { 0x08080000, 0x00020000 },
145
146 [VIRT_GIC_REDIST] = { 0x080A0000, 0x00F60000 },
147 [VIRT_UART] = { 0x09000000, 0x00001000 },
148 [VIRT_RTC] = { 0x09010000, 0x00001000 },
149 [VIRT_FW_CFG] = { 0x09020000, 0x00000018 },
150 [VIRT_GPIO] = { 0x09030000, 0x00001000 },
151 [VIRT_SECURE_UART] = { 0x09040000, 0x00001000 },
152 [VIRT_SMMU] = { 0x09050000, 0x00020000 },
153 [VIRT_PCDIMM_ACPI] = { 0x09070000, MEMORY_HOTPLUG_IO_LEN },
154 [VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
155 [VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
156 [VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
157 [VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
158 [VIRT_MMIO] = { 0x0a000000, 0x00000200 },
159
160 [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
161 [VIRT_SECURE_MEM] = { 0x0e000000, 0x01000000 },
162 [VIRT_PCIE_MMIO] = { 0x10000000, 0x2eff0000 },
163 [VIRT_PCIE_PIO] = { 0x3eff0000, 0x00010000 },
164 [VIRT_PCIE_ECAM] = { 0x3f000000, 0x01000000 },
165
166 [VIRT_MEM] = { GiB, LEGACY_RAMLIMIT_BYTES },
167};
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185static MemMapEntry extended_memmap[] = {
186
187 [VIRT_HIGH_GIC_REDIST2] = { 0x0, 64 * MiB },
188 [VIRT_HIGH_PCIE_ECAM] = { 0x0, 256 * MiB },
189
190 [VIRT_HIGH_PCIE_MMIO] = { 0x0, 512 * GiB },
191};
192
193static const int a15irqmap[] = {
194 [VIRT_UART] = 1,
195 [VIRT_RTC] = 2,
196 [VIRT_PCIE] = 3,
197 [VIRT_GPIO] = 7,
198 [VIRT_SECURE_UART] = 8,
199 [VIRT_ACPI_GED] = 9,
200 [VIRT_MMIO] = 16,
201 [VIRT_GIC_V2M] = 48,
202 [VIRT_SMMU] = 74,
203 [VIRT_PLATFORM_BUS] = 112,
204};
205
206static const char *valid_cpus[] = {
207 ARM_CPU_TYPE_NAME("cortex-a7"),
208 ARM_CPU_TYPE_NAME("cortex-a15"),
209 ARM_CPU_TYPE_NAME("cortex-a35"),
210 ARM_CPU_TYPE_NAME("cortex-a53"),
211 ARM_CPU_TYPE_NAME("cortex-a55"),
212 ARM_CPU_TYPE_NAME("cortex-a57"),
213 ARM_CPU_TYPE_NAME("cortex-a72"),
214 ARM_CPU_TYPE_NAME("cortex-a76"),
215 ARM_CPU_TYPE_NAME("a64fx"),
216 ARM_CPU_TYPE_NAME("neoverse-n1"),
217 ARM_CPU_TYPE_NAME("host"),
218 ARM_CPU_TYPE_NAME("max"),
219};
220
221static bool cpu_type_valid(const char *cpu)
222{
223 int i;
224
225 for (i = 0; i < ARRAY_SIZE(valid_cpus); i++) {
226 if (strcmp(cpu, valid_cpus[i]) == 0) {
227 return true;
228 }
229 }
230 return false;
231}
232
233static void create_randomness(MachineState *ms, const char *node)
234{
235 struct {
236 uint64_t kaslr;
237 uint8_t rng[32];
238 } seed;
239
240 if (qemu_guest_getrandom(&seed, sizeof(seed), NULL)) {
241 return;
242 }
243 qemu_fdt_setprop_u64(ms->fdt, node, "kaslr-seed", seed.kaslr);
244 qemu_fdt_setprop(ms->fdt, node, "rng-seed", seed.rng, sizeof(seed.rng));
245}
246
247static void create_fdt(VirtMachineState *vms)
248{
249 MachineState *ms = MACHINE(vms);
250 int nb_numa_nodes = ms->numa_state->num_nodes;
251 void *fdt = create_device_tree(&vms->fdt_size);
252
253 if (!fdt) {
254 error_report("create_device_tree() failed");
255 exit(1);
256 }
257
258 ms->fdt = fdt;
259
260
261 qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
262 qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
263 qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
264 qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt");
265
266
267 qemu_fdt_add_subnode(fdt, "/chosen");
268 if (vms->dtb_randomness) {
269 create_randomness(ms, "/chosen");
270 }
271
272 if (vms->secure) {
273 qemu_fdt_add_subnode(fdt, "/secure-chosen");
274 if (vms->dtb_randomness) {
275 create_randomness(ms, "/secure-chosen");
276 }
277 }
278
279
280
281
282
283
284 vms->clock_phandle = qemu_fdt_alloc_phandle(fdt);
285 qemu_fdt_add_subnode(fdt, "/apb-pclk");
286 qemu_fdt_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock");
287 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0);
288 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000);
289 qemu_fdt_setprop_string(fdt, "/apb-pclk", "clock-output-names",
290 "clk24mhz");
291 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vms->clock_phandle);
292
293 if (nb_numa_nodes > 0 && ms->numa_state->have_numa_distance) {
294 int size = nb_numa_nodes * nb_numa_nodes * 3 * sizeof(uint32_t);
295 uint32_t *matrix = g_malloc0(size);
296 int idx, i, j;
297
298 for (i = 0; i < nb_numa_nodes; i++) {
299 for (j = 0; j < nb_numa_nodes; j++) {
300 idx = (i * nb_numa_nodes + j) * 3;
301 matrix[idx + 0] = cpu_to_be32(i);
302 matrix[idx + 1] = cpu_to_be32(j);
303 matrix[idx + 2] =
304 cpu_to_be32(ms->numa_state->nodes[i].distance[j]);
305 }
306 }
307
308 qemu_fdt_add_subnode(fdt, "/distance-map");
309 qemu_fdt_setprop_string(fdt, "/distance-map", "compatible",
310 "numa-distance-map-v1");
311 qemu_fdt_setprop(fdt, "/distance-map", "distance-matrix",
312 matrix, size);
313 g_free(matrix);
314 }
315}
316
317static void fdt_add_timer_nodes(const VirtMachineState *vms)
318{
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337 ARMCPU *armcpu;
338 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
339 uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
340 MachineState *ms = MACHINE(vms);
341
342 if (vmc->claim_edge_triggered_timers) {
343 irqflags = GIC_FDT_IRQ_FLAGS_EDGE_LO_HI;
344 }
345
346 if (vms->gic_version == VIRT_GIC_VERSION_2) {
347 irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
348 GIC_FDT_IRQ_PPI_CPU_WIDTH,
349 (1 << MACHINE(vms)->smp.cpus) - 1);
350 }
351
352 qemu_fdt_add_subnode(ms->fdt, "/timer");
353
354 armcpu = ARM_CPU(qemu_get_cpu(0));
355 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
356 const char compat[] = "arm,armv8-timer\0arm,armv7-timer";
357 qemu_fdt_setprop(ms->fdt, "/timer", "compatible",
358 compat, sizeof(compat));
359 } else {
360 qemu_fdt_setprop_string(ms->fdt, "/timer", "compatible",
361 "arm,armv7-timer");
362 }
363 qemu_fdt_setprop(ms->fdt, "/timer", "always-on", NULL, 0);
364 qemu_fdt_setprop_cells(ms->fdt, "/timer", "interrupts",
365 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_S_EL1_IRQ, irqflags,
366 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL1_IRQ, irqflags,
367 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_VIRT_IRQ, irqflags,
368 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL2_IRQ, irqflags);
369}
370
371static void fdt_add_cpu_nodes(const VirtMachineState *vms)
372{
373 int cpu;
374 int addr_cells = 1;
375 const MachineState *ms = MACHINE(vms);
376 const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
377 int smp_cpus = ms->smp.cpus;
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392 for (cpu = 0; cpu < smp_cpus; cpu++) {
393 ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
394
395 if (armcpu->mp_affinity & ARM_AFF3_MASK) {
396 addr_cells = 2;
397 break;
398 }
399 }
400
401 qemu_fdt_add_subnode(ms->fdt, "/cpus");
402 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", addr_cells);
403 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
404
405 for (cpu = smp_cpus - 1; cpu >= 0; cpu--) {
406 char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
407 ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
408 CPUState *cs = CPU(armcpu);
409
410 qemu_fdt_add_subnode(ms->fdt, nodename);
411 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu");
412 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
413 armcpu->dtb_compatible);
414
415 if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED && smp_cpus > 1) {
416 qemu_fdt_setprop_string(ms->fdt, nodename,
417 "enable-method", "psci");
418 }
419
420 if (addr_cells == 2) {
421 qemu_fdt_setprop_u64(ms->fdt, nodename, "reg",
422 armcpu->mp_affinity);
423 } else {
424 qemu_fdt_setprop_cell(ms->fdt, nodename, "reg",
425 armcpu->mp_affinity);
426 }
427
428 if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) {
429 qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id",
430 ms->possible_cpus->cpus[cs->cpu_index].props.node_id);
431 }
432
433 if (!vmc->no_cpu_topology) {
434 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
435 qemu_fdt_alloc_phandle(ms->fdt));
436 }
437
438 g_free(nodename);
439 }
440
441 if (!vmc->no_cpu_topology) {
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458 qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
459
460 for (cpu = smp_cpus - 1; cpu >= 0; cpu--) {
461 char *cpu_path = g_strdup_printf("/cpus/cpu@%d", cpu);
462 char *map_path;
463
464 if (ms->smp.threads > 1) {
465 map_path = g_strdup_printf(
466 "/cpus/cpu-map/socket%d/cluster%d/core%d/thread%d",
467 cpu / (ms->smp.clusters * ms->smp.cores * ms->smp.threads),
468 (cpu / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters,
469 (cpu / ms->smp.threads) % ms->smp.cores,
470 cpu % ms->smp.threads);
471 } else {
472 map_path = g_strdup_printf(
473 "/cpus/cpu-map/socket%d/cluster%d/core%d",
474 cpu / (ms->smp.clusters * ms->smp.cores),
475 (cpu / ms->smp.cores) % ms->smp.clusters,
476 cpu % ms->smp.cores);
477 }
478 qemu_fdt_add_path(ms->fdt, map_path);
479 qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", cpu_path);
480
481 g_free(map_path);
482 g_free(cpu_path);
483 }
484 }
485}
486
487static void fdt_add_its_gic_node(VirtMachineState *vms)
488{
489 char *nodename;
490 MachineState *ms = MACHINE(vms);
491
492 vms->msi_phandle = qemu_fdt_alloc_phandle(ms->fdt);
493 nodename = g_strdup_printf("/intc/its@%" PRIx64,
494 vms->memmap[VIRT_GIC_ITS].base);
495 qemu_fdt_add_subnode(ms->fdt, nodename);
496 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
497 "arm,gic-v3-its");
498 qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0);
499 qemu_fdt_setprop_cell(ms->fdt, nodename, "#msi-cells", 1);
500 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
501 2, vms->memmap[VIRT_GIC_ITS].base,
502 2, vms->memmap[VIRT_GIC_ITS].size);
503 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->msi_phandle);
504 g_free(nodename);
505}
506
507static void fdt_add_v2m_gic_node(VirtMachineState *vms)
508{
509 MachineState *ms = MACHINE(vms);
510 char *nodename;
511
512 nodename = g_strdup_printf("/intc/v2m@%" PRIx64,
513 vms->memmap[VIRT_GIC_V2M].base);
514 vms->msi_phandle = qemu_fdt_alloc_phandle(ms->fdt);
515 qemu_fdt_add_subnode(ms->fdt, nodename);
516 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
517 "arm,gic-v2m-frame");
518 qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0);
519 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
520 2, vms->memmap[VIRT_GIC_V2M].base,
521 2, vms->memmap[VIRT_GIC_V2M].size);
522 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->msi_phandle);
523 g_free(nodename);
524}
525
526static void fdt_add_gic_node(VirtMachineState *vms)
527{
528 MachineState *ms = MACHINE(vms);
529 char *nodename;
530
531 vms->gic_phandle = qemu_fdt_alloc_phandle(ms->fdt);
532 qemu_fdt_setprop_cell(ms->fdt, "/", "interrupt-parent", vms->gic_phandle);
533
534 nodename = g_strdup_printf("/intc@%" PRIx64,
535 vms->memmap[VIRT_GIC_DIST].base);
536 qemu_fdt_add_subnode(ms->fdt, nodename);
537 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 3);
538 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0);
539 qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 0x2);
540 qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 0x2);
541 qemu_fdt_setprop(ms->fdt, nodename, "ranges", NULL, 0);
542 if (vms->gic_version != VIRT_GIC_VERSION_2) {
543 int nb_redist_regions = virt_gicv3_redist_region_count(vms);
544
545 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
546 "arm,gic-v3");
547
548 qemu_fdt_setprop_cell(ms->fdt, nodename,
549 "#redistributor-regions", nb_redist_regions);
550
551 if (nb_redist_regions == 1) {
552 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
553 2, vms->memmap[VIRT_GIC_DIST].base,
554 2, vms->memmap[VIRT_GIC_DIST].size,
555 2, vms->memmap[VIRT_GIC_REDIST].base,
556 2, vms->memmap[VIRT_GIC_REDIST].size);
557 } else {
558 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
559 2, vms->memmap[VIRT_GIC_DIST].base,
560 2, vms->memmap[VIRT_GIC_DIST].size,
561 2, vms->memmap[VIRT_GIC_REDIST].base,
562 2, vms->memmap[VIRT_GIC_REDIST].size,
563 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].base,
564 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].size);
565 }
566
567 if (vms->virt) {
568 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
569 GIC_FDT_IRQ_TYPE_PPI, ARCH_GIC_MAINT_IRQ,
570 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
571 }
572 } else {
573
574 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
575 "arm,cortex-a15-gic");
576 if (!vms->virt) {
577 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
578 2, vms->memmap[VIRT_GIC_DIST].base,
579 2, vms->memmap[VIRT_GIC_DIST].size,
580 2, vms->memmap[VIRT_GIC_CPU].base,
581 2, vms->memmap[VIRT_GIC_CPU].size);
582 } else {
583 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
584 2, vms->memmap[VIRT_GIC_DIST].base,
585 2, vms->memmap[VIRT_GIC_DIST].size,
586 2, vms->memmap[VIRT_GIC_CPU].base,
587 2, vms->memmap[VIRT_GIC_CPU].size,
588 2, vms->memmap[VIRT_GIC_HYP].base,
589 2, vms->memmap[VIRT_GIC_HYP].size,
590 2, vms->memmap[VIRT_GIC_VCPU].base,
591 2, vms->memmap[VIRT_GIC_VCPU].size);
592 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
593 GIC_FDT_IRQ_TYPE_PPI, ARCH_GIC_MAINT_IRQ,
594 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
595 }
596 }
597
598 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->gic_phandle);
599 g_free(nodename);
600}
601
602static void fdt_add_pmu_nodes(const VirtMachineState *vms)
603{
604 ARMCPU *armcpu = ARM_CPU(first_cpu);
605 uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
606 MachineState *ms = MACHINE(vms);
607
608 if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
609 assert(!object_property_get_bool(OBJECT(armcpu), "pmu", NULL));
610 return;
611 }
612
613 if (vms->gic_version == VIRT_GIC_VERSION_2) {
614 irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
615 GIC_FDT_IRQ_PPI_CPU_WIDTH,
616 (1 << MACHINE(vms)->smp.cpus) - 1);
617 }
618
619 qemu_fdt_add_subnode(ms->fdt, "/pmu");
620 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
621 const char compat[] = "arm,armv8-pmuv3";
622 qemu_fdt_setprop(ms->fdt, "/pmu", "compatible",
623 compat, sizeof(compat));
624 qemu_fdt_setprop_cells(ms->fdt, "/pmu", "interrupts",
625 GIC_FDT_IRQ_TYPE_PPI, VIRTUAL_PMU_IRQ, irqflags);
626 }
627}
628
629static inline DeviceState *create_acpi_ged(VirtMachineState *vms)
630{
631 DeviceState *dev;
632 MachineState *ms = MACHINE(vms);
633 int irq = vms->irqmap[VIRT_ACPI_GED];
634 uint32_t event = ACPI_GED_PWR_DOWN_EVT;
635
636 if (ms->ram_slots) {
637 event |= ACPI_GED_MEM_HOTPLUG_EVT;
638 }
639
640 if (ms->nvdimms_state->is_enabled) {
641 event |= ACPI_GED_NVDIMM_HOTPLUG_EVT;
642 }
643
644 dev = qdev_new(TYPE_ACPI_GED);
645 qdev_prop_set_uint32(dev, "ged-event", event);
646
647 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_ACPI_GED].base);
648 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, vms->memmap[VIRT_PCDIMM_ACPI].base);
649 sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(vms->gic, irq));
650
651 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
652
653 return dev;
654}
655
656static void create_its(VirtMachineState *vms)
657{
658 const char *itsclass = its_class_name();
659 DeviceState *dev;
660
661 if (!strcmp(itsclass, "arm-gicv3-its")) {
662 if (!vms->tcg_its) {
663 itsclass = NULL;
664 }
665 }
666
667 if (!itsclass) {
668
669 return;
670 }
671
672 dev = qdev_new(itsclass);
673
674 object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(vms->gic),
675 &error_abort);
676 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
677 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
678
679 fdt_add_its_gic_node(vms);
680 vms->msi_controller = VIRT_MSI_CTRL_ITS;
681}
682
683static void create_v2m(VirtMachineState *vms)
684{
685 int i;
686 int irq = vms->irqmap[VIRT_GIC_V2M];
687 DeviceState *dev;
688
689 dev = qdev_new("arm-gicv2m");
690 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_V2M].base);
691 qdev_prop_set_uint32(dev, "base-spi", irq);
692 qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS);
693 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
694
695 for (i = 0; i < NUM_GICV2M_SPIS; i++) {
696 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
697 qdev_get_gpio_in(vms->gic, irq + i));
698 }
699
700 fdt_add_v2m_gic_node(vms);
701 vms->msi_controller = VIRT_MSI_CTRL_GICV2M;
702}
703
704static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
705{
706 MachineState *ms = MACHINE(vms);
707
708 SysBusDevice *gicbusdev;
709 const char *gictype;
710 int i;
711 unsigned int smp_cpus = ms->smp.cpus;
712 uint32_t nb_redist_regions = 0;
713 int revision;
714
715 if (vms->gic_version == VIRT_GIC_VERSION_2) {
716 gictype = gic_class_name();
717 } else {
718 gictype = gicv3_class_name();
719 }
720
721 switch (vms->gic_version) {
722 case VIRT_GIC_VERSION_2:
723 revision = 2;
724 break;
725 case VIRT_GIC_VERSION_3:
726 revision = 3;
727 break;
728 case VIRT_GIC_VERSION_4:
729 revision = 4;
730 break;
731 default:
732 g_assert_not_reached();
733 }
734 vms->gic = qdev_new(gictype);
735 qdev_prop_set_uint32(vms->gic, "revision", revision);
736 qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus);
737
738
739
740 qdev_prop_set_uint32(vms->gic, "num-irq", NUM_IRQS + 32);
741 if (!kvm_irqchip_in_kernel()) {
742 qdev_prop_set_bit(vms->gic, "has-security-extensions", vms->secure);
743 }
744
745 if (vms->gic_version != VIRT_GIC_VERSION_2) {
746 uint32_t redist0_capacity = virt_redist_capacity(vms, VIRT_GIC_REDIST);
747 uint32_t redist0_count = MIN(smp_cpus, redist0_capacity);
748
749 nb_redist_regions = virt_gicv3_redist_region_count(vms);
750
751 qdev_prop_set_uint32(vms->gic, "len-redist-region-count",
752 nb_redist_regions);
753 qdev_prop_set_uint32(vms->gic, "redist-region-count[0]", redist0_count);
754
755 if (!kvm_irqchip_in_kernel()) {
756 if (vms->tcg_its) {
757 object_property_set_link(OBJECT(vms->gic), "sysmem",
758 OBJECT(mem), &error_fatal);
759 qdev_prop_set_bit(vms->gic, "has-lpi", true);
760 }
761 }
762
763 if (nb_redist_regions == 2) {
764 uint32_t redist1_capacity =
765 virt_redist_capacity(vms, VIRT_HIGH_GIC_REDIST2);
766
767 qdev_prop_set_uint32(vms->gic, "redist-region-count[1]",
768 MIN(smp_cpus - redist0_count, redist1_capacity));
769 }
770 } else {
771 if (!kvm_irqchip_in_kernel()) {
772 qdev_prop_set_bit(vms->gic, "has-virtualization-extensions",
773 vms->virt);
774 }
775 }
776 gicbusdev = SYS_BUS_DEVICE(vms->gic);
777 sysbus_realize_and_unref(gicbusdev, &error_fatal);
778 sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base);
779 if (vms->gic_version != VIRT_GIC_VERSION_2) {
780 sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base);
781 if (nb_redist_regions == 2) {
782 sysbus_mmio_map(gicbusdev, 2,
783 vms->memmap[VIRT_HIGH_GIC_REDIST2].base);
784 }
785 } else {
786 sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base);
787 if (vms->virt) {
788 sysbus_mmio_map(gicbusdev, 2, vms->memmap[VIRT_GIC_HYP].base);
789 sysbus_mmio_map(gicbusdev, 3, vms->memmap[VIRT_GIC_VCPU].base);
790 }
791 }
792
793
794
795
796
797 for (i = 0; i < smp_cpus; i++) {
798 DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
799 int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
800 int irq;
801
802
803
804 const int timer_irq[] = {
805 [GTIMER_PHYS] = ARCH_TIMER_NS_EL1_IRQ,
806 [GTIMER_VIRT] = ARCH_TIMER_VIRT_IRQ,
807 [GTIMER_HYP] = ARCH_TIMER_NS_EL2_IRQ,
808 [GTIMER_SEC] = ARCH_TIMER_S_EL1_IRQ,
809 };
810
811 for (irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
812 qdev_connect_gpio_out(cpudev, irq,
813 qdev_get_gpio_in(vms->gic,
814 ppibase + timer_irq[irq]));
815 }
816
817 if (vms->gic_version != VIRT_GIC_VERSION_2) {
818 qemu_irq irq = qdev_get_gpio_in(vms->gic,
819 ppibase + ARCH_GIC_MAINT_IRQ);
820 qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
821 0, irq);
822 } else if (vms->virt) {
823 qemu_irq irq = qdev_get_gpio_in(vms->gic,
824 ppibase + ARCH_GIC_MAINT_IRQ);
825 sysbus_connect_irq(gicbusdev, i + 4 * smp_cpus, irq);
826 }
827
828 qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
829 qdev_get_gpio_in(vms->gic, ppibase
830 + VIRTUAL_PMU_IRQ));
831
832 sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
833 sysbus_connect_irq(gicbusdev, i + smp_cpus,
834 qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
835 sysbus_connect_irq(gicbusdev, i + 2 * smp_cpus,
836 qdev_get_gpio_in(cpudev, ARM_CPU_VIRQ));
837 sysbus_connect_irq(gicbusdev, i + 3 * smp_cpus,
838 qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
839 }
840
841 fdt_add_gic_node(vms);
842
843 if (vms->gic_version != VIRT_GIC_VERSION_2 && vms->its) {
844 create_its(vms);
845 } else if (vms->gic_version == VIRT_GIC_VERSION_2) {
846 create_v2m(vms);
847 }
848}
849
850static void create_uart(const VirtMachineState *vms, int uart,
851 MemoryRegion *mem, Chardev *chr)
852{
853 char *nodename;
854 hwaddr base = vms->memmap[uart].base;
855 hwaddr size = vms->memmap[uart].size;
856 int irq = vms->irqmap[uart];
857 const char compat[] = "arm,pl011\0arm,primecell";
858 const char clocknames[] = "uartclk\0apb_pclk";
859 DeviceState *dev = qdev_new(TYPE_PL011);
860 SysBusDevice *s = SYS_BUS_DEVICE(dev);
861 MachineState *ms = MACHINE(vms);
862
863 qdev_prop_set_chr(dev, "chardev", chr);
864 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
865 memory_region_add_subregion(mem, base,
866 sysbus_mmio_get_region(s, 0));
867 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
868
869 nodename = g_strdup_printf("/pl011@%" PRIx64, base);
870 qemu_fdt_add_subnode(ms->fdt, nodename);
871
872 qemu_fdt_setprop(ms->fdt, nodename, "compatible",
873 compat, sizeof(compat));
874 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
875 2, base, 2, size);
876 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
877 GIC_FDT_IRQ_TYPE_SPI, irq,
878 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
879 qemu_fdt_setprop_cells(ms->fdt, nodename, "clocks",
880 vms->clock_phandle, vms->clock_phandle);
881 qemu_fdt_setprop(ms->fdt, nodename, "clock-names",
882 clocknames, sizeof(clocknames));
883
884 if (uart == VIRT_UART) {
885 qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename);
886 } else {
887
888 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled");
889 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
890
891 qemu_fdt_setprop_string(ms->fdt, "/secure-chosen", "stdout-path",
892 nodename);
893 }
894
895 g_free(nodename);
896}
897
898static void create_rtc(const VirtMachineState *vms)
899{
900 char *nodename;
901 hwaddr base = vms->memmap[VIRT_RTC].base;
902 hwaddr size = vms->memmap[VIRT_RTC].size;
903 int irq = vms->irqmap[VIRT_RTC];
904 const char compat[] = "arm,pl031\0arm,primecell";
905 MachineState *ms = MACHINE(vms);
906
907 sysbus_create_simple("pl031", base, qdev_get_gpio_in(vms->gic, irq));
908
909 nodename = g_strdup_printf("/pl031@%" PRIx64, base);
910 qemu_fdt_add_subnode(ms->fdt, nodename);
911 qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat));
912 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
913 2, base, 2, size);
914 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
915 GIC_FDT_IRQ_TYPE_SPI, irq,
916 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
917 qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle);
918 qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk");
919 g_free(nodename);
920}
921
922static DeviceState *gpio_key_dev;
923static void virt_powerdown_req(Notifier *n, void *opaque)
924{
925 VirtMachineState *s = container_of(n, VirtMachineState, powerdown_notifier);
926
927 if (s->acpi_dev) {
928 acpi_send_event(s->acpi_dev, ACPI_POWER_DOWN_STATUS);
929 } else {
930
931 qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
932 }
933}
934
935static void create_gpio_keys(char *fdt, DeviceState *pl061_dev,
936 uint32_t phandle)
937{
938 gpio_key_dev = sysbus_create_simple("gpio-key", -1,
939 qdev_get_gpio_in(pl061_dev, 3));
940
941 qemu_fdt_add_subnode(fdt, "/gpio-keys");
942 qemu_fdt_setprop_string(fdt, "/gpio-keys", "compatible", "gpio-keys");
943
944 qemu_fdt_add_subnode(fdt, "/gpio-keys/poweroff");
945 qemu_fdt_setprop_string(fdt, "/gpio-keys/poweroff",
946 "label", "GPIO Key Poweroff");
947 qemu_fdt_setprop_cell(fdt, "/gpio-keys/poweroff", "linux,code",
948 KEY_POWER);
949 qemu_fdt_setprop_cells(fdt, "/gpio-keys/poweroff",
950 "gpios", phandle, 3, 0);
951}
952
953#define SECURE_GPIO_POWEROFF 0
954#define SECURE_GPIO_RESET 1
955
956static void create_secure_gpio_pwr(char *fdt, DeviceState *pl061_dev,
957 uint32_t phandle)
958{
959 DeviceState *gpio_pwr_dev;
960
961
962 gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL);
963
964
965 qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_RESET,
966 qdev_get_gpio_in_named(gpio_pwr_dev, "reset", 0));
967 qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_POWEROFF,
968 qdev_get_gpio_in_named(gpio_pwr_dev, "shutdown", 0));
969
970 qemu_fdt_add_subnode(fdt, "/gpio-poweroff");
971 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "compatible",
972 "gpio-poweroff");
973 qemu_fdt_setprop_cells(fdt, "/gpio-poweroff",
974 "gpios", phandle, SECURE_GPIO_POWEROFF, 0);
975 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "status", "disabled");
976 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "secure-status",
977 "okay");
978
979 qemu_fdt_add_subnode(fdt, "/gpio-restart");
980 qemu_fdt_setprop_string(fdt, "/gpio-restart", "compatible",
981 "gpio-restart");
982 qemu_fdt_setprop_cells(fdt, "/gpio-restart",
983 "gpios", phandle, SECURE_GPIO_RESET, 0);
984 qemu_fdt_setprop_string(fdt, "/gpio-restart", "status", "disabled");
985 qemu_fdt_setprop_string(fdt, "/gpio-restart", "secure-status",
986 "okay");
987}
988
989static void create_gpio_devices(const VirtMachineState *vms, int gpio,
990 MemoryRegion *mem)
991{
992 char *nodename;
993 DeviceState *pl061_dev;
994 hwaddr base = vms->memmap[gpio].base;
995 hwaddr size = vms->memmap[gpio].size;
996 int irq = vms->irqmap[gpio];
997 const char compat[] = "arm,pl061\0arm,primecell";
998 SysBusDevice *s;
999 MachineState *ms = MACHINE(vms);
1000
1001 pl061_dev = qdev_new("pl061");
1002
1003 qdev_prop_set_uint32(pl061_dev, "pullups", 0);
1004 qdev_prop_set_uint32(pl061_dev, "pulldowns", 0xff);
1005 s = SYS_BUS_DEVICE(pl061_dev);
1006 sysbus_realize_and_unref(s, &error_fatal);
1007 memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
1008 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
1009
1010 uint32_t phandle = qemu_fdt_alloc_phandle(ms->fdt);
1011 nodename = g_strdup_printf("/pl061@%" PRIx64, base);
1012 qemu_fdt_add_subnode(ms->fdt, nodename);
1013 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1014 2, base, 2, size);
1015 qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat));
1016 qemu_fdt_setprop_cell(ms->fdt, nodename, "#gpio-cells", 2);
1017 qemu_fdt_setprop(ms->fdt, nodename, "gpio-controller", NULL, 0);
1018 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
1019 GIC_FDT_IRQ_TYPE_SPI, irq,
1020 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
1021 qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle);
1022 qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk");
1023 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", phandle);
1024
1025 if (gpio != VIRT_GPIO) {
1026
1027 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled");
1028 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
1029 }
1030 g_free(nodename);
1031
1032
1033 if (gpio == VIRT_GPIO) {
1034 create_gpio_keys(ms->fdt, pl061_dev, phandle);
1035 } else {
1036 create_secure_gpio_pwr(ms->fdt, pl061_dev, phandle);
1037 }
1038}
1039
1040static void create_virtio_devices(const VirtMachineState *vms)
1041{
1042 int i;
1043 hwaddr size = vms->memmap[VIRT_MMIO].size;
1044 MachineState *ms = MACHINE(vms);
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073 for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
1074 int irq = vms->irqmap[VIRT_MMIO] + i;
1075 hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
1076
1077 sysbus_create_simple("virtio-mmio", base,
1078 qdev_get_gpio_in(vms->gic, irq));
1079 }
1080
1081
1082
1083
1084
1085
1086
1087
1088 for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) {
1089 char *nodename;
1090 int irq = vms->irqmap[VIRT_MMIO] + i;
1091 hwaddr base = vms->memmap[VIRT_MMIO].base + i * size;
1092
1093 nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
1094 qemu_fdt_add_subnode(ms->fdt, nodename);
1095 qemu_fdt_setprop_string(ms->fdt, nodename,
1096 "compatible", "virtio,mmio");
1097 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1098 2, base, 2, size);
1099 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts",
1100 GIC_FDT_IRQ_TYPE_SPI, irq,
1101 GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
1102 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
1103 g_free(nodename);
1104 }
1105}
1106
1107#define VIRT_FLASH_SECTOR_SIZE (256 * KiB)
1108
1109static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
1110 const char *name,
1111 const char *alias_prop_name)
1112{
1113
1114
1115
1116
1117 DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
1118
1119 qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
1120 qdev_prop_set_uint8(dev, "width", 4);
1121 qdev_prop_set_uint8(dev, "device-width", 2);
1122 qdev_prop_set_bit(dev, "big-endian", false);
1123 qdev_prop_set_uint16(dev, "id0", 0x89);
1124 qdev_prop_set_uint16(dev, "id1", 0x18);
1125 qdev_prop_set_uint16(dev, "id2", 0x00);
1126 qdev_prop_set_uint16(dev, "id3", 0x00);
1127 qdev_prop_set_string(dev, "name", name);
1128 object_property_add_child(OBJECT(vms), name, OBJECT(dev));
1129 object_property_add_alias(OBJECT(vms), alias_prop_name,
1130 OBJECT(dev), "drive");
1131 return PFLASH_CFI01(dev);
1132}
1133
1134static void virt_flash_create(VirtMachineState *vms)
1135{
1136 vms->flash[0] = virt_flash_create1(vms, "virt.flash0", "pflash0");
1137 vms->flash[1] = virt_flash_create1(vms, "virt.flash1", "pflash1");
1138}
1139
1140static void virt_flash_map1(PFlashCFI01 *flash,
1141 hwaddr base, hwaddr size,
1142 MemoryRegion *sysmem)
1143{
1144 DeviceState *dev = DEVICE(flash);
1145
1146 assert(QEMU_IS_ALIGNED(size, VIRT_FLASH_SECTOR_SIZE));
1147 assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
1148 qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
1149 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1150
1151 memory_region_add_subregion(sysmem, base,
1152 sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
1153 0));
1154}
1155
1156static void virt_flash_map(VirtMachineState *vms,
1157 MemoryRegion *sysmem,
1158 MemoryRegion *secure_sysmem)
1159{
1160
1161
1162
1163
1164
1165
1166
1167
1168 hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
1169 hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
1170
1171 virt_flash_map1(vms->flash[0], flashbase, flashsize,
1172 secure_sysmem);
1173 virt_flash_map1(vms->flash[1], flashbase + flashsize, flashsize,
1174 sysmem);
1175}
1176
1177static void virt_flash_fdt(VirtMachineState *vms,
1178 MemoryRegion *sysmem,
1179 MemoryRegion *secure_sysmem)
1180{
1181 hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
1182 hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
1183 MachineState *ms = MACHINE(vms);
1184 char *nodename;
1185
1186 if (sysmem == secure_sysmem) {
1187
1188 nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
1189 qemu_fdt_add_subnode(ms->fdt, nodename);
1190 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash");
1191 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1192 2, flashbase, 2, flashsize,
1193 2, flashbase + flashsize, 2, flashsize);
1194 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4);
1195 g_free(nodename);
1196 } else {
1197
1198
1199
1200
1201 nodename = g_strdup_printf("/secflash@%" PRIx64, flashbase);
1202 qemu_fdt_add_subnode(ms->fdt, nodename);
1203 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash");
1204 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1205 2, flashbase, 2, flashsize);
1206 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4);
1207 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled");
1208 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
1209 g_free(nodename);
1210
1211 nodename = g_strdup_printf("/flash@%" PRIx64, flashbase + flashsize);
1212 qemu_fdt_add_subnode(ms->fdt, nodename);
1213 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash");
1214 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1215 2, flashbase + flashsize, 2, flashsize);
1216 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4);
1217 g_free(nodename);
1218 }
1219}
1220
1221static bool virt_firmware_init(VirtMachineState *vms,
1222 MemoryRegion *sysmem,
1223 MemoryRegion *secure_sysmem)
1224{
1225 int i;
1226 const char *bios_name;
1227 BlockBackend *pflash_blk0;
1228
1229
1230 for (i = 0; i < ARRAY_SIZE(vms->flash); i++) {
1231 pflash_cfi01_legacy_drive(vms->flash[i],
1232 drive_get(IF_PFLASH, 0, i));
1233 }
1234
1235 virt_flash_map(vms, sysmem, secure_sysmem);
1236
1237 pflash_blk0 = pflash_cfi01_get_blk(vms->flash[0]);
1238
1239 bios_name = MACHINE(vms)->firmware;
1240 if (bios_name) {
1241 char *fname;
1242 MemoryRegion *mr;
1243 int image_size;
1244
1245 if (pflash_blk0) {
1246 error_report("The contents of the first flash device may be "
1247 "specified with -bios or with -drive if=pflash... "
1248 "but you cannot use both options at once");
1249 exit(1);
1250 }
1251
1252
1253
1254 fname = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
1255 if (!fname) {
1256 error_report("Could not find ROM image '%s'", bios_name);
1257 exit(1);
1258 }
1259 mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(vms->flash[0]), 0);
1260 image_size = load_image_mr(fname, mr);
1261 g_free(fname);
1262 if (image_size < 0) {
1263 error_report("Could not load ROM image '%s'", bios_name);
1264 exit(1);
1265 }
1266 }
1267
1268 return pflash_blk0 || bios_name;
1269}
1270
1271static FWCfgState *create_fw_cfg(const VirtMachineState *vms, AddressSpace *as)
1272{
1273 MachineState *ms = MACHINE(vms);
1274 hwaddr base = vms->memmap[VIRT_FW_CFG].base;
1275 hwaddr size = vms->memmap[VIRT_FW_CFG].size;
1276 FWCfgState *fw_cfg;
1277 char *nodename;
1278
1279 fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16, as);
1280 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus);
1281
1282 nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
1283 qemu_fdt_add_subnode(ms->fdt, nodename);
1284 qemu_fdt_setprop_string(ms->fdt, nodename,
1285 "compatible", "qemu,fw-cfg-mmio");
1286 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1287 2, base, 2, size);
1288 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
1289 g_free(nodename);
1290 return fw_cfg;
1291}
1292
1293static void create_pcie_irq_map(const MachineState *ms,
1294 uint32_t gic_phandle,
1295 int first_irq, const char *nodename)
1296{
1297 int devfn, pin;
1298 uint32_t full_irq_map[4 * 4 * 10] = { 0 };
1299 uint32_t *irq_map = full_irq_map;
1300
1301 for (devfn = 0; devfn <= 0x18; devfn += 0x8) {
1302 for (pin = 0; pin < 4; pin++) {
1303 int irq_type = GIC_FDT_IRQ_TYPE_SPI;
1304 int irq_nr = first_irq + ((pin + PCI_SLOT(devfn)) % PCI_NUM_PINS);
1305 int irq_level = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
1306 int i;
1307
1308 uint32_t map[] = {
1309 devfn << 8, 0, 0,
1310 pin + 1,
1311 gic_phandle, 0, 0, irq_type, irq_nr, irq_level };
1312
1313
1314 for (i = 0; i < 10; i++) {
1315 irq_map[i] = cpu_to_be32(map[i]);
1316 }
1317 irq_map += 10;
1318 }
1319 }
1320
1321 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-map",
1322 full_irq_map, sizeof(full_irq_map));
1323
1324 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupt-map-mask",
1325 cpu_to_be16(PCI_DEVFN(3, 0)),
1326 0, 0,
1327 0x7 );
1328}
1329
1330static void create_smmu(const VirtMachineState *vms,
1331 PCIBus *bus)
1332{
1333 char *node;
1334 const char compat[] = "arm,smmu-v3";
1335 int irq = vms->irqmap[VIRT_SMMU];
1336 int i;
1337 hwaddr base = vms->memmap[VIRT_SMMU].base;
1338 hwaddr size = vms->memmap[VIRT_SMMU].size;
1339 const char irq_names[] = "eventq\0priq\0cmdq-sync\0gerror";
1340 DeviceState *dev;
1341 MachineState *ms = MACHINE(vms);
1342
1343 if (vms->iommu != VIRT_IOMMU_SMMUV3 || !vms->iommu_phandle) {
1344 return;
1345 }
1346
1347 dev = qdev_new(TYPE_ARM_SMMUV3);
1348
1349 object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus),
1350 &error_abort);
1351 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1352 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
1353 for (i = 0; i < NUM_SMMU_IRQS; i++) {
1354 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
1355 qdev_get_gpio_in(vms->gic, irq + i));
1356 }
1357
1358 node = g_strdup_printf("/smmuv3@%" PRIx64, base);
1359 qemu_fdt_add_subnode(ms->fdt, node);
1360 qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat));
1361 qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg", 2, base, 2, size);
1362
1363 qemu_fdt_setprop_cells(ms->fdt, node, "interrupts",
1364 GIC_FDT_IRQ_TYPE_SPI, irq , GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
1365 GIC_FDT_IRQ_TYPE_SPI, irq + 1, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
1366 GIC_FDT_IRQ_TYPE_SPI, irq + 2, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
1367 GIC_FDT_IRQ_TYPE_SPI, irq + 3, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
1368
1369 qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names,
1370 sizeof(irq_names));
1371
1372 qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0);
1373
1374 qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
1375
1376 qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle);
1377 g_free(node);
1378}
1379
1380static void create_virtio_iommu_dt_bindings(VirtMachineState *vms)
1381{
1382 const char compat[] = "virtio,pci-iommu\0pci1af4,1057";
1383 uint16_t bdf = vms->virtio_iommu_bdf;
1384 MachineState *ms = MACHINE(vms);
1385 char *node;
1386
1387 vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt);
1388
1389 node = g_strdup_printf("%s/virtio_iommu@%x,%x", vms->pciehb_nodename,
1390 PCI_SLOT(bdf), PCI_FUNC(bdf));
1391 qemu_fdt_add_subnode(ms->fdt, node);
1392 qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat));
1393 qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg",
1394 1, bdf << 8, 1, 0, 1, 0,
1395 1, 0, 1, 0);
1396
1397 qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
1398 qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle);
1399 g_free(node);
1400
1401 qemu_fdt_setprop_cells(ms->fdt, vms->pciehb_nodename, "iommu-map",
1402 0x0, vms->iommu_phandle, 0x0, bdf,
1403 bdf + 1, vms->iommu_phandle, bdf + 1, 0xffff - bdf);
1404}
1405
1406static void create_pcie(VirtMachineState *vms)
1407{
1408 hwaddr base_mmio = vms->memmap[VIRT_PCIE_MMIO].base;
1409 hwaddr size_mmio = vms->memmap[VIRT_PCIE_MMIO].size;
1410 hwaddr base_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].base;
1411 hwaddr size_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].size;
1412 hwaddr base_pio = vms->memmap[VIRT_PCIE_PIO].base;
1413 hwaddr size_pio = vms->memmap[VIRT_PCIE_PIO].size;
1414 hwaddr base_ecam, size_ecam;
1415 hwaddr base = base_mmio;
1416 int nr_pcie_buses;
1417 int irq = vms->irqmap[VIRT_PCIE];
1418 MemoryRegion *mmio_alias;
1419 MemoryRegion *mmio_reg;
1420 MemoryRegion *ecam_alias;
1421 MemoryRegion *ecam_reg;
1422 DeviceState *dev;
1423 char *nodename;
1424 int i, ecam_id;
1425 PCIHostState *pci;
1426 MachineState *ms = MACHINE(vms);
1427
1428 dev = qdev_new(TYPE_GPEX_HOST);
1429 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1430
1431 ecam_id = VIRT_ECAM_ID(vms->highmem_ecam);
1432 base_ecam = vms->memmap[ecam_id].base;
1433 size_ecam = vms->memmap[ecam_id].size;
1434 nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
1435
1436 ecam_alias = g_new0(MemoryRegion, 1);
1437 ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
1438 memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam",
1439 ecam_reg, 0, size_ecam);
1440 memory_region_add_subregion(get_system_memory(), base_ecam, ecam_alias);
1441
1442
1443
1444
1445
1446
1447 mmio_alias = g_new0(MemoryRegion, 1);
1448 mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
1449 memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio",
1450 mmio_reg, base_mmio, size_mmio);
1451 memory_region_add_subregion(get_system_memory(), base_mmio, mmio_alias);
1452
1453 if (vms->highmem_mmio) {
1454
1455 MemoryRegion *high_mmio_alias = g_new0(MemoryRegion, 1);
1456
1457 memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high",
1458 mmio_reg, base_mmio_high, size_mmio_high);
1459 memory_region_add_subregion(get_system_memory(), base_mmio_high,
1460 high_mmio_alias);
1461 }
1462
1463
1464 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
1465
1466 for (i = 0; i < GPEX_NUM_IRQS; i++) {
1467 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
1468 qdev_get_gpio_in(vms->gic, irq + i));
1469 gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
1470 }
1471
1472 pci = PCI_HOST_BRIDGE(dev);
1473 pci->bypass_iommu = vms->default_bus_bypass_iommu;
1474 vms->bus = pci->bus;
1475 if (vms->bus) {
1476 for (i = 0; i < nb_nics; i++) {
1477 NICInfo *nd = &nd_table[i];
1478
1479 if (!nd->model) {
1480 nd->model = g_strdup("virtio");
1481 }
1482
1483 pci_nic_init_nofail(nd, pci->bus, nd->model, NULL);
1484 }
1485 }
1486
1487 nodename = vms->pciehb_nodename = g_strdup_printf("/pcie@%" PRIx64, base);
1488 qemu_fdt_add_subnode(ms->fdt, nodename);
1489 qemu_fdt_setprop_string(ms->fdt, nodename,
1490 "compatible", "pci-host-ecam-generic");
1491 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "pci");
1492 qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 3);
1493 qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 2);
1494 qemu_fdt_setprop_cell(ms->fdt, nodename, "linux,pci-domain", 0);
1495 qemu_fdt_setprop_cells(ms->fdt, nodename, "bus-range", 0,
1496 nr_pcie_buses - 1);
1497 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0);
1498
1499 if (vms->msi_phandle) {
1500 qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-map",
1501 0, vms->msi_phandle, 0, 0x10000);
1502 }
1503
1504 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg",
1505 2, base_ecam, 2, size_ecam);
1506
1507 if (vms->highmem_mmio) {
1508 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "ranges",
1509 1, FDT_PCI_RANGE_IOPORT, 2, 0,
1510 2, base_pio, 2, size_pio,
1511 1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
1512 2, base_mmio, 2, size_mmio,
1513 1, FDT_PCI_RANGE_MMIO_64BIT,
1514 2, base_mmio_high,
1515 2, base_mmio_high, 2, size_mmio_high);
1516 } else {
1517 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "ranges",
1518 1, FDT_PCI_RANGE_IOPORT, 2, 0,
1519 2, base_pio, 2, size_pio,
1520 1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
1521 2, base_mmio, 2, size_mmio);
1522 }
1523
1524 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1);
1525 create_pcie_irq_map(ms, vms->gic_phandle, irq, nodename);
1526
1527 if (vms->iommu) {
1528 vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt);
1529
1530 switch (vms->iommu) {
1531 case VIRT_IOMMU_SMMUV3:
1532 create_smmu(vms, vms->bus);
1533 qemu_fdt_setprop_cells(ms->fdt, nodename, "iommu-map",
1534 0x0, vms->iommu_phandle, 0x0, 0x10000);
1535 break;
1536 default:
1537 g_assert_not_reached();
1538 }
1539 }
1540}
1541
1542static void create_platform_bus(VirtMachineState *vms)
1543{
1544 DeviceState *dev;
1545 SysBusDevice *s;
1546 int i;
1547 MemoryRegion *sysmem = get_system_memory();
1548
1549 dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
1550 dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
1551 qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
1552 qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
1553 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1554 vms->platform_bus_dev = dev;
1555
1556 s = SYS_BUS_DEVICE(dev);
1557 for (i = 0; i < PLATFORM_BUS_NUM_IRQS; i++) {
1558 int irq = vms->irqmap[VIRT_PLATFORM_BUS] + i;
1559 sysbus_connect_irq(s, i, qdev_get_gpio_in(vms->gic, irq));
1560 }
1561
1562 memory_region_add_subregion(sysmem,
1563 vms->memmap[VIRT_PLATFORM_BUS].base,
1564 sysbus_mmio_get_region(s, 0));
1565}
1566
1567static void create_tag_ram(MemoryRegion *tag_sysmem,
1568 hwaddr base, hwaddr size,
1569 const char *name)
1570{
1571 MemoryRegion *tagram = g_new(MemoryRegion, 1);
1572
1573 memory_region_init_ram(tagram, NULL, name, size / 32, &error_fatal);
1574 memory_region_add_subregion(tag_sysmem, base / 32, tagram);
1575}
1576
1577static void create_secure_ram(VirtMachineState *vms,
1578 MemoryRegion *secure_sysmem,
1579 MemoryRegion *secure_tag_sysmem)
1580{
1581 MemoryRegion *secram = g_new(MemoryRegion, 1);
1582 char *nodename;
1583 hwaddr base = vms->memmap[VIRT_SECURE_MEM].base;
1584 hwaddr size = vms->memmap[VIRT_SECURE_MEM].size;
1585 MachineState *ms = MACHINE(vms);
1586
1587 memory_region_init_ram(secram, NULL, "virt.secure-ram", size,
1588 &error_fatal);
1589 memory_region_add_subregion(secure_sysmem, base, secram);
1590
1591 nodename = g_strdup_printf("/secram@%" PRIx64, base);
1592 qemu_fdt_add_subnode(ms->fdt, nodename);
1593 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
1594 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
1595 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled");
1596 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
1597
1598 if (secure_tag_sysmem) {
1599 create_tag_ram(secure_tag_sysmem, base, size, "mach-virt.secure-tag");
1600 }
1601
1602 g_free(nodename);
1603}
1604
1605static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
1606{
1607 const VirtMachineState *board = container_of(binfo, VirtMachineState,
1608 bootinfo);
1609 MachineState *ms = MACHINE(board);
1610
1611
1612 *fdt_size = board->fdt_size;
1613 return ms->fdt;
1614}
1615
1616static void virt_build_smbios(VirtMachineState *vms)
1617{
1618 MachineClass *mc = MACHINE_GET_CLASS(vms);
1619 MachineState *ms = MACHINE(vms);
1620 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
1621 uint8_t *smbios_tables, *smbios_anchor;
1622 size_t smbios_tables_len, smbios_anchor_len;
1623 struct smbios_phys_mem_area mem_array;
1624 const char *product = "QEMU Virtual Machine";
1625
1626 if (kvm_enabled()) {
1627 product = "KVM Virtual Machine";
1628 }
1629
1630 smbios_set_defaults("QEMU", product,
1631 vmc->smbios_old_sys_ver ? "1.0" : mc->name, false,
1632 true, SMBIOS_ENTRY_POINT_TYPE_64);
1633
1634
1635 mem_array.address = vms->memmap[VIRT_MEM].base;
1636 mem_array.length = ms->ram_size;
1637
1638 smbios_get_tables(ms, &mem_array, 1,
1639 &smbios_tables, &smbios_tables_len,
1640 &smbios_anchor, &smbios_anchor_len,
1641 &error_fatal);
1642
1643 if (smbios_anchor) {
1644 fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-tables",
1645 smbios_tables, smbios_tables_len);
1646 fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-anchor",
1647 smbios_anchor, smbios_anchor_len);
1648 }
1649}
1650
1651static
1652void virt_machine_done(Notifier *notifier, void *data)
1653{
1654 VirtMachineState *vms = container_of(notifier, VirtMachineState,
1655 machine_done);
1656 MachineState *ms = MACHINE(vms);
1657 ARMCPU *cpu = ARM_CPU(first_cpu);
1658 struct arm_boot_info *info = &vms->bootinfo;
1659 AddressSpace *as = arm_boot_address_space(cpu, info);
1660
1661
1662
1663
1664
1665
1666
1667
1668 if (info->dtb_filename == NULL) {
1669 platform_bus_add_all_fdt_nodes(ms->fdt, "/intc",
1670 vms->memmap[VIRT_PLATFORM_BUS].base,
1671 vms->memmap[VIRT_PLATFORM_BUS].size,
1672 vms->irqmap[VIRT_PLATFORM_BUS]);
1673 }
1674 if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms) < 0) {
1675 exit(1);
1676 }
1677
1678 fw_cfg_add_extra_pci_roots(vms->bus, vms->fw_cfg);
1679
1680 virt_acpi_setup(vms);
1681 virt_build_smbios(vms);
1682}
1683
1684static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
1685{
1686 uint8_t clustersz = ARM_DEFAULT_CPUS_PER_CLUSTER;
1687 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
1688
1689 if (!vmc->disallow_affinity_adjustment) {
1690
1691
1692
1693
1694
1695
1696
1697
1698 if (vms->gic_version == VIRT_GIC_VERSION_2) {
1699 clustersz = GIC_TARGETLIST_BITS;
1700 } else {
1701 clustersz = GICV3_TARGETLIST_BITS;
1702 }
1703 }
1704 return arm_cpu_mp_affinity(idx, clustersz);
1705}
1706
1707static inline bool *virt_get_high_memmap_enabled(VirtMachineState *vms,
1708 int index)
1709{
1710 bool *enabled_array[] = {
1711 &vms->highmem_redists,
1712 &vms->highmem_ecam,
1713 &vms->highmem_mmio,
1714 };
1715
1716 assert(ARRAY_SIZE(extended_memmap) - VIRT_LOWMEMMAP_LAST ==
1717 ARRAY_SIZE(enabled_array));
1718 assert(index - VIRT_LOWMEMMAP_LAST < ARRAY_SIZE(enabled_array));
1719
1720 return enabled_array[index - VIRT_LOWMEMMAP_LAST];
1721}
1722
1723static void virt_set_high_memmap(VirtMachineState *vms,
1724 hwaddr base, int pa_bits)
1725{
1726 hwaddr region_base, region_size;
1727 bool *region_enabled, fits;
1728 int i;
1729
1730 for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
1731 region_enabled = virt_get_high_memmap_enabled(vms, i);
1732 region_base = ROUND_UP(base, extended_memmap[i].size);
1733 region_size = extended_memmap[i].size;
1734
1735 vms->memmap[i].base = region_base;
1736 vms->memmap[i].size = region_size;
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746 fits = (region_base + region_size) <= BIT_ULL(pa_bits);
1747 *region_enabled &= fits;
1748 if (vms->highmem_compact && !*region_enabled) {
1749 continue;
1750 }
1751
1752 base = region_base + region_size;
1753 if (fits) {
1754 vms->highest_gpa = base - 1;
1755 }
1756 }
1757}
1758
1759static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
1760{
1761 MachineState *ms = MACHINE(vms);
1762 hwaddr base, device_memory_base, device_memory_size, memtop;
1763 int i;
1764
1765 vms->memmap = extended_memmap;
1766
1767 for (i = 0; i < ARRAY_SIZE(base_memmap); i++) {
1768 vms->memmap[i] = base_memmap[i];
1769 }
1770
1771 if (ms->ram_slots > ACPI_MAX_RAM_SLOTS) {
1772 error_report("unsupported number of memory slots: %"PRIu64,
1773 ms->ram_slots);
1774 exit(EXIT_FAILURE);
1775 }
1776
1777
1778
1779
1780
1781 if (!vms->highmem) {
1782 pa_bits = 32;
1783 }
1784
1785
1786
1787
1788
1789
1790
1791
1792 device_memory_base =
1793 ROUND_UP(vms->memmap[VIRT_MEM].base + ms->ram_size, GiB);
1794 device_memory_size = ms->maxram_size - ms->ram_size + ms->ram_slots * GiB;
1795
1796
1797 memtop = base = device_memory_base + ROUND_UP(device_memory_size, GiB);
1798 if (memtop > BIT_ULL(pa_bits)) {
1799 error_report("Addressing limited to %d bits, but memory exceeds it by %llu bytes\n",
1800 pa_bits, memtop - BIT_ULL(pa_bits));
1801 exit(EXIT_FAILURE);
1802 }
1803 if (base < device_memory_base) {
1804 error_report("maxmem/slots too huge");
1805 exit(EXIT_FAILURE);
1806 }
1807 if (base < vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES) {
1808 base = vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES;
1809 }
1810
1811
1812 vms->highest_gpa = memtop - 1;
1813
1814 virt_set_high_memmap(vms, base, pa_bits);
1815
1816 if (device_memory_size > 0) {
1817 ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
1818 ms->device_memory->base = device_memory_base;
1819 memory_region_init(&ms->device_memory->mr, OBJECT(vms),
1820 "device-memory", device_memory_size);
1821 }
1822}
1823
1824static VirtGICType finalize_gic_version_do(const char *accel_name,
1825 VirtGICType gic_version,
1826 int gics_supported,
1827 unsigned int max_cpus)
1828{
1829
1830 switch (gic_version) {
1831 case VIRT_GIC_VERSION_HOST:
1832 if (!kvm_enabled()) {
1833 error_report("gic-version=host requires KVM");
1834 exit(1);
1835 }
1836
1837
1838 return finalize_gic_version_do(accel_name, VIRT_GIC_VERSION_MAX,
1839 gics_supported, max_cpus);
1840 case VIRT_GIC_VERSION_MAX:
1841 if (gics_supported & VIRT_GIC_VERSION_4_MASK) {
1842 gic_version = VIRT_GIC_VERSION_4;
1843 } else if (gics_supported & VIRT_GIC_VERSION_3_MASK) {
1844 gic_version = VIRT_GIC_VERSION_3;
1845 } else {
1846 gic_version = VIRT_GIC_VERSION_2;
1847 }
1848 break;
1849 case VIRT_GIC_VERSION_NOSEL:
1850 if ((gics_supported & VIRT_GIC_VERSION_2_MASK) &&
1851 max_cpus <= GIC_NCPU) {
1852 gic_version = VIRT_GIC_VERSION_2;
1853 } else if (gics_supported & VIRT_GIC_VERSION_3_MASK) {
1854
1855
1856
1857
1858
1859 gic_version = VIRT_GIC_VERSION_3;
1860 } else if (max_cpus > GIC_NCPU) {
1861 error_report("%s only supports GICv2 emulation but more than 8 "
1862 "vcpus are requested", accel_name);
1863 exit(1);
1864 }
1865 break;
1866 case VIRT_GIC_VERSION_2:
1867 case VIRT_GIC_VERSION_3:
1868 case VIRT_GIC_VERSION_4:
1869 break;
1870 }
1871
1872
1873 switch (gic_version) {
1874 case VIRT_GIC_VERSION_2:
1875 if (!(gics_supported & VIRT_GIC_VERSION_2_MASK)) {
1876 error_report("%s does not support GICv2 emulation", accel_name);
1877 exit(1);
1878 }
1879 break;
1880 case VIRT_GIC_VERSION_3:
1881 if (!(gics_supported & VIRT_GIC_VERSION_3_MASK)) {
1882 error_report("%s does not support GICv3 emulation", accel_name);
1883 exit(1);
1884 }
1885 break;
1886 case VIRT_GIC_VERSION_4:
1887 if (!(gics_supported & VIRT_GIC_VERSION_4_MASK)) {
1888 error_report("%s does not support GICv4 emulation, is virtualization=on?",
1889 accel_name);
1890 exit(1);
1891 }
1892 break;
1893 default:
1894 error_report("logic error in finalize_gic_version");
1895 exit(1);
1896 break;
1897 }
1898
1899 return gic_version;
1900}
1901
1902
1903
1904
1905
1906
1907
1908static void finalize_gic_version(VirtMachineState *vms)
1909{
1910 const char *accel_name = current_accel_name();
1911 unsigned int max_cpus = MACHINE(vms)->smp.max_cpus;
1912 int gics_supported = 0;
1913
1914
1915 if (kvm_enabled() && kvm_irqchip_in_kernel()) {
1916 int probe_bitmap = kvm_arm_vgic_probe();
1917
1918 if (!probe_bitmap) {
1919 error_report("Unable to determine GIC version supported by host");
1920 exit(1);
1921 }
1922
1923 if (probe_bitmap & KVM_ARM_VGIC_V2) {
1924 gics_supported |= VIRT_GIC_VERSION_2_MASK;
1925 }
1926 if (probe_bitmap & KVM_ARM_VGIC_V3) {
1927 gics_supported |= VIRT_GIC_VERSION_3_MASK;
1928 }
1929 } else if (kvm_enabled() && !kvm_irqchip_in_kernel()) {
1930
1931 gics_supported |= VIRT_GIC_VERSION_2_MASK;
1932 accel_name = "KVM with kernel-irqchip=off";
1933 } else if (tcg_enabled() || hvf_enabled() || qtest_enabled()) {
1934 gics_supported |= VIRT_GIC_VERSION_2_MASK;
1935 if (module_object_class_by_name("arm-gicv3")) {
1936 gics_supported |= VIRT_GIC_VERSION_3_MASK;
1937 if (vms->virt) {
1938
1939 gics_supported |= VIRT_GIC_VERSION_4_MASK;
1940 }
1941 }
1942 } else {
1943 error_report("Unsupported accelerator, can not determine GIC support");
1944 exit(1);
1945 }
1946
1947
1948
1949
1950
1951 vms->gic_version = finalize_gic_version_do(accel_name, vms->gic_version,
1952 gics_supported, max_cpus);
1953}
1954
1955
1956
1957
1958
1959static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
1960{
1961 int max_cpus = MACHINE(vms)->smp.max_cpus;
1962 bool aarch64, pmu, steal_time;
1963 CPUState *cpu;
1964
1965 aarch64 = object_property_get_bool(OBJECT(first_cpu), "aarch64", NULL);
1966 pmu = object_property_get_bool(OBJECT(first_cpu), "pmu", NULL);
1967 steal_time = object_property_get_bool(OBJECT(first_cpu),
1968 "kvm-steal-time", NULL);
1969
1970 if (kvm_enabled()) {
1971 hwaddr pvtime_reg_base = vms->memmap[VIRT_PVTIME].base;
1972 hwaddr pvtime_reg_size = vms->memmap[VIRT_PVTIME].size;
1973
1974 if (steal_time) {
1975 MemoryRegion *pvtime = g_new(MemoryRegion, 1);
1976 hwaddr pvtime_size = max_cpus * PVTIME_SIZE_PER_CPU;
1977
1978
1979 pvtime_size = REAL_HOST_PAGE_ALIGN(pvtime_size);
1980
1981 if (pvtime_size > pvtime_reg_size) {
1982 error_report("pvtime requires a %" HWADDR_PRId
1983 " byte memory region for %d CPUs,"
1984 " but only %" HWADDR_PRId " has been reserved",
1985 pvtime_size, max_cpus, pvtime_reg_size);
1986 exit(1);
1987 }
1988
1989 memory_region_init_ram(pvtime, NULL, "pvtime", pvtime_size, NULL);
1990 memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
1991 }
1992
1993 CPU_FOREACH(cpu) {
1994 if (pmu) {
1995 assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
1996 if (kvm_irqchip_in_kernel()) {
1997 kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
1998 }
1999 kvm_arm_pmu_init(cpu);
2000 }
2001 if (steal_time) {
2002 kvm_arm_pvtime_init(cpu, pvtime_reg_base +
2003 cpu->cpu_index * PVTIME_SIZE_PER_CPU);
2004 }
2005 }
2006 } else {
2007 if (aarch64 && vms->highmem) {
2008 int requested_pa_size = 64 - clz64(vms->highest_gpa);
2009 int pamax = arm_pamax(ARM_CPU(first_cpu));
2010
2011 if (pamax < requested_pa_size) {
2012 error_report("VCPU supports less PA bits (%d) than "
2013 "requested by the memory map (%d)",
2014 pamax, requested_pa_size);
2015 exit(1);
2016 }
2017 }
2018 }
2019}
2020
2021static void machvirt_init(MachineState *machine)
2022{
2023 VirtMachineState *vms = VIRT_MACHINE(machine);
2024 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
2025 MachineClass *mc = MACHINE_GET_CLASS(machine);
2026 const CPUArchIdList *possible_cpus;
2027 MemoryRegion *sysmem = get_system_memory();
2028 MemoryRegion *secure_sysmem = NULL;
2029 MemoryRegion *tag_sysmem = NULL;
2030 MemoryRegion *secure_tag_sysmem = NULL;
2031 int n, virt_max_cpus;
2032 bool firmware_loaded;
2033 bool aarch64 = true;
2034 bool has_ged = !vmc->no_ged;
2035 unsigned int smp_cpus = machine->smp.cpus;
2036 unsigned int max_cpus = machine->smp.max_cpus;
2037
2038 if (!cpu_type_valid(machine->cpu_type)) {
2039 error_report("mach-virt: CPU type %s not supported", machine->cpu_type);
2040 exit(1);
2041 }
2042
2043 possible_cpus = mc->possible_cpu_arch_ids(machine);
2044
2045
2046
2047
2048
2049 if (!vms->memmap) {
2050 Object *cpuobj;
2051 ARMCPU *armcpu;
2052 int pa_bits;
2053
2054
2055
2056
2057
2058
2059 cpuobj = object_new(possible_cpus->cpus[0].type);
2060 armcpu = ARM_CPU(cpuobj);
2061
2062 pa_bits = arm_pamax(armcpu);
2063
2064 object_unref(cpuobj);
2065
2066 virt_set_memmap(vms, pa_bits);
2067 }
2068
2069
2070
2071
2072 finalize_gic_version(vms);
2073
2074 if (vms->secure) {
2075
2076
2077
2078
2079
2080
2081 secure_sysmem = g_new(MemoryRegion, 1);
2082 memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory",
2083 UINT64_MAX);
2084 memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1);
2085 }
2086
2087 firmware_loaded = virt_firmware_init(vms, sysmem,
2088 secure_sysmem ?: sysmem);
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100 if (vms->secure && firmware_loaded) {
2101 vms->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
2102 } else if (vms->virt) {
2103 vms->psci_conduit = QEMU_PSCI_CONDUIT_SMC;
2104 } else {
2105 vms->psci_conduit = QEMU_PSCI_CONDUIT_HVC;
2106 }
2107
2108
2109
2110
2111
2112
2113 if (vms->gic_version == VIRT_GIC_VERSION_2) {
2114 virt_max_cpus = GIC_NCPU;
2115 } else {
2116 virt_max_cpus = virt_redist_capacity(vms, VIRT_GIC_REDIST);
2117 if (vms->highmem_redists) {
2118 virt_max_cpus += virt_redist_capacity(vms, VIRT_HIGH_GIC_REDIST2);
2119 }
2120 }
2121
2122 if (max_cpus > virt_max_cpus) {
2123 error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
2124 "supported by machine 'mach-virt' (%d)",
2125 max_cpus, virt_max_cpus);
2126 if (vms->gic_version != VIRT_GIC_VERSION_2 && !vms->highmem_redists) {
2127 error_printf("Try 'highmem-redists=on' for more CPUs\n");
2128 }
2129
2130 exit(1);
2131 }
2132
2133 if (vms->secure && (kvm_enabled() || hvf_enabled())) {
2134 error_report("mach-virt: %s does not support providing "
2135 "Security extensions (TrustZone) to the guest CPU",
2136 current_accel_name());
2137 exit(1);
2138 }
2139
2140 if (vms->virt && (kvm_enabled() || hvf_enabled())) {
2141 error_report("mach-virt: %s does not support providing "
2142 "Virtualization extensions to the guest CPU",
2143 current_accel_name());
2144 exit(1);
2145 }
2146
2147 if (vms->mte && (kvm_enabled() || hvf_enabled())) {
2148 error_report("mach-virt: %s does not support providing "
2149 "MTE to the guest CPU",
2150 current_accel_name());
2151 exit(1);
2152 }
2153
2154 create_fdt(vms);
2155
2156 assert(possible_cpus->len == max_cpus);
2157 for (n = 0; n < possible_cpus->len; n++) {
2158 Object *cpuobj;
2159 CPUState *cs;
2160
2161 if (n >= smp_cpus) {
2162 break;
2163 }
2164
2165 cpuobj = object_new(possible_cpus->cpus[n].type);
2166 object_property_set_int(cpuobj, "mp-affinity",
2167 possible_cpus->cpus[n].arch_id, NULL);
2168
2169 cs = CPU(cpuobj);
2170 cs->cpu_index = n;
2171
2172 numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj),
2173 &error_fatal);
2174
2175 aarch64 &= object_property_get_bool(cpuobj, "aarch64", NULL);
2176
2177 if (!vms->secure) {
2178 object_property_set_bool(cpuobj, "has_el3", false, NULL);
2179 }
2180
2181 if (!vms->virt && object_property_find(cpuobj, "has_el2")) {
2182 object_property_set_bool(cpuobj, "has_el2", false, NULL);
2183 }
2184
2185 if (vmc->kvm_no_adjvtime &&
2186 object_property_find(cpuobj, "kvm-no-adjvtime")) {
2187 object_property_set_bool(cpuobj, "kvm-no-adjvtime", true, NULL);
2188 }
2189
2190 if (vmc->no_kvm_steal_time &&
2191 object_property_find(cpuobj, "kvm-steal-time")) {
2192 object_property_set_bool(cpuobj, "kvm-steal-time", false, NULL);
2193 }
2194
2195 if (vmc->no_pmu && object_property_find(cpuobj, "pmu")) {
2196 object_property_set_bool(cpuobj, "pmu", false, NULL);
2197 }
2198
2199 if (vmc->no_tcg_lpa2 && object_property_find(cpuobj, "lpa2")) {
2200 object_property_set_bool(cpuobj, "lpa2", false, NULL);
2201 }
2202
2203 if (object_property_find(cpuobj, "reset-cbar")) {
2204 object_property_set_int(cpuobj, "reset-cbar",
2205 vms->memmap[VIRT_CPUPERIPHS].base,
2206 &error_abort);
2207 }
2208
2209 object_property_set_link(cpuobj, "memory", OBJECT(sysmem),
2210 &error_abort);
2211 if (vms->secure) {
2212 object_property_set_link(cpuobj, "secure-memory",
2213 OBJECT(secure_sysmem), &error_abort);
2214 }
2215
2216 if (vms->mte) {
2217
2218 if (!tag_sysmem) {
2219
2220
2221
2222
2223 if (!object_property_find(cpuobj, "tag-memory")) {
2224 error_report("MTE requested, but not supported "
2225 "by the guest CPU");
2226 exit(1);
2227 }
2228
2229 tag_sysmem = g_new(MemoryRegion, 1);
2230 memory_region_init(tag_sysmem, OBJECT(machine),
2231 "tag-memory", UINT64_MAX / 32);
2232
2233 if (vms->secure) {
2234 secure_tag_sysmem = g_new(MemoryRegion, 1);
2235 memory_region_init(secure_tag_sysmem, OBJECT(machine),
2236 "secure-tag-memory", UINT64_MAX / 32);
2237
2238
2239 memory_region_add_subregion_overlap(secure_tag_sysmem, 0,
2240 tag_sysmem, -1);
2241 }
2242 }
2243
2244 object_property_set_link(cpuobj, "tag-memory", OBJECT(tag_sysmem),
2245 &error_abort);
2246 if (vms->secure) {
2247 object_property_set_link(cpuobj, "secure-tag-memory",
2248 OBJECT(secure_tag_sysmem),
2249 &error_abort);
2250 }
2251 }
2252
2253 qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
2254 object_unref(cpuobj);
2255 }
2256 fdt_add_timer_nodes(vms);
2257 fdt_add_cpu_nodes(vms);
2258
2259 memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
2260 machine->ram);
2261 if (machine->device_memory) {
2262 memory_region_add_subregion(sysmem, machine->device_memory->base,
2263 &machine->device_memory->mr);
2264 }
2265
2266 virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
2267
2268 create_gic(vms, sysmem);
2269
2270 virt_cpu_post_init(vms, sysmem);
2271
2272 fdt_add_pmu_nodes(vms);
2273
2274 create_uart(vms, VIRT_UART, sysmem, serial_hd(0));
2275
2276 if (vms->secure) {
2277 create_secure_ram(vms, secure_sysmem, secure_tag_sysmem);
2278 create_uart(vms, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
2279 }
2280
2281 if (tag_sysmem) {
2282 create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base,
2283 machine->ram_size, "mach-virt.tag");
2284 }
2285
2286 vms->highmem_ecam &= (!firmware_loaded || aarch64);
2287
2288 create_rtc(vms);
2289
2290 create_pcie(vms);
2291
2292 if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
2293 vms->acpi_dev = create_acpi_ged(vms);
2294 } else {
2295 create_gpio_devices(vms, VIRT_GPIO, sysmem);
2296 }
2297
2298 if (vms->secure && !vmc->no_secure_gpio) {
2299 create_gpio_devices(vms, VIRT_SECURE_GPIO, secure_sysmem);
2300 }
2301
2302
2303 vms->powerdown_notifier.notify = virt_powerdown_req;
2304 qemu_register_powerdown_notifier(&vms->powerdown_notifier);
2305
2306
2307
2308
2309
2310 create_virtio_devices(vms);
2311
2312 vms->fw_cfg = create_fw_cfg(vms, &address_space_memory);
2313 rom_set_fw(vms->fw_cfg);
2314
2315 create_platform_bus(vms);
2316
2317 if (machine->nvdimms_state->is_enabled) {
2318 const struct AcpiGenericAddress arm_virt_nvdimm_acpi_dsmio = {
2319 .space_id = AML_AS_SYSTEM_MEMORY,
2320 .address = vms->memmap[VIRT_NVDIMM_ACPI].base,
2321 .bit_width = NVDIMM_ACPI_IO_LEN << 3
2322 };
2323
2324 nvdimm_init_acpi_state(machine->nvdimms_state, sysmem,
2325 arm_virt_nvdimm_acpi_dsmio,
2326 vms->fw_cfg, OBJECT(vms));
2327 }
2328
2329 vms->bootinfo.ram_size = machine->ram_size;
2330 vms->bootinfo.board_id = -1;
2331 vms->bootinfo.loader_start = vms->memmap[VIRT_MEM].base;
2332 vms->bootinfo.get_dtb = machvirt_dtb;
2333 vms->bootinfo.skip_dtb_autoload = true;
2334 vms->bootinfo.firmware_loaded = firmware_loaded;
2335 vms->bootinfo.psci_conduit = vms->psci_conduit;
2336 arm_load_kernel(ARM_CPU(first_cpu), machine, &vms->bootinfo);
2337
2338 vms->machine_done.notify = virt_machine_done;
2339 qemu_add_machine_init_done_notifier(&vms->machine_done);
2340}
2341
2342static bool virt_get_secure(Object *obj, Error **errp)
2343{
2344 VirtMachineState *vms = VIRT_MACHINE(obj);
2345
2346 return vms->secure;
2347}
2348
2349static void virt_set_secure(Object *obj, bool value, Error **errp)
2350{
2351 VirtMachineState *vms = VIRT_MACHINE(obj);
2352
2353 vms->secure = value;
2354}
2355
2356static bool virt_get_virt(Object *obj, Error **errp)
2357{
2358 VirtMachineState *vms = VIRT_MACHINE(obj);
2359
2360 return vms->virt;
2361}
2362
2363static void virt_set_virt(Object *obj, bool value, Error **errp)
2364{
2365 VirtMachineState *vms = VIRT_MACHINE(obj);
2366
2367 vms->virt = value;
2368}
2369
2370static bool virt_get_highmem(Object *obj, Error **errp)
2371{
2372 VirtMachineState *vms = VIRT_MACHINE(obj);
2373
2374 return vms->highmem;
2375}
2376
2377static void virt_set_highmem(Object *obj, bool value, Error **errp)
2378{
2379 VirtMachineState *vms = VIRT_MACHINE(obj);
2380
2381 vms->highmem = value;
2382}
2383
2384static bool virt_get_compact_highmem(Object *obj, Error **errp)
2385{
2386 VirtMachineState *vms = VIRT_MACHINE(obj);
2387
2388 return vms->highmem_compact;
2389}
2390
2391static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
2392{
2393 VirtMachineState *vms = VIRT_MACHINE(obj);
2394
2395 vms->highmem_compact = value;
2396}
2397
2398static bool virt_get_highmem_redists(Object *obj, Error **errp)
2399{
2400 VirtMachineState *vms = VIRT_MACHINE(obj);
2401
2402 return vms->highmem_redists;
2403}
2404
2405static void virt_set_highmem_redists(Object *obj, bool value, Error **errp)
2406{
2407 VirtMachineState *vms = VIRT_MACHINE(obj);
2408
2409 vms->highmem_redists = value;
2410}
2411
2412static bool virt_get_highmem_ecam(Object *obj, Error **errp)
2413{
2414 VirtMachineState *vms = VIRT_MACHINE(obj);
2415
2416 return vms->highmem_ecam;
2417}
2418
2419static void virt_set_highmem_ecam(Object *obj, bool value, Error **errp)
2420{
2421 VirtMachineState *vms = VIRT_MACHINE(obj);
2422
2423 vms->highmem_ecam = value;
2424}
2425
2426static bool virt_get_highmem_mmio(Object *obj, Error **errp)
2427{
2428 VirtMachineState *vms = VIRT_MACHINE(obj);
2429
2430 return vms->highmem_mmio;
2431}
2432
2433static void virt_set_highmem_mmio(Object *obj, bool value, Error **errp)
2434{
2435 VirtMachineState *vms = VIRT_MACHINE(obj);
2436
2437 vms->highmem_mmio = value;
2438}
2439
2440
2441static bool virt_get_its(Object *obj, Error **errp)
2442{
2443 VirtMachineState *vms = VIRT_MACHINE(obj);
2444
2445 return vms->its;
2446}
2447
2448static void virt_set_its(Object *obj, bool value, Error **errp)
2449{
2450 VirtMachineState *vms = VIRT_MACHINE(obj);
2451
2452 vms->its = value;
2453}
2454
2455static bool virt_get_dtb_randomness(Object *obj, Error **errp)
2456{
2457 VirtMachineState *vms = VIRT_MACHINE(obj);
2458
2459 return vms->dtb_randomness;
2460}
2461
2462static void virt_set_dtb_randomness(Object *obj, bool value, Error **errp)
2463{
2464 VirtMachineState *vms = VIRT_MACHINE(obj);
2465
2466 vms->dtb_randomness = value;
2467}
2468
2469static char *virt_get_oem_id(Object *obj, Error **errp)
2470{
2471 VirtMachineState *vms = VIRT_MACHINE(obj);
2472
2473 return g_strdup(vms->oem_id);
2474}
2475
2476static void virt_set_oem_id(Object *obj, const char *value, Error **errp)
2477{
2478 VirtMachineState *vms = VIRT_MACHINE(obj);
2479 size_t len = strlen(value);
2480
2481 if (len > 6) {
2482 error_setg(errp,
2483 "User specified oem-id value is bigger than 6 bytes in size");
2484 return;
2485 }
2486
2487 strncpy(vms->oem_id, value, 6);
2488}
2489
2490static char *virt_get_oem_table_id(Object *obj, Error **errp)
2491{
2492 VirtMachineState *vms = VIRT_MACHINE(obj);
2493
2494 return g_strdup(vms->oem_table_id);
2495}
2496
2497static void virt_set_oem_table_id(Object *obj, const char *value,
2498 Error **errp)
2499{
2500 VirtMachineState *vms = VIRT_MACHINE(obj);
2501 size_t len = strlen(value);
2502
2503 if (len > 8) {
2504 error_setg(errp,
2505 "User specified oem-table-id value is bigger than 8 bytes in size");
2506 return;
2507 }
2508 strncpy(vms->oem_table_id, value, 8);
2509}
2510
2511
2512bool virt_is_acpi_enabled(VirtMachineState *vms)
2513{
2514 if (vms->acpi == ON_OFF_AUTO_OFF) {
2515 return false;
2516 }
2517 return true;
2518}
2519
2520static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
2521 void *opaque, Error **errp)
2522{
2523 VirtMachineState *vms = VIRT_MACHINE(obj);
2524 OnOffAuto acpi = vms->acpi;
2525
2526 visit_type_OnOffAuto(v, name, &acpi, errp);
2527}
2528
2529static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
2530 void *opaque, Error **errp)
2531{
2532 VirtMachineState *vms = VIRT_MACHINE(obj);
2533
2534 visit_type_OnOffAuto(v, name, &vms->acpi, errp);
2535}
2536
2537static bool virt_get_ras(Object *obj, Error **errp)
2538{
2539 VirtMachineState *vms = VIRT_MACHINE(obj);
2540
2541 return vms->ras;
2542}
2543
2544static void virt_set_ras(Object *obj, bool value, Error **errp)
2545{
2546 VirtMachineState *vms = VIRT_MACHINE(obj);
2547
2548 vms->ras = value;
2549}
2550
2551static bool virt_get_mte(Object *obj, Error **errp)
2552{
2553 VirtMachineState *vms = VIRT_MACHINE(obj);
2554
2555 return vms->mte;
2556}
2557
2558static void virt_set_mte(Object *obj, bool value, Error **errp)
2559{
2560 VirtMachineState *vms = VIRT_MACHINE(obj);
2561
2562 vms->mte = value;
2563}
2564
2565static char *virt_get_gic_version(Object *obj, Error **errp)
2566{
2567 VirtMachineState *vms = VIRT_MACHINE(obj);
2568 const char *val;
2569
2570 switch (vms->gic_version) {
2571 case VIRT_GIC_VERSION_4:
2572 val = "4";
2573 break;
2574 case VIRT_GIC_VERSION_3:
2575 val = "3";
2576 break;
2577 default:
2578 val = "2";
2579 break;
2580 }
2581 return g_strdup(val);
2582}
2583
2584static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
2585{
2586 VirtMachineState *vms = VIRT_MACHINE(obj);
2587
2588 if (!strcmp(value, "4")) {
2589 vms->gic_version = VIRT_GIC_VERSION_4;
2590 } else if (!strcmp(value, "3")) {
2591 vms->gic_version = VIRT_GIC_VERSION_3;
2592 } else if (!strcmp(value, "2")) {
2593 vms->gic_version = VIRT_GIC_VERSION_2;
2594 } else if (!strcmp(value, "host")) {
2595 vms->gic_version = VIRT_GIC_VERSION_HOST;
2596 } else if (!strcmp(value, "max")) {
2597 vms->gic_version = VIRT_GIC_VERSION_MAX;
2598 } else {
2599 error_setg(errp, "Invalid gic-version value");
2600 error_append_hint(errp, "Valid values are 3, 2, host, max.\n");
2601 }
2602}
2603
2604static char *virt_get_iommu(Object *obj, Error **errp)
2605{
2606 VirtMachineState *vms = VIRT_MACHINE(obj);
2607
2608 switch (vms->iommu) {
2609 case VIRT_IOMMU_NONE:
2610 return g_strdup("none");
2611 case VIRT_IOMMU_SMMUV3:
2612 return g_strdup("smmuv3");
2613 default:
2614 g_assert_not_reached();
2615 }
2616}
2617
2618static void virt_set_iommu(Object *obj, const char *value, Error **errp)
2619{
2620 VirtMachineState *vms = VIRT_MACHINE(obj);
2621
2622 if (!strcmp(value, "smmuv3")) {
2623 vms->iommu = VIRT_IOMMU_SMMUV3;
2624 } else if (!strcmp(value, "none")) {
2625 vms->iommu = VIRT_IOMMU_NONE;
2626 } else {
2627 error_setg(errp, "Invalid iommu value");
2628 error_append_hint(errp, "Valid values are none, smmuv3.\n");
2629 }
2630}
2631
2632static bool virt_get_default_bus_bypass_iommu(Object *obj, Error **errp)
2633{
2634 VirtMachineState *vms = VIRT_MACHINE(obj);
2635
2636 return vms->default_bus_bypass_iommu;
2637}
2638
2639static void virt_set_default_bus_bypass_iommu(Object *obj, bool value,
2640 Error **errp)
2641{
2642 VirtMachineState *vms = VIRT_MACHINE(obj);
2643
2644 vms->default_bus_bypass_iommu = value;
2645}
2646
2647static CpuInstanceProperties
2648virt_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
2649{
2650 MachineClass *mc = MACHINE_GET_CLASS(ms);
2651 const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms);
2652
2653 assert(cpu_index < possible_cpus->len);
2654 return possible_cpus->cpus[cpu_index].props;
2655}
2656
2657static int64_t virt_get_default_cpu_node_id(const MachineState *ms, int idx)
2658{
2659 int64_t socket_id = ms->possible_cpus->cpus[idx].props.socket_id;
2660
2661 return socket_id % ms->numa_state->num_nodes;
2662}
2663
2664static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
2665{
2666 int n;
2667 unsigned int max_cpus = ms->smp.max_cpus;
2668 VirtMachineState *vms = VIRT_MACHINE(ms);
2669 MachineClass *mc = MACHINE_GET_CLASS(vms);
2670
2671 if (ms->possible_cpus) {
2672 assert(ms->possible_cpus->len == max_cpus);
2673 return ms->possible_cpus;
2674 }
2675
2676 ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
2677 sizeof(CPUArchId) * max_cpus);
2678 ms->possible_cpus->len = max_cpus;
2679 for (n = 0; n < ms->possible_cpus->len; n++) {
2680 ms->possible_cpus->cpus[n].type = ms->cpu_type;
2681 ms->possible_cpus->cpus[n].arch_id =
2682 virt_cpu_mp_affinity(vms, n);
2683
2684 assert(!mc->smp_props.dies_supported);
2685 ms->possible_cpus->cpus[n].props.has_socket_id = true;
2686 ms->possible_cpus->cpus[n].props.socket_id =
2687 n / (ms->smp.clusters * ms->smp.cores * ms->smp.threads);
2688 ms->possible_cpus->cpus[n].props.has_cluster_id = true;
2689 ms->possible_cpus->cpus[n].props.cluster_id =
2690 (n / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters;
2691 ms->possible_cpus->cpus[n].props.has_core_id = true;
2692 ms->possible_cpus->cpus[n].props.core_id =
2693 (n / ms->smp.threads) % ms->smp.cores;
2694 ms->possible_cpus->cpus[n].props.has_thread_id = true;
2695 ms->possible_cpus->cpus[n].props.thread_id =
2696 n % ms->smp.threads;
2697 }
2698 return ms->possible_cpus;
2699}
2700
2701static void virt_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
2702 Error **errp)
2703{
2704 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2705 const MachineState *ms = MACHINE(hotplug_dev);
2706 const bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
2707
2708 if (!vms->acpi_dev) {
2709 error_setg(errp,
2710 "memory hotplug is not enabled: missing acpi-ged device");
2711 return;
2712 }
2713
2714 if (vms->mte) {
2715 error_setg(errp, "memory hotplug is not enabled: MTE is enabled");
2716 return;
2717 }
2718
2719 if (is_nvdimm && !ms->nvdimms_state->is_enabled) {
2720 error_setg(errp, "nvdimm is not enabled: add 'nvdimm=on' to '-M'");
2721 return;
2722 }
2723
2724 pc_dimm_pre_plug(PC_DIMM(dev), MACHINE(hotplug_dev), NULL, errp);
2725}
2726
2727static void virt_memory_plug(HotplugHandler *hotplug_dev,
2728 DeviceState *dev, Error **errp)
2729{
2730 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2731 MachineState *ms = MACHINE(hotplug_dev);
2732 bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
2733
2734 pc_dimm_plug(PC_DIMM(dev), MACHINE(vms));
2735
2736 if (is_nvdimm) {
2737 nvdimm_plug(ms->nvdimms_state);
2738 }
2739
2740 hotplug_handler_plug(HOTPLUG_HANDLER(vms->acpi_dev),
2741 dev, &error_abort);
2742}
2743
2744static void virt_virtio_md_pci_pre_plug(HotplugHandler *hotplug_dev,
2745 DeviceState *dev, Error **errp)
2746{
2747 HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev);
2748 Error *local_err = NULL;
2749
2750 if (!hotplug_dev2 && dev->hotplugged) {
2751
2752
2753
2754
2755
2756
2757 error_setg(errp, "hotplug of virtio based memory devices not supported"
2758 " on this bus.");
2759 return;
2760 }
2761
2762
2763
2764
2765 memory_device_pre_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev), NULL,
2766 &local_err);
2767 if (!local_err && hotplug_dev2) {
2768 hotplug_handler_pre_plug(hotplug_dev2, dev, &local_err);
2769 }
2770 error_propagate(errp, local_err);
2771}
2772
2773static void virt_virtio_md_pci_plug(HotplugHandler *hotplug_dev,
2774 DeviceState *dev, Error **errp)
2775{
2776 HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev);
2777 Error *local_err = NULL;
2778
2779
2780
2781
2782
2783
2784 memory_device_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev));
2785 if (hotplug_dev2) {
2786 hotplug_handler_plug(hotplug_dev2, dev, &local_err);
2787 if (local_err) {
2788 memory_device_unplug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev));
2789 }
2790 }
2791 error_propagate(errp, local_err);
2792}
2793
2794static void virt_virtio_md_pci_unplug_request(HotplugHandler *hotplug_dev,
2795 DeviceState *dev, Error **errp)
2796{
2797
2798 error_setg(errp, "virtio based memory devices cannot be unplugged.");
2799}
2800
2801
2802static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
2803 DeviceState *dev, Error **errp)
2804{
2805 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2806
2807 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
2808 virt_memory_pre_plug(hotplug_dev, dev, errp);
2809 } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) {
2810 virt_virtio_md_pci_pre_plug(hotplug_dev, dev, errp);
2811 } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
2812 hwaddr db_start = 0, db_end = 0;
2813 char *resv_prop_str;
2814
2815 if (vms->iommu != VIRT_IOMMU_NONE) {
2816 error_setg(errp, "virt machine does not support multiple IOMMUs");
2817 return;
2818 }
2819
2820 switch (vms->msi_controller) {
2821 case VIRT_MSI_CTRL_NONE:
2822 return;
2823 case VIRT_MSI_CTRL_ITS:
2824
2825 db_start = base_memmap[VIRT_GIC_ITS].base + 0x10000;
2826 db_end = base_memmap[VIRT_GIC_ITS].base +
2827 base_memmap[VIRT_GIC_ITS].size - 1;
2828 break;
2829 case VIRT_MSI_CTRL_GICV2M:
2830
2831 db_start = base_memmap[VIRT_GIC_V2M].base;
2832 db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1;
2833 break;
2834 }
2835 resv_prop_str = g_strdup_printf("0x%"PRIx64":0x%"PRIx64":%u",
2836 db_start, db_end,
2837 VIRTIO_IOMMU_RESV_MEM_T_MSI);
2838
2839 object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
2840 object_property_set_str(OBJECT(dev), "reserved-regions[0]",
2841 resv_prop_str, errp);
2842 g_free(resv_prop_str);
2843 }
2844}
2845
2846static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
2847 DeviceState *dev, Error **errp)
2848{
2849 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2850
2851 if (vms->platform_bus_dev) {
2852 MachineClass *mc = MACHINE_GET_CLASS(vms);
2853
2854 if (device_is_dynamic_sysbus(mc, dev)) {
2855 platform_bus_link_device(PLATFORM_BUS_DEVICE(vms->platform_bus_dev),
2856 SYS_BUS_DEVICE(dev));
2857 }
2858 }
2859 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
2860 virt_memory_plug(hotplug_dev, dev, errp);
2861 }
2862
2863 if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) {
2864 virt_virtio_md_pci_plug(hotplug_dev, dev, errp);
2865 }
2866
2867 if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
2868 PCIDevice *pdev = PCI_DEVICE(dev);
2869
2870 vms->iommu = VIRT_IOMMU_VIRTIO;
2871 vms->virtio_iommu_bdf = pci_get_bdf(pdev);
2872 create_virtio_iommu_dt_bindings(vms);
2873 }
2874}
2875
2876static void virt_dimm_unplug_request(HotplugHandler *hotplug_dev,
2877 DeviceState *dev, Error **errp)
2878{
2879 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2880
2881 if (!vms->acpi_dev) {
2882 error_setg(errp,
2883 "memory hotplug is not enabled: missing acpi-ged device");
2884 return;
2885 }
2886
2887 if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
2888 error_setg(errp, "nvdimm device hot unplug is not supported yet.");
2889 return;
2890 }
2891
2892 hotplug_handler_unplug_request(HOTPLUG_HANDLER(vms->acpi_dev), dev,
2893 errp);
2894}
2895
2896static void virt_dimm_unplug(HotplugHandler *hotplug_dev,
2897 DeviceState *dev, Error **errp)
2898{
2899 VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
2900 Error *local_err = NULL;
2901
2902 hotplug_handler_unplug(HOTPLUG_HANDLER(vms->acpi_dev), dev, &local_err);
2903 if (local_err) {
2904 goto out;
2905 }
2906
2907 pc_dimm_unplug(PC_DIMM(dev), MACHINE(vms));
2908 qdev_unrealize(dev);
2909
2910out:
2911 error_propagate(errp, local_err);
2912}
2913
2914static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
2915 DeviceState *dev, Error **errp)
2916{
2917 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
2918 virt_dimm_unplug_request(hotplug_dev, dev, errp);
2919 } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) {
2920 virt_virtio_md_pci_unplug_request(hotplug_dev, dev, errp);
2921 } else {
2922 error_setg(errp, "device unplug request for unsupported device"
2923 " type: %s", object_get_typename(OBJECT(dev)));
2924 }
2925}
2926
2927static void virt_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
2928 DeviceState *dev, Error **errp)
2929{
2930 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
2931 virt_dimm_unplug(hotplug_dev, dev, errp);
2932 } else {
2933 error_setg(errp, "virt: device unplug for unsupported device"
2934 " type: %s", object_get_typename(OBJECT(dev)));
2935 }
2936}
2937
2938static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
2939 DeviceState *dev)
2940{
2941 MachineClass *mc = MACHINE_GET_CLASS(machine);
2942
2943 if (device_is_dynamic_sysbus(mc, dev) ||
2944 object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
2945 object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI) ||
2946 object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
2947 return HOTPLUG_HANDLER(machine);
2948 }
2949 return NULL;
2950}
2951
2952
2953
2954
2955
2956static int virt_kvm_type(MachineState *ms, const char *type_str)
2957{
2958 VirtMachineState *vms = VIRT_MACHINE(ms);
2959 int max_vm_pa_size, requested_pa_size;
2960 bool fixed_ipa;
2961
2962 max_vm_pa_size = kvm_arm_get_max_vm_ipa_size(ms, &fixed_ipa);
2963
2964
2965 virt_set_memmap(vms, max_vm_pa_size);
2966
2967 requested_pa_size = 64 - clz64(vms->highest_gpa);
2968
2969
2970
2971
2972 if (requested_pa_size < 32) {
2973 requested_pa_size = 32;
2974 }
2975
2976 if (requested_pa_size > max_vm_pa_size) {
2977 error_report("-m and ,maxmem option values "
2978 "require an IPA range (%d bits) larger than "
2979 "the one supported by the host (%d bits)",
2980 requested_pa_size, max_vm_pa_size);
2981 exit(1);
2982 }
2983
2984
2985
2986
2987
2988 return fixed_ipa ? 0 : requested_pa_size;
2989}
2990
2991static void virt_machine_class_init(ObjectClass *oc, void *data)
2992{
2993 MachineClass *mc = MACHINE_CLASS(oc);
2994 HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
2995
2996 mc->init = machvirt_init;
2997
2998
2999
3000
3001 mc->max_cpus = 512;
3002 machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
3003 machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
3004 machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
3005 machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
3006#ifdef CONFIG_TPM
3007 machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
3008#endif
3009 mc->block_default_type = IF_VIRTIO;
3010 mc->no_cdrom = 1;
3011 mc->pci_allow_0_address = true;
3012
3013 mc->minimum_page_bits = 12;
3014 mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
3015 mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
3016#ifdef CONFIG_TCG
3017 mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
3018#else
3019 mc->default_cpu_type = ARM_CPU_TYPE_NAME("max");
3020#endif
3021 mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
3022 mc->kvm_type = virt_kvm_type;
3023 assert(!mc->get_hotplug_handler);
3024 mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
3025 hc->pre_plug = virt_machine_device_pre_plug_cb;
3026 hc->plug = virt_machine_device_plug_cb;
3027 hc->unplug_request = virt_machine_device_unplug_request_cb;
3028 hc->unplug = virt_machine_device_unplug_cb;
3029 mc->nvdimm_supported = true;
3030 mc->smp_props.clusters_supported = true;
3031 mc->auto_enable_numa_with_memhp = true;
3032 mc->auto_enable_numa_with_memdev = true;
3033 mc->default_ram_id = "mach-virt.ram";
3034
3035 object_class_property_add(oc, "acpi", "OnOffAuto",
3036 virt_get_acpi, virt_set_acpi,
3037 NULL, NULL);
3038 object_class_property_set_description(oc, "acpi",
3039 "Enable ACPI");
3040 object_class_property_add_bool(oc, "secure", virt_get_secure,
3041 virt_set_secure);
3042 object_class_property_set_description(oc, "secure",
3043 "Set on/off to enable/disable the ARM "
3044 "Security Extensions (TrustZone)");
3045
3046 object_class_property_add_bool(oc, "virtualization", virt_get_virt,
3047 virt_set_virt);
3048 object_class_property_set_description(oc, "virtualization",
3049 "Set on/off to enable/disable emulating a "
3050 "guest CPU which implements the ARM "
3051 "Virtualization Extensions");
3052
3053 object_class_property_add_bool(oc, "highmem", virt_get_highmem,
3054 virt_set_highmem);
3055 object_class_property_set_description(oc, "highmem",
3056 "Set on/off to enable/disable using "
3057 "physical address space above 32 bits");
3058
3059 object_class_property_add_bool(oc, "compact-highmem",
3060 virt_get_compact_highmem,
3061 virt_set_compact_highmem);
3062 object_class_property_set_description(oc, "compact-highmem",
3063 "Set on/off to enable/disable compact "
3064 "layout for high memory regions");
3065
3066 object_class_property_add_bool(oc, "highmem-redists",
3067 virt_get_highmem_redists,
3068 virt_set_highmem_redists);
3069 object_class_property_set_description(oc, "highmem-redists",
3070 "Set on/off to enable/disable high "
3071 "memory region for GICv3 or GICv4 "
3072 "redistributor");
3073
3074 object_class_property_add_bool(oc, "highmem-ecam",
3075 virt_get_highmem_ecam,
3076 virt_set_highmem_ecam);
3077 object_class_property_set_description(oc, "highmem-ecam",
3078 "Set on/off to enable/disable high "
3079 "memory region for PCI ECAM");
3080
3081 object_class_property_add_bool(oc, "highmem-mmio",
3082 virt_get_highmem_mmio,
3083 virt_set_highmem_mmio);
3084 object_class_property_set_description(oc, "highmem-mmio",
3085 "Set on/off to enable/disable high "
3086 "memory region for PCI MMIO");
3087
3088 object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
3089 virt_set_gic_version);
3090 object_class_property_set_description(oc, "gic-version",
3091 "Set GIC version. "
3092 "Valid values are 2, 3, 4, host and max");
3093
3094 object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
3095 object_class_property_set_description(oc, "iommu",
3096 "Set the IOMMU type. "
3097 "Valid values are none and smmuv3");
3098
3099 object_class_property_add_bool(oc, "default-bus-bypass-iommu",
3100 virt_get_default_bus_bypass_iommu,
3101 virt_set_default_bus_bypass_iommu);
3102 object_class_property_set_description(oc, "default-bus-bypass-iommu",
3103 "Set on/off to enable/disable "
3104 "bypass_iommu for default root bus");
3105
3106 object_class_property_add_bool(oc, "ras", virt_get_ras,
3107 virt_set_ras);
3108 object_class_property_set_description(oc, "ras",
3109 "Set on/off to enable/disable reporting host memory errors "
3110 "to a KVM guest using ACPI and guest external abort exceptions");
3111
3112 object_class_property_add_bool(oc, "mte", virt_get_mte, virt_set_mte);
3113 object_class_property_set_description(oc, "mte",
3114 "Set on/off to enable/disable emulating a "
3115 "guest CPU which implements the ARM "
3116 "Memory Tagging Extension");
3117
3118 object_class_property_add_bool(oc, "its", virt_get_its,
3119 virt_set_its);
3120 object_class_property_set_description(oc, "its",
3121 "Set on/off to enable/disable "
3122 "ITS instantiation");
3123
3124 object_class_property_add_bool(oc, "dtb-randomness",
3125 virt_get_dtb_randomness,
3126 virt_set_dtb_randomness);
3127 object_class_property_set_description(oc, "dtb-randomness",
3128 "Set off to disable passing random or "
3129 "non-deterministic dtb nodes to guest");
3130
3131 object_class_property_add_bool(oc, "dtb-kaslr-seed",
3132 virt_get_dtb_randomness,
3133 virt_set_dtb_randomness);
3134 object_class_property_set_description(oc, "dtb-kaslr-seed",
3135 "Deprecated synonym of dtb-randomness");
3136
3137 object_class_property_add_str(oc, "x-oem-id",
3138 virt_get_oem_id,
3139 virt_set_oem_id);
3140 object_class_property_set_description(oc, "x-oem-id",
3141 "Override the default value of field OEMID "
3142 "in ACPI table header."
3143 "The string may be up to 6 bytes in size");
3144
3145
3146 object_class_property_add_str(oc, "x-oem-table-id",
3147 virt_get_oem_table_id,
3148 virt_set_oem_table_id);
3149 object_class_property_set_description(oc, "x-oem-table-id",
3150 "Override the default value of field OEM Table ID "
3151 "in ACPI table header."
3152 "The string may be up to 8 bytes in size");
3153
3154}
3155
3156static void virt_instance_init(Object *obj)
3157{
3158 VirtMachineState *vms = VIRT_MACHINE(obj);
3159 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
3160
3161
3162
3163
3164
3165 vms->secure = false;
3166
3167
3168 vms->virt = false;
3169
3170
3171 vms->highmem = true;
3172 vms->highmem_compact = !vmc->no_highmem_compact;
3173 vms->gic_version = VIRT_GIC_VERSION_NOSEL;
3174
3175 vms->highmem_ecam = !vmc->no_highmem_ecam;
3176 vms->highmem_mmio = true;
3177 vms->highmem_redists = true;
3178
3179 if (vmc->no_its) {
3180 vms->its = false;
3181 } else {
3182
3183 vms->its = true;
3184
3185 if (vmc->no_tcg_its) {
3186 vms->tcg_its = false;
3187 } else {
3188 vms->tcg_its = true;
3189 }
3190 }
3191
3192
3193 vms->iommu = VIRT_IOMMU_NONE;
3194
3195
3196 vms->default_bus_bypass_iommu = false;
3197
3198
3199 vms->ras = false;
3200
3201
3202 vms->mte = false;
3203
3204
3205 vms->dtb_randomness = true;
3206
3207 vms->irqmap = a15irqmap;
3208
3209 virt_flash_create(vms);
3210
3211 vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
3212 vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
3213}
3214
3215static const TypeInfo virt_machine_info = {
3216 .name = TYPE_VIRT_MACHINE,
3217 .parent = TYPE_MACHINE,
3218 .abstract = true,
3219 .instance_size = sizeof(VirtMachineState),
3220 .class_size = sizeof(VirtMachineClass),
3221 .class_init = virt_machine_class_init,
3222 .instance_init = virt_instance_init,
3223 .interfaces = (InterfaceInfo[]) {
3224 { TYPE_HOTPLUG_HANDLER },
3225 { }
3226 },
3227};
3228
3229static void machvirt_machine_init(void)
3230{
3231 type_register_static(&virt_machine_info);
3232}
3233type_init(machvirt_machine_init);
3234
3235static void virt_machine_8_0_options(MachineClass *mc)
3236{
3237}
3238DEFINE_VIRT_MACHINE_AS_LATEST(8, 0)
3239
3240static void virt_machine_7_2_options(MachineClass *mc)
3241{
3242 virt_machine_8_0_options(mc);
3243 compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
3244}
3245DEFINE_VIRT_MACHINE(7, 2)
3246
3247static void virt_machine_7_1_options(MachineClass *mc)
3248{
3249 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3250
3251 virt_machine_7_2_options(mc);
3252 compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
3253
3254 vmc->no_highmem_compact = true;
3255}
3256DEFINE_VIRT_MACHINE(7, 1)
3257
3258static void virt_machine_7_0_options(MachineClass *mc)
3259{
3260 virt_machine_7_1_options(mc);
3261 compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len);
3262}
3263DEFINE_VIRT_MACHINE(7, 0)
3264
3265static void virt_machine_6_2_options(MachineClass *mc)
3266{
3267 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3268
3269 virt_machine_7_0_options(mc);
3270 compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len);
3271 vmc->no_tcg_lpa2 = true;
3272}
3273DEFINE_VIRT_MACHINE(6, 2)
3274
3275static void virt_machine_6_1_options(MachineClass *mc)
3276{
3277 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3278
3279 virt_machine_6_2_options(mc);
3280 compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
3281 mc->smp_props.prefer_sockets = true;
3282 vmc->no_cpu_topology = true;
3283
3284
3285 vmc->no_tcg_its = true;
3286}
3287DEFINE_VIRT_MACHINE(6, 1)
3288
3289static void virt_machine_6_0_options(MachineClass *mc)
3290{
3291 virt_machine_6_1_options(mc);
3292 compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len);
3293}
3294DEFINE_VIRT_MACHINE(6, 0)
3295
3296static void virt_machine_5_2_options(MachineClass *mc)
3297{
3298 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3299
3300 virt_machine_6_0_options(mc);
3301 compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
3302 vmc->no_secure_gpio = true;
3303}
3304DEFINE_VIRT_MACHINE(5, 2)
3305
3306static void virt_machine_5_1_options(MachineClass *mc)
3307{
3308 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3309
3310 virt_machine_5_2_options(mc);
3311 compat_props_add(mc->compat_props, hw_compat_5_1, hw_compat_5_1_len);
3312 vmc->no_kvm_steal_time = true;
3313}
3314DEFINE_VIRT_MACHINE(5, 1)
3315
3316static void virt_machine_5_0_options(MachineClass *mc)
3317{
3318 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3319
3320 virt_machine_5_1_options(mc);
3321 compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
3322 mc->numa_mem_supported = true;
3323 vmc->acpi_expose_flash = true;
3324 mc->auto_enable_numa_with_memdev = false;
3325}
3326DEFINE_VIRT_MACHINE(5, 0)
3327
3328static void virt_machine_4_2_options(MachineClass *mc)
3329{
3330 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3331
3332 virt_machine_5_0_options(mc);
3333 compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
3334 vmc->kvm_no_adjvtime = true;
3335}
3336DEFINE_VIRT_MACHINE(4, 2)
3337
3338static void virt_machine_4_1_options(MachineClass *mc)
3339{
3340 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3341
3342 virt_machine_4_2_options(mc);
3343 compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len);
3344 vmc->no_ged = true;
3345 mc->auto_enable_numa_with_memhp = false;
3346}
3347DEFINE_VIRT_MACHINE(4, 1)
3348
3349static void virt_machine_4_0_options(MachineClass *mc)
3350{
3351 virt_machine_4_1_options(mc);
3352 compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
3353}
3354DEFINE_VIRT_MACHINE(4, 0)
3355
3356static void virt_machine_3_1_options(MachineClass *mc)
3357{
3358 virt_machine_4_0_options(mc);
3359 compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
3360}
3361DEFINE_VIRT_MACHINE(3, 1)
3362
3363static void virt_machine_3_0_options(MachineClass *mc)
3364{
3365 virt_machine_3_1_options(mc);
3366 compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
3367}
3368DEFINE_VIRT_MACHINE(3, 0)
3369
3370static void virt_machine_2_12_options(MachineClass *mc)
3371{
3372 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3373
3374 virt_machine_3_0_options(mc);
3375 compat_props_add(mc->compat_props, hw_compat_2_12, hw_compat_2_12_len);
3376 vmc->no_highmem_ecam = true;
3377 mc->max_cpus = 255;
3378}
3379DEFINE_VIRT_MACHINE(2, 12)
3380
3381static void virt_machine_2_11_options(MachineClass *mc)
3382{
3383 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3384
3385 virt_machine_2_12_options(mc);
3386 compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
3387 vmc->smbios_old_sys_ver = true;
3388}
3389DEFINE_VIRT_MACHINE(2, 11)
3390
3391static void virt_machine_2_10_options(MachineClass *mc)
3392{
3393 virt_machine_2_11_options(mc);
3394 compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
3395
3396 mc->ignore_memory_transaction_failures = true;
3397}
3398DEFINE_VIRT_MACHINE(2, 10)
3399
3400static void virt_machine_2_9_options(MachineClass *mc)
3401{
3402 virt_machine_2_10_options(mc);
3403 compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
3404}
3405DEFINE_VIRT_MACHINE(2, 9)
3406
3407static void virt_machine_2_8_options(MachineClass *mc)
3408{
3409 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3410
3411 virt_machine_2_9_options(mc);
3412 compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
3413
3414
3415
3416 vmc->claim_edge_triggered_timers = true;
3417}
3418DEFINE_VIRT_MACHINE(2, 8)
3419
3420static void virt_machine_2_7_options(MachineClass *mc)
3421{
3422 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3423
3424 virt_machine_2_8_options(mc);
3425 compat_props_add(mc->compat_props, hw_compat_2_7, hw_compat_2_7_len);
3426
3427 vmc->no_its = true;
3428
3429 mc->minimum_page_bits = 0;
3430}
3431DEFINE_VIRT_MACHINE(2, 7)
3432
3433static void virt_machine_2_6_options(MachineClass *mc)
3434{
3435 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
3436
3437 virt_machine_2_7_options(mc);
3438 compat_props_add(mc->compat_props, hw_compat_2_6, hw_compat_2_6_len);
3439 vmc->disallow_affinity_adjustment = true;
3440
3441 vmc->no_pmu = true;
3442}
3443DEFINE_VIRT_MACHINE(2, 6)
3444