From: Heyi Guo <guoheyi@huawei.com> To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Cc: wanghaibin.wang@huawei.com, Heyi Guo <guoheyi@huawei.com>, Peter Maydell <peter.maydell@linaro.org>, Laszlo Ersek <lersek@redhat.com> Subject: [Qemu-devel] [RFC] arm/virt: add one more uart for UEFI runtime debug Date: Sun, 7 Apr 2019 16:14:53 +0800 [thread overview] Message-ID: <1554624893-8363-1-git-send-email-guoheyi@huawei.com> (raw) This patch is based on the discussion in TianoCore edk2-devel mailing list: https://lists.01.org/pipermail/edk2-devel/2019-March/037986.html The conclusion is that we need an individual UART for UEFI runtime services to print debug message at runtime, to avoid conflicting with the system UART. We cannot use the secure UART either, for we may both have Trusted Firmware and UEFI runtime services running on the VM, and it is not easy to keep synchronization between the two components. To keep backward compatibility, UEFI UART is put behind the secure UART when secure world is enabled. Cc: Peter Maydell <peter.maydell@linaro.org> Cc: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Heyi Guo <guoheyi@huawei.com> --- hw/arm/virt.c | 29 +++++++++++++++++++++++------ include/hw/arm/virt.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index ce2664a..cbc5a66 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -131,6 +131,7 @@ static const MemMapEntry base_memmap[] = { [VIRT_GPIO] = { 0x09030000, 0x00001000 }, [VIRT_SECURE_UART] = { 0x09040000, 0x00001000 }, [VIRT_SMMU] = { 0x09050000, 0x00020000 }, + [VIRT_UEFI_UART] = { 0x09070000, 0x00001000 }, [VIRT_MMIO] = { 0x0a000000, 0x00000200 }, /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */ [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 }, @@ -166,6 +167,7 @@ static const int a15irqmap[] = { [VIRT_PCIE] = 3, /* ... to 6 */ [VIRT_GPIO] = 7, [VIRT_SECURE_UART] = 8, + [VIRT_UEFI_UART] = 9, [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */ [VIRT_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */ @@ -713,13 +715,23 @@ static void create_uart(const VirtMachineState *vms, qemu_irq *pic, int uart, if (uart == VIRT_UART) { qemu_fdt_setprop_string(vms->fdt, "/chosen", "stdout-path", nodename); } else { + const char *status_string; + + if (uart == VIRT_SECURE_UART) { + status_string = "secure-status"; + } else { + status_string = "uefi-status"; + } + /* Mark as not usable by the normal world */ qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled"); - qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay"); + qemu_fdt_setprop_string(vms->fdt, nodename, status_string, "okay"); - qemu_fdt_add_subnode(vms->fdt, "/secure-chosen"); - qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path", - nodename); + if (uart == VIRT_SECURE_UART) { + qemu_fdt_add_subnode(vms->fdt, "/secure-chosen"); + qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path", + nodename); + } } g_free(nodename); @@ -1423,6 +1435,7 @@ static void machvirt_init(MachineState *machine) MemoryRegion *ram = g_new(MemoryRegion, 1); bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0); bool aarch64 = true; + int uart_index = 0; /* * In accelerated mode, the memory map is computed earlier in kvm_type() @@ -1616,13 +1629,17 @@ static void machvirt_init(MachineState *machine) fdt_add_pmu_nodes(vms); - create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(0)); + create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(uart_index++)); if (vms->secure) { create_secure_ram(vms, secure_sysmem); - create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1)); + create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, + serial_hd(uart_index++)); } + /* Create UART for UEFI runtime services debug */ + create_uart(vms, pic, VIRT_UEFI_UART, sysmem, serial_hd(uart_index)); + vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64); create_rtc(vms, pic); diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 507517c..565769f 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -77,6 +77,7 @@ enum { VIRT_GPIO, VIRT_SECURE_UART, VIRT_SECURE_MEM, + VIRT_UEFI_UART, VIRT_LOWMEMMAP_LAST, }; -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Heyi Guo <guoheyi@huawei.com> To: <qemu-arm@nongnu.org>, <qemu-devel@nongnu.org> Cc: Heyi Guo <guoheyi@huawei.com>, wanghaibin.wang@huawei.com, Laszlo Ersek <lersek@redhat.com>, Peter Maydell <peter.maydell@linaro.org> Subject: [Qemu-devel] [RFC] arm/virt: add one more uart for UEFI runtime debug Date: Sun, 7 Apr 2019 16:14:53 +0800 [thread overview] Message-ID: <1554624893-8363-1-git-send-email-guoheyi@huawei.com> (raw) Message-ID: <20190407081453.w3SIQeSbYszTCWW5rd-QighhIVnjN8DDzJVvXG_Ykvw@z> (raw) This patch is based on the discussion in TianoCore edk2-devel mailing list: https://lists.01.org/pipermail/edk2-devel/2019-March/037986.html The conclusion is that we need an individual UART for UEFI runtime services to print debug message at runtime, to avoid conflicting with the system UART. We cannot use the secure UART either, for we may both have Trusted Firmware and UEFI runtime services running on the VM, and it is not easy to keep synchronization between the two components. To keep backward compatibility, UEFI UART is put behind the secure UART when secure world is enabled. Cc: Peter Maydell <peter.maydell@linaro.org> Cc: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Heyi Guo <guoheyi@huawei.com> --- hw/arm/virt.c | 29 +++++++++++++++++++++++------ include/hw/arm/virt.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index ce2664a..cbc5a66 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -131,6 +131,7 @@ static const MemMapEntry base_memmap[] = { [VIRT_GPIO] = { 0x09030000, 0x00001000 }, [VIRT_SECURE_UART] = { 0x09040000, 0x00001000 }, [VIRT_SMMU] = { 0x09050000, 0x00020000 }, + [VIRT_UEFI_UART] = { 0x09070000, 0x00001000 }, [VIRT_MMIO] = { 0x0a000000, 0x00000200 }, /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */ [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 }, @@ -166,6 +167,7 @@ static const int a15irqmap[] = { [VIRT_PCIE] = 3, /* ... to 6 */ [VIRT_GPIO] = 7, [VIRT_SECURE_UART] = 8, + [VIRT_UEFI_UART] = 9, [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */ [VIRT_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */ @@ -713,13 +715,23 @@ static void create_uart(const VirtMachineState *vms, qemu_irq *pic, int uart, if (uart == VIRT_UART) { qemu_fdt_setprop_string(vms->fdt, "/chosen", "stdout-path", nodename); } else { + const char *status_string; + + if (uart == VIRT_SECURE_UART) { + status_string = "secure-status"; + } else { + status_string = "uefi-status"; + } + /* Mark as not usable by the normal world */ qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled"); - qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay"); + qemu_fdt_setprop_string(vms->fdt, nodename, status_string, "okay"); - qemu_fdt_add_subnode(vms->fdt, "/secure-chosen"); - qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path", - nodename); + if (uart == VIRT_SECURE_UART) { + qemu_fdt_add_subnode(vms->fdt, "/secure-chosen"); + qemu_fdt_setprop_string(vms->fdt, "/secure-chosen", "stdout-path", + nodename); + } } g_free(nodename); @@ -1423,6 +1435,7 @@ static void machvirt_init(MachineState *machine) MemoryRegion *ram = g_new(MemoryRegion, 1); bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0); bool aarch64 = true; + int uart_index = 0; /* * In accelerated mode, the memory map is computed earlier in kvm_type() @@ -1616,13 +1629,17 @@ static void machvirt_init(MachineState *machine) fdt_add_pmu_nodes(vms); - create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(0)); + create_uart(vms, pic, VIRT_UART, sysmem, serial_hd(uart_index++)); if (vms->secure) { create_secure_ram(vms, secure_sysmem); - create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, serial_hd(1)); + create_uart(vms, pic, VIRT_SECURE_UART, secure_sysmem, + serial_hd(uart_index++)); } + /* Create UART for UEFI runtime services debug */ + create_uart(vms, pic, VIRT_UEFI_UART, sysmem, serial_hd(uart_index)); + vms->highmem_ecam &= vms->highmem && (!firmware_loaded || aarch64); create_rtc(vms, pic); diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 507517c..565769f 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -77,6 +77,7 @@ enum { VIRT_GPIO, VIRT_SECURE_UART, VIRT_SECURE_MEM, + VIRT_UEFI_UART, VIRT_LOWMEMMAP_LAST, }; -- 1.8.3.1
next reply other threads:[~2019-04-07 8:19 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-07 8:14 Heyi Guo [this message] 2019-04-07 8:14 ` [Qemu-devel] [RFC] arm/virt: add one more uart for UEFI runtime debug Heyi Guo 2019-04-07 13:16 ` Peter Maydell 2019-04-07 13:16 ` Peter Maydell 2019-04-08 1:45 ` Heyi Guo 2019-04-08 1:45 ` Heyi Guo 2019-04-08 9:43 ` Peter Maydell 2019-04-08 9:43 ` Peter Maydell
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1554624893-8363-1-git-send-email-guoheyi@huawei.com \ --to=guoheyi@huawei.com \ --cc=lersek@redhat.com \ --cc=peter.maydell@linaro.org \ --cc=qemu-arm@nongnu.org \ --cc=qemu-devel@nongnu.org \ --cc=wanghaibin.wang@huawei.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.