qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V3 0/4] acpi: Add machine option to disable SPCR table
@ 2025-05-15 12:35 Li Chen
  2025-05-15 12:41 ` [PATCH V3 1/4] " Li Chen
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Li Chen @ 2025-05-15 12:35 UTC (permalink / raw)
  To: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv


This series introduces a new machine option, spcr=on|off, allowing users
to disable the ACPI SPCR (Serial Port Console Redirection) table.
By default, SPCR is enabled. Disabling it can help ensure that the guest's
console behavior is determined solely by kernel command-line parameters
on arch like arm64, avoiding unintended serial console configurations imposed
 by firmware.

Also add tests on AArch64 and RISC-V virt machines using TCG and UEFI boot.

Changes since v2:
- Omit UART device from DSDT and SPCR construction if no serial device is present,
  as suggested by Philippe Mathieu-Daudé.
- Add Reviewed-by from Gavin Shan <gshan@redhat.com> for the first patch and fix style issue.

Changes since v1:
- Add bios-tables-test for RISC-V and ARM as suggested by 
- Add Acked-by from Michael S. Tsirkin for the first patch
- Add Reviewed-by from Bibo Mao for the first patch

Li Chen (4):
  acpi: Add machine option to disable SPCR table
  tests/qtest/bios-tables-test: Add test for disabling SPCR on AArch64
  tests/qtest/bios-tables-test: Add test for disabling SPCR on RISC-V
  acpi/virt: suppress UART device & SPCR when guest has no serial
    hardware

 hw/arm/virt-acpi-build.c       | 18 ++++++++++-----
 hw/core/machine.c              | 22 ++++++++++++++++++
 hw/loongarch/virt-acpi-build.c |  4 +++-
 hw/riscv/virt-acpi-build.c     |  9 ++++++--
 include/hw/boards.h            |  1 +
 include/system/system.h        |  2 ++
 qemu-options.hx                |  5 ++++
 system/vl.c                    |  5 ++++
 tests/qtest/bios-tables-test.c | 42 ++++++++++++++++++++++++++++++++++
 9 files changed, 99 insertions(+), 9 deletions(-)

-- 
2.49.0



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH V3 1/4] acpi: Add machine option to disable SPCR table
  2025-05-15 12:35 [PATCH V3 0/4] acpi: Add machine option to disable SPCR table Li Chen
@ 2025-05-15 12:41 ` Li Chen
  2025-05-19  4:12   ` Sunil V L
  2025-05-26 10:07   ` Philippe Mathieu-Daudé
  2025-05-15 12:42 ` [PATCH V3 2/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on AArch64 Li Chen
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 10+ messages in thread
From: Li Chen @ 2025-05-15 12:41 UTC (permalink / raw)
  To: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

From: Li Chen <chenl311@chinatelecom.cn>

The ACPI SPCR (Serial Port Console Redirection) table allows firmware
to specify a preferred serial console device to the operating system.
On ARM64 systems, Linux by default respects this table: even if the
kernel command line does not include a hardware serial console (e.g.,
"console=ttyAMA0"), the kernel still register the serial device
referenced by SPCR as a printk console.

While this behavior is standard-compliant, it can lead to situations
where guest console behavior is influenced by platform firmware rather
than user-specified configuration. To make guest console behavior more
predictable and under user control, this patch introduces a machine
option to explicitly disable SPCR table exposure:

    -machine spcr=off

By default, the option is enabled (spcr=on), preserving existing
behavior. When disabled, QEMU will omit the SPCR table from the guest's
ACPI namespace, ensuring that only consoles explicitly declared in the
kernel command line are registered.

Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
---

Changes since V2: Add Reviewed-by from Gavin Shan <gshan@redhat.com>
                  for the first patch and fix style issue.
Changes since V1: add Reviewed-by and Acked-by

 hw/arm/virt-acpi-build.c       |  5 ++++-
 hw/core/machine.c              | 22 ++++++++++++++++++++++
 hw/loongarch/virt-acpi-build.c |  4 +++-
 hw/riscv/virt-acpi-build.c     |  5 ++++-
 include/hw/boards.h            |  1 +
 qemu-options.hx                |  5 +++++
 6 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 3ac8f8e178..f25c3b26ce 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -940,7 +940,10 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
     }

     acpi_add_table(table_offsets, tables_blob);
-    spcr_setup(tables_blob, tables->linker, vms);
+
+    if (ms->enable_spcr) {
+        spcr_setup(tables_blob, tables->linker, vms);
+    }

     acpi_add_table(table_offsets, tables_blob);
     build_dbg2(tables_blob, tables->linker, vms);
diff --git a/hw/core/machine.c b/hw/core/machine.c
index ed01798d37..71a935512e 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -593,6 +593,20 @@ static void machine_set_nvdimm(Object *obj, bool value, Error **errp)
     ms->nvdimms_state->is_enabled = value;
 }

+static bool machine_get_spcr(Object *obj, Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    return ms->enable_spcr;
+}
+
+static void machine_set_spcr(Object *obj, bool value, Error **errp)
+{
+    MachineState *ms = MACHINE(obj);
+
+    ms->enable_spcr = value;
+}
+
 static bool machine_get_hmat(Object *obj, Error **errp)
 {
     MachineState *ms = MACHINE(obj);
@@ -1297,6 +1311,14 @@ static void machine_initfn(Object *obj)
                                         "Table (HMAT)");
     }

+    /* SPCR */
+    ms->enable_spcr = true;
+    object_property_add_bool(obj, "spcr", machine_get_spcr, machine_set_spcr);
+    object_property_set_description(obj, "spcr",
+                                   "Set on/off to enable/disable "
+                                   "ACPI Serial Port Console Redirection "
+                                   "Table (spcr)");
+
     /* default to mc->default_cpus */
     ms->smp.cpus = mc->default_cpus;
     ms->smp.max_cpus = mc->default_cpus;
diff --git a/hw/loongarch/virt-acpi-build.c b/hw/loongarch/virt-acpi-build.c
index fced6c445a..0e437bcf25 100644
--- a/hw/loongarch/virt-acpi-build.c
+++ b/hw/loongarch/virt-acpi-build.c
@@ -557,7 +557,9 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
     acpi_add_table(table_offsets, tables_blob);
     build_srat(tables_blob, tables->linker, machine);
     acpi_add_table(table_offsets, tables_blob);
-    spcr_setup(tables_blob, tables->linker, machine);
+
+    if (machine->enable_spcr)
+        spcr_setup(tables_blob, tables->linker, machine);

     if (machine->numa_state->num_nodes) {
         if (machine->numa_state->have_numa_distance) {
diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c
index 1ad6800508..7f6d221c63 100644
--- a/hw/riscv/virt-acpi-build.c
+++ b/hw/riscv/virt-acpi-build.c
@@ -680,7 +680,10 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables)
     build_rhct(tables_blob, tables->linker, s);

     acpi_add_table(table_offsets, tables_blob);
-    spcr_setup(tables_blob, tables->linker, s);
+
+    if (ms->enable_spcr) {
+        spcr_setup(tables_blob, tables->linker, s);
+    }

     acpi_add_table(table_offsets, tables_blob);
     {
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 765dc8dd35..089104d54b 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -444,6 +444,7 @@ struct MachineState {
     SmpCache smp_cache;
     struct NVDIMMState *nvdimms_state;
     struct NumaState *numa_state;
+    bool enable_spcr;
 };

 /*
diff --git a/qemu-options.hx b/qemu-options.hx
index dc694a99a3..953680595f 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -38,6 +38,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "                nvdimm=on|off controls NVDIMM support (default=off)\n"
     "                memory-encryption=@var{} memory encryption object to use (default=none)\n"
     "                hmat=on|off controls ACPI HMAT support (default=off)\n"
+    "                spcr=on|off controls ACPI SPCR support (default=on)\n"
 #ifdef CONFIG_POSIX
     "                aux-ram-share=on|off allocate auxiliary guest RAM as shared (default: off)\n"
 #endif
@@ -105,6 +106,10 @@ SRST
         Enables or disables ACPI Heterogeneous Memory Attribute Table
         (HMAT) support. The default is off.

+    ``spcr=on|off``
+        Enables or disables ACPI Serial Port Console Redirection Table
+        (SPCR) support. The default is on.
+
     ``aux-ram-share=on|off``
         Allocate auxiliary guest RAM as an anonymous file that is
         shareable with an external process.  This option applies to
--
2.49.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH V3 2/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on AArch64
  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-15 12:42 ` 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-15 12:44 ` [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware Li Chen
  3 siblings, 0 replies; 10+ messages in thread
From: Li Chen @ 2025-05-15 12:42 UTC (permalink / raw)
  To: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

From: Li Chen <chenl311@chinatelecom.cn>

Add ACPI SPCR table test case for ARM when SPCR was off.

Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
---
 tests/qtest/bios-tables-test.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 0a333ec435..d2a1aa7fb3 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1789,6 +1789,24 @@ static void test_acpi_aarch64_virt_tcg_pxb(void)
     free_test_data(&data);
 }
 
+static void test_acpi_aarch64_virt_tcg_acpi_spcr(void)
+{
+    test_data data = {
+        .machine = "virt",
+        .arch = "aarch64",
+        .tcg_only = true,
+        .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
+        .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
+        .cd = "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2",
+        .ram_start = 0x40000000ULL,
+        .scan_len = 128ULL * 1024 * 1024,
+        .variant = ".acpispcr",
+    };
+
+    test_acpi_one("-cpu cortex-a57 "
+                  " -machine spcr=off", &data);
+    free_test_data(&data);
+}
 static void test_acpi_tcg_acpi_hmat(const char *machine, const char *arch)
 {
     test_data data = {};
@@ -2583,6 +2601,8 @@ int main(int argc, char *argv[])
             qtest_add_func("acpi/virt/pxb", test_acpi_aarch64_virt_tcg_pxb);
             qtest_add_func("acpi/virt/oem-fields",
                            test_acpi_aarch64_virt_oem_fields);
+            qtest_add_func("acpi/virt/acpispcr",
+                           test_acpi_aarch64_virt_tcg_acpi_spcr);
             if (qtest_has_device("virtio-iommu-pci")) {
                 qtest_add_func("acpi/virt/viot", test_acpi_aarch64_virt_viot);
             }
-- 
2.49.0



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH V3 3/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on RISC-V
  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-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 ` Li Chen
  2025-05-19  4:03   ` Sunil V L
  2025-05-15 12:44 ` [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware Li Chen
  3 siblings, 1 reply; 10+ messages in thread
From: Li Chen @ 2025-05-15 12:43 UTC (permalink / raw)
  To: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

From: Li Chen <chenl311@chinatelecom.cn>
 
Add ACPI SPCR table test case for RISC-V when SPCR was off.

Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
---
 tests/qtest/bios-tables-test.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index d2a1aa7fb3..44de152a36 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1807,6 +1807,26 @@ static void test_acpi_aarch64_virt_tcg_acpi_spcr(void)
                   " -machine spcr=off", &data);
     free_test_data(&data);
 }
+
+static void test_acpi_riscv_virt_tcg_acpi_spcr(void)
+{
+    test_data data = {
+        .machine = "virt",
+        .arch = "riscv64",
+        .tcg_only = true,
+        .uefi_fl1 = "pc-bios/edk2-riscv-code.fd",
+        .uefi_fl2 = "pc-bios/edk2-riscv-vars.fd",
+        .cd = "tests/data/uefi-boot-images/bios-tables-test.riscv64.iso.qcow2",
+        .ram_start = 0x80000000ULL,
+        .scan_len = 128ULL * 1024 * 1024,
+        .variant = ".acpispcr",
+    };
+
+    test_acpi_one("-cpu rva22s64 "
+                  "-machine spcr=off", &data);
+    free_test_data(&data);
+}
+
 static void test_acpi_tcg_acpi_hmat(const char *machine, const char *arch)
 {
     test_data data = {};
@@ -2612,6 +2632,8 @@ int main(int argc, char *argv[])
             qtest_add_func("acpi/virt", test_acpi_riscv64_virt_tcg);
             qtest_add_func("acpi/virt/numamem",
                            test_acpi_riscv64_virt_tcg_numamem);
+            qtest_add_func("acpi/virt/acpispcr",
+                           test_acpi_riscv_virt_tcg_acpi_spcr);
         }
     }
     ret = g_test_run();
-- 
2.49.0




^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware
  2025-05-15 12:35 [PATCH V3 0/4] acpi: Add machine option to disable SPCR table Li Chen
                   ` (2 preceding siblings ...)
  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-15 12:44 ` Li Chen
  2025-05-19  4:07   ` Sunil V L
  3 siblings, 1 reply; 10+ messages in thread
From: Li Chen @ 2025-05-15 12:44 UTC (permalink / raw)
  To: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

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



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH V3 3/4] tests/qtest/bios-tables-test: Add test for disabling SPCR on RISC-V
  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
  0 siblings, 0 replies; 10+ messages in thread
From: Sunil V L @ 2025-05-19  4:03 UTC (permalink / raw)
  To: Li Chen
  Cc: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Palmer Dabbelt, Alistair Francis,
	Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

On Thu, May 15, 2025 at 08:43:07PM +0800, Li Chen wrote:
> From: Li Chen <chenl311@chinatelecom.cn>
>  
> Add ACPI SPCR table test case for RISC-V when SPCR was off.
> 
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
> ---
>  tests/qtest/bios-tables-test.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> index d2a1aa7fb3..44de152a36 100644
> --- a/tests/qtest/bios-tables-test.c
> +++ b/tests/qtest/bios-tables-test.c
> @@ -1807,6 +1807,26 @@ static void test_acpi_aarch64_virt_tcg_acpi_spcr(void)
>                    " -machine spcr=off", &data);
>      free_test_data(&data);
>  }
> +
> +static void test_acpi_riscv_virt_tcg_acpi_spcr(void)
> +{
> +    test_data data = {
> +        .machine = "virt",
> +        .arch = "riscv64",
> +        .tcg_only = true,
> +        .uefi_fl1 = "pc-bios/edk2-riscv-code.fd",
> +        .uefi_fl2 = "pc-bios/edk2-riscv-vars.fd",
> +        .cd = "tests/data/uefi-boot-images/bios-tables-test.riscv64.iso.qcow2",
> +        .ram_start = 0x80000000ULL,
> +        .scan_len = 128ULL * 1024 * 1024,
> +        .variant = ".acpispcr",
> +    };
> +
> +    test_acpi_one("-cpu rva22s64 "
> +                  "-machine spcr=off", &data);
> +    free_test_data(&data);
> +}
> +
>  static void test_acpi_tcg_acpi_hmat(const char *machine, const char *arch)
>  {
>      test_data data = {};
> @@ -2612,6 +2632,8 @@ int main(int argc, char *argv[])
>              qtest_add_func("acpi/virt", test_acpi_riscv64_virt_tcg);
>              qtest_add_func("acpi/virt/numamem",
>                             test_acpi_riscv64_virt_tcg_numamem);
> +            qtest_add_func("acpi/virt/acpispcr",
> +                           test_acpi_riscv_virt_tcg_acpi_spcr);
>          }
Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware
  2025-05-15 12:44 ` [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware Li Chen
@ 2025-05-19  4:07   ` Sunil V L
  0 siblings, 0 replies; 10+ messages in thread
From: Sunil V L @ 2025-05-19  4:07 UTC (permalink / raw)
  To: Li Chen
  Cc: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Palmer Dabbelt, Alistair Francis,
	Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

On Thu, May 15, 2025 at 08:44:39PM +0800, Li Chen wrote:
> 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;
> +}
> +
LGTM.

Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH V3 1/4] acpi: Add machine option to disable SPCR table
  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é
  1 sibling, 0 replies; 10+ messages in thread
From: Sunil V L @ 2025-05-19  4:12 UTC (permalink / raw)
  To: Li Chen
  Cc: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	"Philippe Mathieu-Daudé", Yanan Wang, Zhao Liu,
	Song Gao, Jiaxun Yang, Palmer Dabbelt, Alistair Francis,
	Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

On Thu, May 15, 2025 at 08:41:03PM +0800, Li Chen wrote:
> From: Li Chen <chenl311@chinatelecom.cn>
> 
> The ACPI SPCR (Serial Port Console Redirection) table allows firmware
> to specify a preferred serial console device to the operating system.
> On ARM64 systems, Linux by default respects this table: even if the
> kernel command line does not include a hardware serial console (e.g.,
> "console=ttyAMA0"), the kernel still register the serial device
> referenced by SPCR as a printk console.
> 
> While this behavior is standard-compliant, it can lead to situations
> where guest console behavior is influenced by platform firmware rather
> than user-specified configuration. To make guest console behavior more
> predictable and under user control, this patch introduces a machine
> option to explicitly disable SPCR table exposure:
> 
>     -machine spcr=off
> 
> By default, the option is enabled (spcr=on), preserving existing
> behavior. When disabled, QEMU will omit the SPCR table from the guest's
> ACPI namespace, ensuring that only consoles explicitly declared in the
> kernel command line are registered.
> 
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
> Reviewed-by: Bibo Mao <maobibo@loongson.cn>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Gavin Shan <gshan@redhat.com>
> ---
> 
> Changes since V2: Add Reviewed-by from Gavin Shan <gshan@redhat.com>
>                   for the first patch and fix style issue.
> Changes since V1: add Reviewed-by and Acked-by
> 
>  hw/arm/virt-acpi-build.c       |  5 ++++-
>  hw/core/machine.c              | 22 ++++++++++++++++++++++
>  hw/loongarch/virt-acpi-build.c |  4 +++-
>  hw/riscv/virt-acpi-build.c     |  5 ++++-
>  include/hw/boards.h            |  1 +
>  qemu-options.hx                |  5 +++++
>  6 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index 3ac8f8e178..f25c3b26ce 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -940,7 +940,10 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
>      }
> 
>      acpi_add_table(table_offsets, tables_blob);
> -    spcr_setup(tables_blob, tables->linker, vms);
> +
> +    if (ms->enable_spcr) {
> +        spcr_setup(tables_blob, tables->linker, vms);
> +    }
> 
>      acpi_add_table(table_offsets, tables_blob);
>      build_dbg2(tables_blob, tables->linker, vms);
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index ed01798d37..71a935512e 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -593,6 +593,20 @@ static void machine_set_nvdimm(Object *obj, bool value, Error **errp)
>      ms->nvdimms_state->is_enabled = value;
>  }
> 
> +static bool machine_get_spcr(Object *obj, Error **errp)
> +{
> +    MachineState *ms = MACHINE(obj);
> +
> +    return ms->enable_spcr;
> +}
> +
> +static void machine_set_spcr(Object *obj, bool value, Error **errp)
> +{
> +    MachineState *ms = MACHINE(obj);
> +
> +    ms->enable_spcr = value;
> +}
> +
>  static bool machine_get_hmat(Object *obj, Error **errp)
>  {
>      MachineState *ms = MACHINE(obj);
> @@ -1297,6 +1311,14 @@ static void machine_initfn(Object *obj)
>                                          "Table (HMAT)");
>      }
> 
> +    /* SPCR */
> +    ms->enable_spcr = true;
> +    object_property_add_bool(obj, "spcr", machine_get_spcr, machine_set_spcr);
> +    object_property_set_description(obj, "spcr",
> +                                   "Set on/off to enable/disable "
> +                                   "ACPI Serial Port Console Redirection "
> +                                   "Table (spcr)");
> +
>      /* default to mc->default_cpus */
>      ms->smp.cpus = mc->default_cpus;
>      ms->smp.max_cpus = mc->default_cpus;
> diff --git a/hw/loongarch/virt-acpi-build.c b/hw/loongarch/virt-acpi-build.c
> index fced6c445a..0e437bcf25 100644
> --- a/hw/loongarch/virt-acpi-build.c
> +++ b/hw/loongarch/virt-acpi-build.c
> @@ -557,7 +557,9 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
>      acpi_add_table(table_offsets, tables_blob);
>      build_srat(tables_blob, tables->linker, machine);
>      acpi_add_table(table_offsets, tables_blob);
> -    spcr_setup(tables_blob, tables->linker, machine);
> +
> +    if (machine->enable_spcr)
> +        spcr_setup(tables_blob, tables->linker, machine);
> 
>      if (machine->numa_state->num_nodes) {
>          if (machine->numa_state->have_numa_distance) {
> diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c
> index 1ad6800508..7f6d221c63 100644
> --- a/hw/riscv/virt-acpi-build.c
> +++ b/hw/riscv/virt-acpi-build.c
> @@ -680,7 +680,10 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables)
>      build_rhct(tables_blob, tables->linker, s);
> 
>      acpi_add_table(table_offsets, tables_blob);
> -    spcr_setup(tables_blob, tables->linker, s);
> +
> +    if (ms->enable_spcr) {
> +        spcr_setup(tables_blob, tables->linker, s);
> +    }
> 
>      acpi_add_table(table_offsets, tables_blob);
>      {
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 765dc8dd35..089104d54b 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -444,6 +444,7 @@ struct MachineState {
>      SmpCache smp_cache;
>      struct NVDIMMState *nvdimms_state;
>      struct NumaState *numa_state;
> +    bool enable_spcr;
>  };
> 
>  /*
> diff --git a/qemu-options.hx b/qemu-options.hx
> index dc694a99a3..953680595f 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -38,6 +38,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
>      "                nvdimm=on|off controls NVDIMM support (default=off)\n"
>      "                memory-encryption=@var{} memory encryption object to use (default=none)\n"
>      "                hmat=on|off controls ACPI HMAT support (default=off)\n"
> +    "                spcr=on|off controls ACPI SPCR support (default=on)\n"
>  #ifdef CONFIG_POSIX
>      "                aux-ram-share=on|off allocate auxiliary guest RAM as shared (default: off)\n"
>  #endif
> @@ -105,6 +106,10 @@ SRST
>          Enables or disables ACPI Heterogeneous Memory Attribute Table
>          (HMAT) support. The default is off.
> 
> +    ``spcr=on|off``
> +        Enables or disables ACPI Serial Port Console Redirection Table
> +        (SPCR) support. The default is on.
> +
Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>

Thanks!
Sunil


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH V3 1/4] acpi: Add machine option to disable SPCR table
  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
  1 sibling, 1 reply; 10+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-05-26 10:07 UTC (permalink / raw)
  To: Li Chen, Peter Maydell, Shannon Zhao, Michael S. Tsirkin,
	Igor Mammedov, Ani Sinha, Eduardo Habkost, Marcel Apfelbaum,
	Yanan Wang, Zhao Liu, Song Gao, Jiaxun Yang, Sunil V L,
	Palmer Dabbelt, Alistair Francis, Weiwei Li, qemu-arm, qemu-devel,
	qemu-riscv

Hi Li,

On 15/5/25 14:41, Li Chen wrote:
> From: Li Chen <chenl311@chinatelecom.cn>
> 
> The ACPI SPCR (Serial Port Console Redirection) table allows firmware
> to specify a preferred serial console device to the operating system.
> On ARM64 systems, Linux by default respects this table: even if the
> kernel command line does not include a hardware serial console (e.g.,
> "console=ttyAMA0"), the kernel still register the serial device
> referenced by SPCR as a printk console.
> 
> While this behavior is standard-compliant, it can lead to situations
> where guest console behavior is influenced by platform firmware rather
> than user-specified configuration. To make guest console behavior more
> predictable and under user control, this patch introduces a machine
> option to explicitly disable SPCR table exposure:
> 
>      -machine spcr=off
> 
> By default, the option is enabled (spcr=on), preserving existing
> behavior. When disabled, QEMU will omit the SPCR table from the guest's
> ACPI namespace, ensuring that only consoles explicitly declared in the
> kernel command line are registered.
> 
> Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
> Reviewed-by: Bibo Mao <maobibo@loongson.cn>
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Gavin Shan <gshan@redhat.com>
> ---


> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 765dc8dd35..089104d54b 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -444,6 +444,7 @@ struct MachineState {
>       SmpCache smp_cache;
>       struct NVDIMMState *nvdimms_state;
>       struct NumaState *numa_state;
> +    bool enable_spcr;

This structure is used by all machines. Can we be more
descriptive, maybe naming as "acpi_spcr_enabled"?

Thanks,

Phil.



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH V3 1/4] acpi: Add machine option to disable SPCR table
  2025-05-26 10:07   ` Philippe Mathieu-Daudé
@ 2025-05-28  9:10     ` Li Chen
  0 siblings, 0 replies; 10+ messages in thread
From: Li Chen @ 2025-05-28  9:10 UTC (permalink / raw)
  To: "Philippe Mathieu-Daudé"
  Cc: Peter Maydell, Shannon Zhao, Michael S. Tsirkin, Igor Mammedov,
	Ani Sinha, Eduardo Habkost, Marcel Apfelbaum, Yanan Wang,
	Zhao Liu, Song Gao, Jiaxun Yang, Sunil V L, Palmer Dabbelt,
	Alistair Francis, Weiwei Li, qemu-arm, qemu-devel, qemu-riscv

Hi Philippe,

 ---- On Mon, 26 May 2025 18:07:16 +0800  Philippe Mathieu-Daudé <philmd@linaro.org> wrote --- 
 > Hi Li,
 > 
 > On 15/5/25 14:41, Li Chen wrote:
 > > From: Li Chen <chenl311@chinatelecom.cn>
 > > 
 > > The ACPI SPCR (Serial Port Console Redirection) table allows firmware
 > > to specify a preferred serial console device to the operating system.
 > > On ARM64 systems, Linux by default respects this table: even if the
 > > kernel command line does not include a hardware serial console (e.g.,
 > > "console=ttyAMA0"), the kernel still register the serial device
 > > referenced by SPCR as a printk console.
 > > 
 > > While this behavior is standard-compliant, it can lead to situations
 > > where guest console behavior is influenced by platform firmware rather
 > > than user-specified configuration. To make guest console behavior more
 > > predictable and under user control, this patch introduces a machine
 > > option to explicitly disable SPCR table exposure:
 > > 
 > >      -machine spcr=off
 > > 
 > > By default, the option is enabled (spcr=on), preserving existing
 > > behavior. When disabled, QEMU will omit the SPCR table from the guest's
 > > ACPI namespace, ensuring that only consoles explicitly declared in the
 > > kernel command line are registered.
 > > 
 > > Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
 > > Reviewed-by: Bibo Mao <maobibo@loongson.cn>
 > > Acked-by: Michael S. Tsirkin <mst@redhat.com>
 > > Reviewed-by: Gavin Shan <gshan@redhat.com>
 > > ---
 > 
 > 
 > > diff --git a/include/hw/boards.h b/include/hw/boards.h
 > > index 765dc8dd35..089104d54b 100644
 > > --- a/include/hw/boards.h
 > > +++ b/include/hw/boards.h
 > > @@ -444,6 +444,7 @@ struct MachineState {
 > >       SmpCache smp_cache;
 > >       struct NVDIMMState *nvdimms_state;
 > >       struct NumaState *numa_state;
 > > +    bool enable_spcr;
 > 
 > This structure is used by all machines. Can we be more
 > descriptive, maybe naming as "acpi_spcr_enabled"?

Make sense to me, updated in v4, thanks!
(But I'm not sure why v4 failed to send to qemu-devel/qemu-arm/qemu-riscv and report
 "Message headers fail syntax check" error).

Regards,
Li



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-05-28  9:12 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH V3 4/4] acpi/virt: suppress UART device & SPCR when guest has no serial hardware Li Chen
2025-05-19  4:07   ` Sunil V L

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).