From: Peng Hao <peng.h...@zte.com.cn> Add pvpanic device in arm virt machine.
Signed-off-by: Peng Hao <peng.h...@zte.com.cn> Reviewed-by: Andrew Jones <drjo...@redhat.com> Signed-off-by: Mihai Carabas <mihai.cara...@oracle.com> --- hw/arm/virt.c | 25 +++++++++++++++++++++++++ include/hw/arm/virt.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index e465a98..63f09a6 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -78,6 +78,7 @@ #include "hw/virtio/virtio-iommu.h" #include "hw/char/pl011.h" #include "qemu/guest-random.h" +#include "hw/misc/pvpanic.h" #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ @@ -152,6 +153,7 @@ static const MemMapEntry base_memmap[] = { [VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN }, [VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN}, [VIRT_PVTIME] = { 0x090a0000, 0x00010000 }, + [VIRT_PVPANIC] = { 0x090b0000, 0x00000002 }, [VIRT_MMIO] = { 0x0a000000, 0x00000200 }, /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */ [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 }, @@ -226,6 +228,27 @@ static void create_kaslr_seed(VirtMachineState *vms, const char *node) qemu_fdt_setprop_u64(vms->fdt, node, "kaslr-seed", seed); } +static void create_pvpanic_device(const VirtMachineState *vms) +{ + char *nodename; + hwaddr base = vms->memmap[VIRT_PVPANIC].base; + hwaddr size = vms->memmap[VIRT_PVPANIC].size; + + if (!vms->pvpanic) { + return; + } + sysbus_create_simple(TYPE_PVPANIC_MMIO, base, NULL); + + nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base); + qemu_fdt_add_subnode(vms->fdt, nodename); + qemu_fdt_setprop_string(vms->fdt, nodename, + "compatible", "qemu,pvpanic-mmio"); + qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg", + 2, base, 2, size); + + g_free(nodename); +} + static void create_fdt(VirtMachineState *vms) { MachineState *ms = MACHINE(vms); @@ -1957,6 +1980,8 @@ static void machvirt_init(MachineState *machine) virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem); + create_pvpanic_device(vms); + create_gic(vms); virt_cpu_post_init(vms, possible_cpus->len, sysmem); diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index aad6d69..e6410c3 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -69,6 +69,7 @@ enum { VIRT_GIC_ITS, VIRT_GIC_REDIST, VIRT_SMMU, + VIRT_PVPANIC, VIRT_UART, VIRT_MMIO, VIRT_RTC, @@ -139,6 +140,7 @@ struct VirtMachineState { bool highmem; bool highmem_ecam; bool its; + bool pvpanic; bool virt; bool ras; bool mte; -- 1.8.3.1