From: Li Chen <me@linux.beauty>
To: "Peter Maydell" <peter.maydell@linaro.org>,
"Shannon Zhao" <shannon.zhaosl@gmail.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Ani Sinha" <anisinha@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"\"Philippe Mathieu-Daudé\"" <philmd@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Song Gao" <gaosong@loongson.cn>,
"Jiaxun Yang" <jiaxun.yang@flygoat.com>,
"Sunil V L" <sunilvl@ventanamicro.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Alistair Francis" <alistair.francis@wdc.com>,
"Weiwei Li" <liwei1518@gmail.com>, qemu-arm <qemu-arm@nongnu.org>,
qemu-devel <qemu-devel@nongnu.org>,
qemu-riscv <qemu-riscv@nongnu.org>
Subject: [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware
Date: Thu, 15 May 2025 20:44:39 +0800 [thread overview]
Message-ID: <87h61mrqko.wl-me@linux.beauty> (raw)
In-Reply-To: <87msberqzi.wl-me@linux.beauty>
From: Li Chen <chenl311@chinatelecom.cn>
The virt machines always instantiate a PL011/16550 at UART0 and
describe it in ACPI (DSDT device node plus optional SPCR table). When
the command line contains “-serial none” there is no backend attached to
that UART, yet the guest still discovers it via ACPI and may try to use
it as a console, causing unexpected results.
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
---
hw/arm/virt-acpi-build.c | 15 +++++++++------
hw/riscv/virt-acpi-build.c | 6 ++++--
include/system/system.h | 2 ++
system/vl.c | 5 +++++
4 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index f25c3b26ce..8a1cde4b44 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -59,6 +59,7 @@
#include "hw/acpi/viot.h"
#include "hw/virtio/virtio-acpi.h"
#include "target/arm/multiprocessing.h"
+#include "system/system.h"
#define ARM_SPI_BASE 32
@@ -825,11 +826,13 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
*/
scope = aml_scope("\\_SB");
acpi_dsdt_add_cpus(scope, vms);
- acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0],
- (irqmap[VIRT_UART0] + ARM_SPI_BASE), 0);
- if (vms->second_ns_uart_present) {
- acpi_dsdt_add_uart(scope, &memmap[VIRT_UART1],
- (irqmap[VIRT_UART1] + ARM_SPI_BASE), 1);
+ if (serial_exist()) {
+ acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0],
+ (irqmap[VIRT_UART0] + ARM_SPI_BASE), 0);
+ if (vms->second_ns_uart_present) {
+ acpi_dsdt_add_uart(scope, &memmap[VIRT_UART1],
+ (irqmap[VIRT_UART1] + ARM_SPI_BASE), 1);
+ }
}
if (vmc->acpi_expose_flash) {
acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
@@ -941,7 +944,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
acpi_add_table(table_offsets, tables_blob);
- if (ms->enable_spcr) {
+ if (ms->enable_spcr && serial_exist()) {
spcr_setup(tables_blob, tables->linker, vms);
}
diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c
index 7f6d221c63..4e0f695a16 100644
--- a/hw/riscv/virt-acpi-build.c
+++ b/hw/riscv/virt-acpi-build.c
@@ -39,6 +39,7 @@
#include "qapi/error.h"
#include "qemu/error-report.h"
#include "system/reset.h"
+#include "system/system.h"
#define ACPI_BUILD_TABLE_SIZE 0x20000
#define ACPI_BUILD_INTC_ID(socket, index) ((socket << 24) | (index))
@@ -449,7 +450,8 @@ static void build_dsdt(GArray *table_data,
memmap[VIRT_APLIC_S].size, "RSCV0002");
}
- acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0], UART0_IRQ);
+ if (serial_exist())
+ acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0], UART0_IRQ);
if (socket_count == 1) {
virtio_acpi_dsdt_add(scope, memmap[VIRT_VIRTIO].base,
@@ -681,7 +683,7 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables)
acpi_add_table(table_offsets, tables_blob);
- if (ms->enable_spcr) {
+ if (ms->enable_spcr && serial_exist()) {
spcr_setup(tables_blob, tables->linker, s);
}
diff --git a/include/system/system.h b/include/system/system.h
index a7effe7dfd..ca1af38432 100644
--- a/include/system/system.h
+++ b/include/system/system.h
@@ -75,6 +75,8 @@ extern unsigned int nb_prom_envs;
/* Return the Chardev for serial port i, or NULL if none */
Chardev *serial_hd(int i);
+bool serial_exist(void);
+
/* parallel ports */
#define MAX_PARALLEL_PORTS 3
diff --git a/system/vl.c b/system/vl.c
index 520956f4a1..7e219df7bf 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -1484,6 +1484,11 @@ Chardev *serial_hd(int i)
return NULL;
}
+bool serial_exist(void)
+{
+ return serial_hd(0) ? true : false;
+}
+
static bool parallel_parse(const char *devname, Error **errp)
{
static int index = 0;
--
2.49.0
next prev parent reply other threads:[~2025-05-15 12:48 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-15 12:35 [PATCH V3 0/4] acpi: Add machine option to disable SPCR table Li Chen
2025-05-15 12:41 ` [PATCH V3 1/4] " Li Chen
2025-05-19 4:12 ` Sunil V L
2025-05-26 10:07 ` Philippe Mathieu-Daudé
2025-05-28 9:10 ` Li Chen
2025-05-15 12:42 ` [PATCH V3 2/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on AArch64 Li Chen
2025-05-15 12:43 ` [PATCH V3 3/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on RISC-V Li Chen
2025-05-19 4:03 ` Sunil V L
2025-05-15 12:44 ` Li Chen [this message]
2025-05-19 4:07 ` [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware Sunil V L
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=87h61mrqko.wl-me@linux.beauty \
--to=me@linux.beauty \
--cc=alistair.francis@wdc.com \
--cc=anisinha@redhat.com \
--cc=eduardo@habkost.net \
--cc=gaosong@loongson.cn \
--cc=imammedo@redhat.com \
--cc=jiaxun.yang@flygoat.com \
--cc=liwei1518@gmail.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=palmer@dabbelt.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=shannon.zhaosl@gmail.com \
--cc=sunilvl@ventanamicro.com \
--cc=wangyanan55@huawei.com \
--cc=zhao1.liu@intel.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: link
Be 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.