qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] Add migration test for loongarch64
@ 2024-02-20 12:41 Bibo Mao
  2024-02-20 12:41 ` [PATCH 1/5] hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE Bibo Mao
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

Migration test case is added for loongarch64 here. Since compat machine
type is required for migration test case, also compat machine qemu 9.0
is added for loongarch virt machine.

Bibo Mao (5):
  hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE.
  hw/loongarch: Rename LoongArchMachineState with VirtMachineState
  hw/loongarch: Add compat machine for 9.0
  hw/loongarch: Set minimium memory size as 256M
  tests: Add migration test for loongarch64

 hw/loongarch/acpi-build.c                |  76 +++---
 hw/loongarch/fw_cfg.c                    |   2 +-
 hw/loongarch/fw_cfg.h                    |   2 +-
 hw/loongarch/virt.c                      | 333 +++++++++++++----------
 include/hw/loongarch/virt.h              |  10 +-
 tests/migration/Makefile                 |   2 +-
 tests/migration/loongarch64/Makefile     |  18 ++
 tests/migration/loongarch64/a-b-kernel.S |  46 ++++
 tests/migration/loongarch64/a-b-kernel.h |  13 +
 tests/migration/migration-test.h         |   3 +
 tests/qtest/meson.build                  |   4 +
 tests/qtest/migration-test.c             |  10 +
 12 files changed, 323 insertions(+), 196 deletions(-)
 create mode 100644 tests/migration/loongarch64/Makefile
 create mode 100644 tests/migration/loongarch64/a-b-kernel.S
 create mode 100644 tests/migration/loongarch64/a-b-kernel.h


base-commit: da96ad4a6a2ef26c83b15fa95e7fceef5147269c
-- 
2.39.3



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

* [PATCH 1/5] hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE.
  2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
@ 2024-02-20 12:41 ` Bibo Mao
  2024-02-20 12:41 ` [PATCH 2/5] hw/loongarch: Rename LoongArchMachineState with VirtMachineState Bibo Mao
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

On LoongArch system, there is only virt machine type now, name
LOONGARCH_MACHINE is confused, rename it with VIRT_MACHINE. Name
about Other real hw boards can be added in future.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/acpi-build.c   |  8 ++++----
 hw/loongarch/virt.c         | 19 +++++++++----------
 include/hw/loongarch/virt.h |  4 ++--
 3 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
index a1c4198741..a2f1d6daf7 100644
--- a/hw/loongarch/acpi-build.c
+++ b/hw/loongarch/acpi-build.c
@@ -167,7 +167,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
     int i, arch_id, node_id;
     uint64_t mem_len, mem_base;
     int nb_numa_nodes = machine->numa_state->num_nodes;
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(machine);
+    LoongArchMachineState *lams = VIRT_MACHINE(machine);
     MachineClass *mc = MACHINE_GET_CLASS(lams);
     const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
     AcpiTable table = { .sig = "SRAT", .rev = 1, .oem_id = lams->oem_id,
@@ -279,7 +279,7 @@ static void
 build_la_ged_aml(Aml *dsdt, MachineState *machine)
 {
     uint32_t event;
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(machine);
+    LoongArchMachineState *lams = VIRT_MACHINE(machine);
 
     build_ged_aml(dsdt, "\\_SB."GED_DEVICE,
                   HOTPLUG_HANDLER(lams->acpi_ged),
@@ -368,7 +368,7 @@ static void
 build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 {
     Aml *dsdt, *scope, *pkg;
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(machine);
+    LoongArchMachineState *lams = VIRT_MACHINE(machine);
     AcpiTable table = { .sig = "DSDT", .rev = 1, .oem_id = lams->oem_id,
                         .oem_table_id = lams->oem_table_id };
 
@@ -398,7 +398,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 
 static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(machine);
+    LoongArchMachineState *lams = VIRT_MACHINE(machine);
     GArray *table_offsets;
     AcpiFadtData fadt_data;
     unsigned facs, rsdt, dsdt;
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 0ad7d8c887..02391baadd 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -774,7 +774,7 @@ static void loongarch_init(MachineState *machine)
     ram_addr_t ram_size = machine->ram_size;
     uint64_t highram_size = 0, phyAddr = 0;
     MemoryRegion *address_space_mem = get_system_memory();
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(machine);
+    LoongArchMachineState *lams = VIRT_MACHINE(machine);
     int nb_numa_nodes = machine->numa_state->num_nodes;
     NodeInfo *numa_info = machine->numa_state->nodes;
     int i;
@@ -941,7 +941,7 @@ bool loongarch_is_acpi_enabled(LoongArchMachineState *lams)
 static void loongarch_get_acpi(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(obj);
+    LoongArchMachineState *lams = VIRT_MACHINE(obj);
     OnOffAuto acpi = lams->acpi;
 
     visit_type_OnOffAuto(v, name, &acpi, errp);
@@ -950,14 +950,14 @@ static void loongarch_get_acpi(Object *obj, Visitor *v, const char *name,
 static void loongarch_set_acpi(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(obj);
+    LoongArchMachineState *lams = VIRT_MACHINE(obj);
 
     visit_type_OnOffAuto(v, name, &lams->acpi, errp);
 }
 
 static void loongarch_machine_initfn(Object *obj)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(obj);
+    LoongArchMachineState *lams = VIRT_MACHINE(obj);
 
     lams->acpi = ON_OFF_AUTO_AUTO;
     lams->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
@@ -989,7 +989,7 @@ static void virt_machine_device_pre_plug(HotplugHandler *hotplug_dev,
 static void virt_mem_unplug_request(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(hotplug_dev);
+    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
 
     /* the acpi ged is always exist */
     hotplug_handler_unplug_request(HOTPLUG_HANDLER(lams->acpi_ged), dev,
@@ -1007,7 +1007,7 @@ static void virt_machine_device_unplug_request(HotplugHandler *hotplug_dev,
 static void virt_mem_unplug(HotplugHandler *hotplug_dev,
                              DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(hotplug_dev);
+    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
 
     hotplug_handler_unplug(HOTPLUG_HANDLER(lams->acpi_ged), dev, errp);
     pc_dimm_unplug(PC_DIMM(dev), MACHINE(lams));
@@ -1025,7 +1025,7 @@ static void virt_machine_device_unplug(HotplugHandler *hotplug_dev,
 static void virt_mem_plug(HotplugHandler *hotplug_dev,
                              DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(hotplug_dev);
+    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
 
     pc_dimm_plug(PC_DIMM(dev), MACHINE(lams));
     hotplug_handler_plug(HOTPLUG_HANDLER(lams->acpi_ged),
@@ -1035,7 +1035,7 @@ static void virt_mem_plug(HotplugHandler *hotplug_dev,
 static void loongarch_machine_device_plug_cb(HotplugHandler *hotplug_dev,
                                         DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = LOONGARCH_MACHINE(hotplug_dev);
+    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
     MachineClass *mc = MACHINE_GET_CLASS(lams);
 
     if (device_is_dynamic_sysbus(mc, dev)) {
@@ -1117,7 +1117,6 @@ static void loongarch_class_init(ObjectClass *oc, void *data)
     MachineClass *mc = MACHINE_CLASS(oc);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
-    mc->desc = "Loongson-3A5000 LS7A1000 machine";
     mc->init = loongarch_init;
     mc->default_ram_size = 1 * GiB;
     mc->default_cpu_type = LOONGARCH_CPU_TYPE_NAME("la464");
@@ -1154,7 +1153,7 @@ static void loongarch_class_init(ObjectClass *oc, void *data)
 
 static const TypeInfo loongarch_machine_types[] = {
     {
-        .name           = TYPE_LOONGARCH_MACHINE,
+        .name           = TYPE_VIRT_MACHINE,
         .parent         = TYPE_MACHINE,
         .instance_size  = sizeof(LoongArchMachineState),
         .class_init     = loongarch_class_init,
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
index 6ef9a92394..846e83be05 100644
--- a/include/hw/loongarch/virt.h
+++ b/include/hw/loongarch/virt.h
@@ -55,8 +55,8 @@ struct LoongArchMachineState {
     AddressSpace as_iocsr;
 };
 
-#define TYPE_LOONGARCH_MACHINE  MACHINE_TYPE_NAME("virt")
-OBJECT_DECLARE_SIMPLE_TYPE(LoongArchMachineState, LOONGARCH_MACHINE)
+#define TYPE_VIRT_MACHINE  MACHINE_TYPE_NAME("virt")
+OBJECT_DECLARE_SIMPLE_TYPE(LoongArchMachineState, VIRT_MACHINE)
 bool loongarch_is_acpi_enabled(LoongArchMachineState *lams);
 void loongarch_acpi_setup(LoongArchMachineState *lams);
 #endif
-- 
2.39.3



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

* [PATCH 2/5] hw/loongarch: Rename LoongArchMachineState with VirtMachineState
  2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
  2024-02-20 12:41 ` [PATCH 1/5] hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE Bibo Mao
@ 2024-02-20 12:41 ` Bibo Mao
  2024-02-20 12:41 ` [PATCH 3/5] hw/loongarch: Add compat machine for 9.0 Bibo Mao
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

Rename LoongArchMachineState with VirtMachineState, also change variable
name lams with vms.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/acpi-build.c   |  76 +++++-----
 hw/loongarch/fw_cfg.c       |   2 +-
 hw/loongarch/fw_cfg.h       |   2 +-
 hw/loongarch/virt.c         | 276 ++++++++++++++++++------------------
 include/hw/loongarch/virt.h |   8 +-
 5 files changed, 182 insertions(+), 182 deletions(-)

diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
index a2f1d6daf7..9c1599034f 100644
--- a/hw/loongarch/acpi-build.c
+++ b/hw/loongarch/acpi-build.c
@@ -105,14 +105,14 @@ build_facs(GArray *table_data)
 
 /* build MADT */
 static void
-build_madt(GArray *table_data, BIOSLinker *linker, LoongArchMachineState *lams)
+build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
     MachineClass *mc = MACHINE_GET_CLASS(ms);
     const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms);
     int i, arch_id;
-    AcpiTable table = { .sig = "APIC", .rev = 1, .oem_id = lams->oem_id,
-                        .oem_table_id = lams->oem_table_id };
+    AcpiTable table = { .sig = "APIC", .rev = 1, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
     acpi_table_begin(&table, table_data);
 
@@ -167,11 +167,11 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
     int i, arch_id, node_id;
     uint64_t mem_len, mem_base;
     int nb_numa_nodes = machine->numa_state->num_nodes;
-    LoongArchMachineState *lams = VIRT_MACHINE(machine);
-    MachineClass *mc = MACHINE_GET_CLASS(lams);
+    VirtMachineState *vms = VIRT_MACHINE(machine);
+    MachineClass *mc = MACHINE_GET_CLASS(vms);
     const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
-    AcpiTable table = { .sig = "SRAT", .rev = 1, .oem_id = lams->oem_id,
-                        .oem_table_id = lams->oem_table_id };
+    AcpiTable table = { .sig = "SRAT", .rev = 1, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
     acpi_table_begin(&table, table_data);
     build_append_int_noprefix(table_data, 1, 4); /* Reserved */
@@ -279,13 +279,13 @@ static void
 build_la_ged_aml(Aml *dsdt, MachineState *machine)
 {
     uint32_t event;
-    LoongArchMachineState *lams = VIRT_MACHINE(machine);
+    VirtMachineState *vms = VIRT_MACHINE(machine);
 
     build_ged_aml(dsdt, "\\_SB."GED_DEVICE,
-                  HOTPLUG_HANDLER(lams->acpi_ged),
+                  HOTPLUG_HANDLER(vms->acpi_ged),
                   VIRT_SCI_IRQ, AML_SYSTEM_MEMORY,
                   VIRT_GED_EVT_ADDR);
-    event = object_property_get_uint(OBJECT(lams->acpi_ged),
+    event = object_property_get_uint(OBJECT(vms->acpi_ged),
                                      "ged-event", &error_abort);
     if (event & ACPI_GED_MEM_HOTPLUG_EVT) {
         build_memory_hotplug_aml(dsdt, machine->ram_slots, "\\_SB", NULL,
@@ -295,7 +295,7 @@ build_la_ged_aml(Aml *dsdt, MachineState *machine)
     acpi_dsdt_add_power_button(dsdt);
 }
 
-static void build_pci_device_aml(Aml *scope, LoongArchMachineState *lams)
+static void build_pci_device_aml(Aml *scope, VirtMachineState *vms)
 {
     struct GPEXConfig cfg = {
         .mmio64.base = VIRT_PCI_MEM_BASE,
@@ -305,13 +305,13 @@ static void build_pci_device_aml(Aml *scope, LoongArchMachineState *lams)
         .ecam.base   = VIRT_PCI_CFG_BASE,
         .ecam.size   = VIRT_PCI_CFG_SIZE,
         .irq         = VIRT_GSI_BASE + VIRT_DEVICE_IRQS,
-        .bus         = lams->pci_bus,
+        .bus         = vms->pci_bus,
     };
 
     acpi_dsdt_add_gpex(scope, &cfg);
 }
 
-static void build_flash_aml(Aml *scope, LoongArchMachineState *lams)
+static void build_flash_aml(Aml *scope, VirtMachineState *vms)
 {
     Aml *dev, *crs;
 
@@ -329,7 +329,7 @@ static void build_flash_aml(Aml *scope, LoongArchMachineState *lams)
 }
 
 #ifdef CONFIG_TPM
-static void acpi_dsdt_add_tpm(Aml *scope, LoongArchMachineState *vms)
+static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms)
 {
     PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev);
     hwaddr pbus_base = VIRT_PLATFORM_BUS_BASEADDRESS;
@@ -368,18 +368,18 @@ static void
 build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 {
     Aml *dsdt, *scope, *pkg;
-    LoongArchMachineState *lams = VIRT_MACHINE(machine);
-    AcpiTable table = { .sig = "DSDT", .rev = 1, .oem_id = lams->oem_id,
-                        .oem_table_id = lams->oem_table_id };
+    VirtMachineState *vms = VIRT_MACHINE(machine);
+    AcpiTable table = { .sig = "DSDT", .rev = 1, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
     acpi_table_begin(&table, table_data);
     dsdt = init_aml_allocator();
     build_uart_device_aml(dsdt);
-    build_pci_device_aml(dsdt, lams);
+    build_pci_device_aml(dsdt, vms);
     build_la_ged_aml(dsdt, machine);
-    build_flash_aml(dsdt, lams);
+    build_flash_aml(dsdt, vms);
 #ifdef CONFIG_TPM
-    acpi_dsdt_add_tpm(dsdt, lams);
+    acpi_dsdt_add_tpm(dsdt, vms);
 #endif
     /* System State Package */
     scope = aml_scope("\\");
@@ -398,7 +398,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 
 static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(machine);
+    VirtMachineState *vms = VIRT_MACHINE(machine);
     GArray *table_offsets;
     AcpiFadtData fadt_data;
     unsigned facs, rsdt, dsdt;
@@ -432,14 +432,14 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
     fadt_data.dsdt_tbl_offset = &dsdt;
     fadt_data.xdsdt_tbl_offset = &dsdt;
     build_fadt(tables_blob, tables->linker, &fadt_data,
-               lams->oem_id, lams->oem_table_id);
+               vms->oem_id, vms->oem_table_id);
 
     acpi_add_table(table_offsets, tables_blob);
-    build_madt(tables_blob, tables->linker, lams);
+    build_madt(tables_blob, tables->linker, vms);
 
     acpi_add_table(table_offsets, tables_blob);
     build_pptt(tables_blob, tables->linker, machine,
-               lams->oem_id, lams->oem_table_id);
+               vms->oem_id, vms->oem_table_id);
 
     acpi_add_table(table_offsets, tables_blob);
     build_srat(tables_blob, tables->linker, machine);
@@ -447,13 +447,13 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
     if (machine->numa_state->num_nodes) {
         if (machine->numa_state->have_numa_distance) {
             acpi_add_table(table_offsets, tables_blob);
-            build_slit(tables_blob, tables->linker, machine, lams->oem_id,
-                       lams->oem_table_id);
+            build_slit(tables_blob, tables->linker, machine, vms->oem_id,
+                       vms->oem_table_id);
         }
         if (machine->numa_state->hmat_enabled) {
             acpi_add_table(table_offsets, tables_blob);
             build_hmat(tables_blob, tables->linker, machine->numa_state,
-                       lams->oem_id, lams->oem_table_id);
+                       vms->oem_id, vms->oem_table_id);
         }
     }
 
@@ -463,8 +463,8 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
            .base = cpu_to_le64(VIRT_PCI_CFG_BASE),
            .size = cpu_to_le64(VIRT_PCI_CFG_SIZE),
         };
-        build_mcfg(tables_blob, tables->linker, &mcfg, lams->oem_id,
-                   lams->oem_table_id);
+        build_mcfg(tables_blob, tables->linker, &mcfg, vms->oem_id,
+                   vms->oem_table_id);
     }
 
 #ifdef CONFIG_TPM
@@ -472,8 +472,8 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
     if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) {
         acpi_add_table(table_offsets, tables_blob);
         build_tpm2(tables_blob, tables->linker,
-                   tables->tcpalog, lams->oem_id,
-                   lams->oem_table_id);
+                   tables->tcpalog, vms->oem_id,
+                   vms->oem_table_id);
     }
 #endif
     /* Add tables supplied by user (if any) */
@@ -487,13 +487,13 @@ static void acpi_build(AcpiBuildTables *tables, MachineState *machine)
     /* RSDT is pointed to by RSDP */
     rsdt = tables_blob->len;
     build_rsdt(tables_blob, tables->linker, table_offsets,
-               lams->oem_id, lams->oem_table_id);
+               vms->oem_id, vms->oem_table_id);
 
     /* RSDP is in FSEG memory, so allocate it separately */
     {
         AcpiRsdpData rsdp_data = {
             .revision = 0,
-            .oem_id = lams->oem_id,
+            .oem_id = vms->oem_id,
             .xsdt_tbl_offset = NULL,
             .rsdt_tbl_offset = &rsdt,
         };
@@ -570,17 +570,17 @@ static const VMStateDescription vmstate_acpi_build = {
     },
 };
 
-void loongarch_acpi_setup(LoongArchMachineState *lams)
+void virt_acpi_setup(VirtMachineState *vms)
 {
     AcpiBuildTables tables;
     AcpiBuildState *build_state;
 
-    if (!lams->fw_cfg) {
+    if (!vms->fw_cfg) {
         ACPI_BUILD_DPRINTF("No fw cfg. Bailing out.\n");
         return;
     }
 
-    if (!loongarch_is_acpi_enabled(lams)) {
+    if (!virt_is_acpi_enabled(vms)) {
         ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n");
         return;
     }
@@ -588,7 +588,7 @@ void loongarch_acpi_setup(LoongArchMachineState *lams)
     build_state = g_malloc0(sizeof *build_state);
 
     acpi_build_tables_init(&tables);
-    acpi_build(&tables, MACHINE(lams));
+    acpi_build(&tables, MACHINE(vms));
 
     /* Now expose it all to Guest */
     build_state->table_mr = acpi_add_rom_blob(acpi_build_update,
diff --git a/hw/loongarch/fw_cfg.c b/hw/loongarch/fw_cfg.c
index f15a17416c..35aeb2decb 100644
--- a/hw/loongarch/fw_cfg.c
+++ b/hw/loongarch/fw_cfg.c
@@ -17,7 +17,7 @@ static void fw_cfg_boot_set(void *opaque, const char *boot_device,
     fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
 }
 
-FWCfgState *loongarch_fw_cfg_init(ram_addr_t ram_size, MachineState *ms)
+FWCfgState *virt_fw_cfg_init(ram_addr_t ram_size, MachineState *ms)
 {
     FWCfgState *fw_cfg;
     int max_cpus = ms->smp.max_cpus;
diff --git a/hw/loongarch/fw_cfg.h b/hw/loongarch/fw_cfg.h
index 7c0de4db4a..27ee68286e 100644
--- a/hw/loongarch/fw_cfg.h
+++ b/hw/loongarch/fw_cfg.h
@@ -11,5 +11,5 @@
 #include "hw/boards.h"
 #include "hw/nvram/fw_cfg.h"
 
-FWCfgState *loongarch_fw_cfg_init(ram_addr_t ram_size, MachineState *ms);
+FWCfgState *virt_fw_cfg_init(ram_addr_t ram_size, MachineState *ms);
 #endif
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 02391baadd..d0827aafab 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -54,7 +54,7 @@ struct loaderparams {
     const char *initrd_filename;
 };
 
-static void virt_flash_create(LoongArchMachineState *lams)
+static void virt_flash_create(VirtMachineState *vms)
 {
     DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
 
@@ -67,17 +67,17 @@ static void virt_flash_create(LoongArchMachineState *lams)
     qdev_prop_set_uint16(dev, "id2", 0x00);
     qdev_prop_set_uint16(dev, "id3", 0x00);
     qdev_prop_set_string(dev, "name", "virt.flash");
-    object_property_add_child(OBJECT(lams), "virt.flash", OBJECT(dev));
-    object_property_add_alias(OBJECT(lams), "pflash",
+    object_property_add_child(OBJECT(vms), "virt.flash", OBJECT(dev));
+    object_property_add_alias(OBJECT(vms), "pflash",
                               OBJECT(dev), "drive");
 
-    lams->flash = PFLASH_CFI01(dev);
+    vms->flash = PFLASH_CFI01(dev);
 }
 
-static void virt_flash_map(LoongArchMachineState *lams,
+static void virt_flash_map(VirtMachineState *vms,
                            MemoryRegion *sysmem)
 {
-    PFlashCFI01 *flash = lams->flash;
+    PFlashCFI01 *flash = vms->flash;
     DeviceState *dev = DEVICE(flash);
     hwaddr base = VIRT_FLASH_BASE;
     hwaddr size = VIRT_FLASH_SIZE;
@@ -92,9 +92,9 @@ static void virt_flash_map(LoongArchMachineState *lams,
 
 }
 
-static void fdt_add_flash_node(LoongArchMachineState *lams)
+static void fdt_add_flash_node(VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
     char *nodename;
 
     hwaddr flash_base = VIRT_FLASH_BASE;
@@ -109,12 +109,12 @@ static void fdt_add_flash_node(LoongArchMachineState *lams)
     g_free(nodename);
 }
 
-static void fdt_add_rtc_node(LoongArchMachineState *lams)
+static void fdt_add_rtc_node(VirtMachineState *vms)
 {
     char *nodename;
     hwaddr base = VIRT_RTC_REG_BASE;
     hwaddr size = VIRT_RTC_LEN;
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
 
     nodename = g_strdup_printf("/rtc@%" PRIx64, base);
     qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -123,12 +123,12 @@ static void fdt_add_rtc_node(LoongArchMachineState *lams)
     g_free(nodename);
 }
 
-static void fdt_add_uart_node(LoongArchMachineState *lams)
+static void fdt_add_uart_node(VirtMachineState *vms)
 {
     char *nodename;
     hwaddr base = VIRT_UART_BASE;
     hwaddr size = VIRT_UART_SIZE;
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
 
     nodename = g_strdup_printf("/serial@%" PRIx64, base);
     qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -139,11 +139,11 @@ static void fdt_add_uart_node(LoongArchMachineState *lams)
     g_free(nodename);
 }
 
-static void create_fdt(LoongArchMachineState *lams)
+static void create_fdt(VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
 
-    ms->fdt = create_device_tree(&lams->fdt_size);
+    ms->fdt = create_device_tree(&vms->fdt_size);
     if (!ms->fdt) {
         error_report("create_device_tree() failed");
         exit(1);
@@ -157,10 +157,10 @@ static void create_fdt(LoongArchMachineState *lams)
     qemu_fdt_add_subnode(ms->fdt, "/chosen");
 }
 
-static void fdt_add_cpu_nodes(const LoongArchMachineState *lams)
+static void fdt_add_cpu_nodes(const VirtMachineState *vms)
 {
     int num;
-    const MachineState *ms = MACHINE(lams);
+    const MachineState *ms = MACHINE(vms);
     int smp_cpus = ms->smp.cpus;
 
     qemu_fdt_add_subnode(ms->fdt, "/cpus");
@@ -214,11 +214,11 @@ static void fdt_add_cpu_nodes(const LoongArchMachineState *lams)
     }
 }
 
-static void fdt_add_fw_cfg_node(const LoongArchMachineState *lams)
+static void fdt_add_fw_cfg_node(const VirtMachineState *vms)
 {
     char *nodename;
     hwaddr base = VIRT_FWCFG_BASE;
-    const MachineState *ms = MACHINE(lams);
+    const MachineState *ms = MACHINE(vms);
 
     nodename = g_strdup_printf("/fw_cfg@%" PRIx64, base);
     qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -230,7 +230,7 @@ static void fdt_add_fw_cfg_node(const LoongArchMachineState *lams)
     g_free(nodename);
 }
 
-static void fdt_add_pcie_node(const LoongArchMachineState *lams)
+static void fdt_add_pcie_node(const VirtMachineState *vms)
 {
     char *nodename;
     hwaddr base_mmio = VIRT_PCI_MEM_BASE;
@@ -241,7 +241,7 @@ static void fdt_add_pcie_node(const LoongArchMachineState *lams)
     hwaddr size_pcie = VIRT_PCI_CFG_SIZE;
     hwaddr base = base_pcie;
 
-    const MachineState *ms = MACHINE(lams);
+    const MachineState *ms = MACHINE(vms);
 
     nodename = g_strdup_printf("/pcie@%" PRIx64, base);
     qemu_fdt_add_subnode(ms->fdt, nodename);
@@ -264,9 +264,9 @@ static void fdt_add_pcie_node(const LoongArchMachineState *lams)
     g_free(nodename);
 }
 
-static void fdt_add_irqchip_node(LoongArchMachineState *lams)
+static void fdt_add_irqchip_node(VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
     char *nodename;
     uint32_t irqchip_phandle;
 
@@ -308,15 +308,15 @@ static void fdt_add_memory_node(MachineState *ms,
     g_free(nodename);
 }
 
-static void virt_build_smbios(LoongArchMachineState *lams)
+static void virt_build_smbios(VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
-    MachineClass *mc = MACHINE_GET_CLASS(lams);
+    MachineState *ms = MACHINE(vms);
+    MachineClass *mc = MACHINE_GET_CLASS(vms);
     uint8_t *smbios_tables, *smbios_anchor;
     size_t smbios_tables_len, smbios_anchor_len;
     const char *product = "QEMU Virtual Machine";
 
-    if (!lams->fw_cfg) {
+    if (!vms->fw_cfg) {
         return;
     }
 
@@ -327,25 +327,25 @@ static void virt_build_smbios(LoongArchMachineState *lams)
                       &smbios_anchor, &smbios_anchor_len, &error_fatal);
 
     if (smbios_anchor) {
-        fw_cfg_add_file(lams->fw_cfg, "etc/smbios/smbios-tables",
+        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-tables",
                         smbios_tables, smbios_tables_len);
-        fw_cfg_add_file(lams->fw_cfg, "etc/smbios/smbios-anchor",
+        fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-anchor",
                         smbios_anchor, smbios_anchor_len);
     }
 }
 
 static void virt_machine_done(Notifier *notifier, void *data)
 {
-    LoongArchMachineState *lams = container_of(notifier,
-                                        LoongArchMachineState, machine_done);
-    virt_build_smbios(lams);
-    loongarch_acpi_setup(lams);
+    VirtMachineState *vms = container_of(notifier,
+                                        VirtMachineState, machine_done);
+    virt_build_smbios(vms);
+    virt_acpi_setup(vms);
 }
 
 static void virt_powerdown_req(Notifier *notifier, void *opaque)
 {
-    LoongArchMachineState *s = container_of(notifier,
-                                   LoongArchMachineState, powerdown_notifier);
+    VirtMachineState *s = container_of(notifier,
+                                   VirtMachineState, powerdown_notifier);
 
     acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
 }
@@ -376,7 +376,7 @@ static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
     memmap_entries++;
 }
 
-static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
+static uint64_t cpu_virt_to_phys(void *opaque, uint64_t addr)
 {
     return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
 }
@@ -387,7 +387,7 @@ static int64_t load_kernel_info(const struct loaderparams *loaderparams)
     ssize_t kernel_size;
 
     kernel_size = load_elf(loaderparams->kernel_filename, NULL,
-                           cpu_loongarch_virt_to_phys, NULL,
+                           cpu_virt_to_phys, NULL,
                            &kernel_entry, &kernel_low,
                            &kernel_high, NULL, 0,
                            EM_LOONGARCH, 1, 0);
@@ -401,10 +401,10 @@ static int64_t load_kernel_info(const struct loaderparams *loaderparams)
     return kernel_entry;
 }
 
-static DeviceState *create_acpi_ged(DeviceState *pch_pic, LoongArchMachineState *lams)
+static DeviceState *create_acpi_ged(DeviceState *pch_pic, VirtMachineState *vms)
 {
     DeviceState *dev;
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
     uint32_t event = ACPI_GED_PWR_DOWN_EVT;
 
     if (ms->ram_slots) {
@@ -451,9 +451,9 @@ static DeviceState *create_platform_bus(DeviceState *pch_pic)
     return dev;
 }
 
-static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *lams)
+static void virt_devices_init(DeviceState *pch_pic, VirtMachineState *vms)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(lams);
+    MachineClass *mc = MACHINE_GET_CLASS(vms);
     DeviceState *gpex_dev;
     SysBusDevice *d;
     PCIBus *pci_bus;
@@ -465,7 +465,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
     d = SYS_BUS_DEVICE(gpex_dev);
     sysbus_realize_and_unref(d, &error_fatal);
     pci_bus = PCI_HOST_BRIDGE(gpex_dev)->bus;
-    lams->pci_bus = pci_bus;
+    vms->pci_bus = pci_bus;
 
     /* Map only part size_ecam bytes of ECAM space */
     ecam_alias = g_new0(MemoryRegion, 1);
@@ -501,7 +501,7 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
                    qdev_get_gpio_in(pch_pic,
                                     VIRT_UART_IRQ - VIRT_GSI_BASE),
                    115200, serial_hd(0), DEVICE_LITTLE_ENDIAN);
-    fdt_add_uart_node(lams);
+    fdt_add_uart_node(vms);
 
     /* Network init */
     pci_init_nic_devices(pci_bus, mc->default_nic);
@@ -514,17 +514,17 @@ static void loongarch_devices_init(DeviceState *pch_pic, LoongArchMachineState *
     sysbus_create_simple("ls7a_rtc", VIRT_RTC_REG_BASE,
                          qdev_get_gpio_in(pch_pic,
                          VIRT_RTC_IRQ - VIRT_GSI_BASE));
-    fdt_add_rtc_node(lams);
+    fdt_add_rtc_node(vms);
 
     /* acpi ged */
-    lams->acpi_ged = create_acpi_ged(pch_pic, lams);
+    vms->acpi_ged = create_acpi_ged(pch_pic, vms);
     /* platform bus */
-    lams->platform_bus_dev = create_platform_bus(pch_pic);
+    vms->platform_bus_dev = create_platform_bus(pch_pic);
 }
 
-static void loongarch_irq_init(LoongArchMachineState *lams)
+static void virt_irq_init(VirtMachineState *vms)
 {
-    MachineState *ms = MACHINE(lams);
+    MachineState *ms = MACHINE(vms);
     DeviceState *pch_pic, *pch_msi, *cpudev;
     DeviceState *ipi, *extioi;
     SysBusDevice *d;
@@ -561,9 +561,9 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
     sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
 
     /* IPI iocsr memory region */
-    memory_region_add_subregion(&lams->system_iocsr, SMP_IPI_MAILBOX,
+    memory_region_add_subregion(&vms->system_iocsr, SMP_IPI_MAILBOX,
                    sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 0));
-    memory_region_add_subregion(&lams->system_iocsr, MAIL_SEND_ADDR,
+    memory_region_add_subregion(&vms->system_iocsr, MAIL_SEND_ADDR,
                    sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
 
     for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
@@ -571,7 +571,7 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
         cpudev = DEVICE(cpu_state);
         lacpu = LOONGARCH_CPU(cpu_state);
         env = &(lacpu->env);
-        env->address_space_iocsr = &lams->as_iocsr;
+        env->address_space_iocsr = &vms->as_iocsr;
 
         /* connect ipi irq to cpu irq */
         qdev_connect_gpio_out(ipi, cpu, qdev_get_gpio_in(cpudev, IRQ_IPI));
@@ -582,7 +582,7 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
     extioi = qdev_new(TYPE_LOONGARCH_EXTIOI);
     qdev_prop_set_uint32(extioi, "num-cpu", ms->smp.cpus);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(extioi), &error_fatal);
-    memory_region_add_subregion(&lams->system_iocsr, APIC_BASE,
+    memory_region_add_subregion(&vms->system_iocsr, APIC_BASE,
                    sysbus_mmio_get_region(SYS_BUS_DEVICE(extioi), 0));
 
     /*
@@ -630,18 +630,18 @@ static void loongarch_irq_init(LoongArchMachineState *lams)
                               qdev_get_gpio_in(extioi, i + start));
     }
 
-    loongarch_devices_init(pch_pic, lams);
+    virt_devices_init(pch_pic, vms);
 }
 
-static void loongarch_firmware_init(LoongArchMachineState *lams)
+static void virt_firmware_init(VirtMachineState *vms)
 {
-    char *filename = MACHINE(lams)->firmware;
+    char *filename = MACHINE(vms)->firmware;
     char *bios_name = NULL;
     int bios_size;
 
-    lams->bios_loaded = false;
+    vms->bios_loaded = false;
 
-    virt_flash_map(lams, get_system_memory());
+    virt_flash_map(vms, get_system_memory());
 
     if (filename) {
         bios_name = qemu_find_file(QEMU_FILE_TYPE_BIOS, filename);
@@ -658,11 +658,11 @@ static void loongarch_firmware_init(LoongArchMachineState *lams)
 
         g_free(bios_name);
 
-        memory_region_init_ram(&lams->bios, NULL, "loongarch.bios",
+        memory_region_init_ram(&vms->bios, NULL, "loongarch.bios",
                                VIRT_BIOS_SIZE, &error_fatal);
-        memory_region_set_readonly(&lams->bios, true);
-        memory_region_add_subregion(get_system_memory(), VIRT_BIOS_BASE, &lams->bios);
-        lams->bios_loaded = true;
+        memory_region_set_readonly(&vms->bios, true);
+        memory_region_add_subregion(get_system_memory(), VIRT_BIOS_BASE, &vms->bios);
+        vms->bios_loaded = true;
     }
 
 }
@@ -705,16 +705,16 @@ static void fw_cfg_add_kernel_info(const struct loaderparams *loaderparams,
     }
 }
 
-static void loongarch_firmware_boot(LoongArchMachineState *lams,
+static void virt_firmware_boot(VirtMachineState *vms,
                                     const struct loaderparams *loaderparams)
 {
-    fw_cfg_add_kernel_info(loaderparams, lams->fw_cfg);
+    fw_cfg_add_kernel_info(loaderparams, vms->fw_cfg);
 }
 
-static void loongarch_direct_kernel_boot(LoongArchMachineState *lams,
+static void virt_direct_kernel_boot(VirtMachineState *vms,
                                          const struct loaderparams *loaderparams)
 {
-    MachineState *machine = MACHINE(lams);
+    MachineState *machine = MACHINE(vms);
     int64_t kernel_addr = 0;
     LoongArchCPU *lacpu;
     int i;
@@ -729,12 +729,12 @@ static void loongarch_direct_kernel_boot(LoongArchMachineState *lams,
     }
 }
 
-static void loongarch_qemu_write(void *opaque, hwaddr addr,
+static void virt_qemu_write(void *opaque, hwaddr addr,
                                  uint64_t val, unsigned size)
 {
 }
 
-static uint64_t loongarch_qemu_read(void *opaque, hwaddr addr, unsigned size)
+static uint64_t virt_qemu_read(void *opaque, hwaddr addr, unsigned size)
 {
     switch (addr) {
     case VERSION_REG:
@@ -752,9 +752,9 @@ static uint64_t loongarch_qemu_read(void *opaque, hwaddr addr, unsigned size)
     return 0ULL;
 }
 
-static const MemoryRegionOps loongarch_qemu_ops = {
-    .read = loongarch_qemu_read,
-    .write = loongarch_qemu_write,
+static const MemoryRegionOps virt_qemu_ops = {
+    .read = virt_qemu_read,
+    .write = virt_qemu_write,
     .endianness = DEVICE_LITTLE_ENDIAN,
     .valid = {
         .min_access_size = 4,
@@ -766,7 +766,7 @@ static const MemoryRegionOps loongarch_qemu_ops = {
     },
 };
 
-static void loongarch_init(MachineState *machine)
+static void virt_init(MachineState *machine)
 {
     LoongArchCPU *lacpu;
     const char *cpu_model = machine->cpu_type;
@@ -774,7 +774,7 @@ static void loongarch_init(MachineState *machine)
     ram_addr_t ram_size = machine->ram_size;
     uint64_t highram_size = 0, phyAddr = 0;
     MemoryRegion *address_space_mem = get_system_memory();
-    LoongArchMachineState *lams = VIRT_MACHINE(machine);
+    VirtMachineState *vms = VIRT_MACHINE(machine);
     int nb_numa_nodes = machine->numa_state->num_nodes;
     NodeInfo *numa_info = machine->numa_state->nodes;
     int i;
@@ -793,16 +793,16 @@ static void loongarch_init(MachineState *machine)
         error_report("ram_size must be greater than 1G.");
         exit(1);
     }
-    create_fdt(lams);
+    create_fdt(vms);
 
     /* Create IOCSR space */
-    memory_region_init_io(&lams->system_iocsr, OBJECT(machine), NULL,
+    memory_region_init_io(&vms->system_iocsr, OBJECT(machine), NULL,
                           machine, "iocsr", UINT64_MAX);
-    address_space_init(&lams->as_iocsr, &lams->system_iocsr, "IOCSR");
-    memory_region_init_io(&lams->iocsr_mem, OBJECT(machine),
-                          &loongarch_qemu_ops,
+    address_space_init(&vms->as_iocsr, &vms->system_iocsr, "IOCSR");
+    memory_region_init_io(&vms->iocsr_mem, OBJECT(machine),
+                          &virt_qemu_ops,
                           machine, "iocsr_misc", 0x428);
-    memory_region_add_subregion(&lams->system_iocsr, 0, &lams->iocsr_mem);
+    memory_region_add_subregion(&vms->system_iocsr, 0, &vms->iocsr_mem);
 
     /* Init CPUs */
     possible_cpus = mc->possible_cpu_arch_ids(machine);
@@ -813,14 +813,14 @@ static void loongarch_init(MachineState *machine)
         lacpu = LOONGARCH_CPU(cpu);
         lacpu->phy_id = machine->possible_cpus->cpus[i].arch_id;
     }
-    fdt_add_cpu_nodes(lams);
+    fdt_add_cpu_nodes(vms);
 
     /* Node0 memory */
     memmap_add_entry(VIRT_LOWMEM_BASE, VIRT_LOWMEM_SIZE, 1);
     fdt_add_memory_node(machine, VIRT_LOWMEM_BASE, VIRT_LOWMEM_SIZE, 0);
-    memory_region_init_alias(&lams->lowmem, NULL, "loongarch.node0.lowram",
+    memory_region_init_alias(&vms->lowmem, NULL, "loongarch.node0.lowram",
                              machine->ram, offset, VIRT_LOWMEM_SIZE);
-    memory_region_add_subregion(address_space_mem, phyAddr, &lams->lowmem);
+    memory_region_add_subregion(address_space_mem, phyAddr, &vms->lowmem);
 
     offset += VIRT_LOWMEM_SIZE;
     if (nb_numa_nodes > 0) {
@@ -832,9 +832,9 @@ static void loongarch_init(MachineState *machine)
     phyAddr = VIRT_HIGHMEM_BASE;
     memmap_add_entry(phyAddr, highram_size, 1);
     fdt_add_memory_node(machine, phyAddr, highram_size, 0);
-    memory_region_init_alias(&lams->highmem, NULL, "loongarch.node0.highram",
+    memory_region_init_alias(&vms->highmem, NULL, "loongarch.node0.highram",
                               machine->ram, offset, highram_size);
-    memory_region_add_subregion(address_space_mem, phyAddr, &lams->highmem);
+    memory_region_add_subregion(address_space_mem, phyAddr, &vms->highmem);
 
     /* Node1 - Nodemax memory */
     offset += highram_size;
@@ -875,49 +875,49 @@ static void loongarch_init(MachineState *machine)
     }
 
     /* load the BIOS image. */
-    loongarch_firmware_init(lams);
+    virt_firmware_init(vms);
 
     /* fw_cfg init */
-    lams->fw_cfg = loongarch_fw_cfg_init(ram_size, machine);
-    rom_set_fw(lams->fw_cfg);
-    if (lams->fw_cfg != NULL) {
-        fw_cfg_add_file(lams->fw_cfg, "etc/memmap",
+    vms->fw_cfg = virt_fw_cfg_init(ram_size, machine);
+    rom_set_fw(vms->fw_cfg);
+    if (vms->fw_cfg != NULL) {
+        fw_cfg_add_file(vms->fw_cfg, "etc/memmap",
                         memmap_table,
                         sizeof(struct memmap_entry) * (memmap_entries));
     }
-    fdt_add_fw_cfg_node(lams);
+    fdt_add_fw_cfg_node(vms);
     loaderparams.ram_size = ram_size;
     loaderparams.kernel_filename = machine->kernel_filename;
     loaderparams.kernel_cmdline = machine->kernel_cmdline;
     loaderparams.initrd_filename = machine->initrd_filename;
     /* load the kernel. */
     if (loaderparams.kernel_filename) {
-        if (lams->bios_loaded) {
-            loongarch_firmware_boot(lams, &loaderparams);
+        if (vms->bios_loaded) {
+            virt_firmware_boot(vms, &loaderparams);
         } else {
-            loongarch_direct_kernel_boot(lams, &loaderparams);
+            virt_direct_kernel_boot(vms, &loaderparams);
         }
     }
-    fdt_add_flash_node(lams);
+    fdt_add_flash_node(vms);
     /* register reset function */
     for (i = 0; i < machine->smp.cpus; i++) {
         lacpu = LOONGARCH_CPU(qemu_get_cpu(i));
         qemu_register_reset(reset_load_elf, lacpu);
     }
     /* Initialize the IO interrupt subsystem */
-    loongarch_irq_init(lams);
-    fdt_add_irqchip_node(lams);
+    virt_irq_init(vms);
+    fdt_add_irqchip_node(vms);
     platform_bus_add_all_fdt_nodes(machine->fdt, "/intc",
                                    VIRT_PLATFORM_BUS_BASEADDRESS,
                                    VIRT_PLATFORM_BUS_SIZE,
                                    VIRT_PLATFORM_BUS_IRQ);
-    lams->machine_done.notify = virt_machine_done;
-    qemu_add_machine_init_done_notifier(&lams->machine_done);
+    vms->machine_done.notify = virt_machine_done;
+    qemu_add_machine_init_done_notifier(&vms->machine_done);
      /* connect powerdown request */
-    lams->powerdown_notifier.notify = virt_powerdown_req;
-    qemu_register_powerdown_notifier(&lams->powerdown_notifier);
+    vms->powerdown_notifier.notify = virt_powerdown_req;
+    qemu_register_powerdown_notifier(&vms->powerdown_notifier);
 
-    fdt_add_pcie_node(lams);
+    fdt_add_pcie_node(vms);
     /*
      * Since lowmem region starts from 0 and Linux kernel legacy start address
      * at 2 MiB, FDT base address is located at 1 MiB to avoid NULL pointer
@@ -926,43 +926,43 @@ static void loongarch_init(MachineState *machine)
      * the FDT is copied again upon reset, even if addr points into RAM.
      */
     fdt_base = 1 * MiB;
-    qemu_fdt_dumpdtb(machine->fdt, lams->fdt_size);
-    rom_add_blob_fixed("fdt", machine->fdt, lams->fdt_size, fdt_base);
+    qemu_fdt_dumpdtb(machine->fdt, vms->fdt_size);
+    rom_add_blob_fixed("fdt", machine->fdt, vms->fdt_size, fdt_base);
 }
 
-bool loongarch_is_acpi_enabled(LoongArchMachineState *lams)
+bool virt_is_acpi_enabled(VirtMachineState *vms)
 {
-    if (lams->acpi == ON_OFF_AUTO_OFF) {
+    if (vms->acpi == ON_OFF_AUTO_OFF) {
         return false;
     }
     return true;
 }
 
-static void loongarch_get_acpi(Object *obj, Visitor *v, const char *name,
+static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(obj);
-    OnOffAuto acpi = lams->acpi;
+    VirtMachineState *vms = VIRT_MACHINE(obj);
+    OnOffAuto acpi = vms->acpi;
 
     visit_type_OnOffAuto(v, name, &acpi, errp);
 }
 
-static void loongarch_set_acpi(Object *obj, Visitor *v, const char *name,
+static void virt_set_acpi(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(obj);
+    VirtMachineState *vms = VIRT_MACHINE(obj);
 
-    visit_type_OnOffAuto(v, name, &lams->acpi, errp);
+    visit_type_OnOffAuto(v, name, &vms->acpi, errp);
 }
 
-static void loongarch_machine_initfn(Object *obj)
+static void virt_machine_initfn(Object *obj)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(obj);
+    VirtMachineState *vms = VIRT_MACHINE(obj);
 
-    lams->acpi = ON_OFF_AUTO_AUTO;
-    lams->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
-    lams->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
-    virt_flash_create(lams);
+    vms->acpi = ON_OFF_AUTO_AUTO;
+    vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6);
+    vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8);
+    virt_flash_create(vms);
 }
 
 static bool memhp_type_supported(DeviceState *dev)
@@ -989,10 +989,10 @@ static void virt_machine_device_pre_plug(HotplugHandler *hotplug_dev,
 static void virt_mem_unplug_request(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
+    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
 
     /* the acpi ged is always exist */
-    hotplug_handler_unplug_request(HOTPLUG_HANDLER(lams->acpi_ged), dev,
+    hotplug_handler_unplug_request(HOTPLUG_HANDLER(vms->acpi_ged), dev,
                                    errp);
 }
 
@@ -1007,10 +1007,10 @@ static void virt_machine_device_unplug_request(HotplugHandler *hotplug_dev,
 static void virt_mem_unplug(HotplugHandler *hotplug_dev,
                              DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
+    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
 
-    hotplug_handler_unplug(HOTPLUG_HANDLER(lams->acpi_ged), dev, errp);
-    pc_dimm_unplug(PC_DIMM(dev), MACHINE(lams));
+    hotplug_handler_unplug(HOTPLUG_HANDLER(vms->acpi_ged), dev, errp);
+    pc_dimm_unplug(PC_DIMM(dev), MACHINE(vms));
     qdev_unrealize(dev);
 }
 
@@ -1025,22 +1025,22 @@ static void virt_machine_device_unplug(HotplugHandler *hotplug_dev,
 static void virt_mem_plug(HotplugHandler *hotplug_dev,
                              DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
+    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
 
-    pc_dimm_plug(PC_DIMM(dev), MACHINE(lams));
-    hotplug_handler_plug(HOTPLUG_HANDLER(lams->acpi_ged),
+    pc_dimm_plug(PC_DIMM(dev), MACHINE(vms));
+    hotplug_handler_plug(HOTPLUG_HANDLER(vms->acpi_ged),
                          dev, &error_abort);
 }
 
-static void loongarch_machine_device_plug_cb(HotplugHandler *hotplug_dev,
+static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
                                         DeviceState *dev, Error **errp)
 {
-    LoongArchMachineState *lams = VIRT_MACHINE(hotplug_dev);
-    MachineClass *mc = MACHINE_GET_CLASS(lams);
+    VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
+    MachineClass *mc = MACHINE_GET_CLASS(vms);
 
     if (device_is_dynamic_sysbus(mc, dev)) {
-        if (lams->platform_bus_dev) {
-            platform_bus_link_device(PLATFORM_BUS_DEVICE(lams->platform_bus_dev),
+        if (vms->platform_bus_dev) {
+            platform_bus_link_device(PLATFORM_BUS_DEVICE(vms->platform_bus_dev),
                                      SYS_BUS_DEVICE(dev));
         }
     } else if (memhp_type_supported(dev)) {
@@ -1112,12 +1112,12 @@ static int64_t virt_get_default_cpu_node_id(const MachineState *ms, int idx)
     return nidx;
 }
 
-static void loongarch_class_init(ObjectClass *oc, void *data)
+static void virt_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
-    mc->init = loongarch_init;
+    mc->init = virt_init;
     mc->default_ram_size = 1 * GiB;
     mc->default_cpu_type = LOONGARCH_CPU_TYPE_NAME("la464");
     mc->default_ram_id = "loongarch.ram";
@@ -1135,13 +1135,13 @@ static void loongarch_class_init(ObjectClass *oc, void *data)
     mc->auto_enable_numa_with_memdev = true;
     mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
     mc->default_nic = "virtio-net-pci";
-    hc->plug = loongarch_machine_device_plug_cb;
+    hc->plug = virt_machine_device_plug_cb;
     hc->pre_plug = virt_machine_device_pre_plug;
     hc->unplug_request = virt_machine_device_unplug_request;
     hc->unplug = virt_machine_device_unplug;
 
     object_class_property_add(oc, "acpi", "OnOffAuto",
-        loongarch_get_acpi, loongarch_set_acpi,
+        virt_get_acpi, virt_set_acpi,
         NULL, NULL);
     object_class_property_set_description(oc, "acpi",
         "Enable ACPI");
@@ -1151,13 +1151,13 @@ static void loongarch_class_init(ObjectClass *oc, void *data)
 #endif
 }
 
-static const TypeInfo loongarch_machine_types[] = {
+static const TypeInfo virt_machine_types[] = {
     {
         .name           = TYPE_VIRT_MACHINE,
         .parent         = TYPE_MACHINE,
-        .instance_size  = sizeof(LoongArchMachineState),
-        .class_init     = loongarch_class_init,
-        .instance_init = loongarch_machine_initfn,
+        .instance_size  = sizeof(VirtMachineState),
+        .class_init     = virt_class_init,
+        .instance_init = virt_machine_initfn,
         .interfaces = (InterfaceInfo[]) {
          { TYPE_HOTPLUG_HANDLER },
          { }
@@ -1165,4 +1165,4 @@ static const TypeInfo loongarch_machine_types[] = {
     }
 };
 
-DEFINE_TYPES(loongarch_machine_types)
+DEFINE_TYPES(virt_machine_types)
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
index 846e83be05..a632ad1cf8 100644
--- a/include/hw/loongarch/virt.h
+++ b/include/hw/loongarch/virt.h
@@ -30,7 +30,7 @@
 #define VIRT_GED_MEM_ADDR       (VIRT_GED_EVT_ADDR + ACPI_GED_EVT_SEL_LEN)
 #define VIRT_GED_REG_ADDR       (VIRT_GED_MEM_ADDR + MEMORY_HOTPLUG_IO_LEN)
 
-struct LoongArchMachineState {
+struct VirtMachineState {
     /*< private >*/
     MachineState parent_obj;
 
@@ -56,7 +56,7 @@ struct LoongArchMachineState {
 };
 
 #define TYPE_VIRT_MACHINE  MACHINE_TYPE_NAME("virt")
-OBJECT_DECLARE_SIMPLE_TYPE(LoongArchMachineState, VIRT_MACHINE)
-bool loongarch_is_acpi_enabled(LoongArchMachineState *lams);
-void loongarch_acpi_setup(LoongArchMachineState *lams);
+OBJECT_DECLARE_SIMPLE_TYPE(VirtMachineState, VIRT_MACHINE)
+bool virt_is_acpi_enabled(VirtMachineState *vms);
+void virt_acpi_setup(VirtMachineState *vms);
 #endif
-- 
2.39.3



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

* [PATCH 3/5] hw/loongarch: Add compat machine for 9.0
  2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
  2024-02-20 12:41 ` [PATCH 1/5] hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE Bibo Mao
  2024-02-20 12:41 ` [PATCH 2/5] hw/loongarch: Rename LoongArchMachineState with VirtMachineState Bibo Mao
@ 2024-02-20 12:41 ` Bibo Mao
  2024-03-04  8:40   ` gaosong
  2024-02-20 12:41 ` [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M Bibo Mao
  2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
  4 siblings, 1 reply; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

Since migration test case requires compat machine type support,
compat machine is added for qemu 9.0 here.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/virt.c | 60 +++++++++++++++++++++++++++++++++++----------
 1 file changed, 47 insertions(+), 13 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index d0827aafab..a7d700497d 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -46,6 +46,32 @@
 #include "hw/block/flash.h"
 #include "qemu/error-report.h"
 
+#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
+    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
+                                                    void *data) \
+    { \
+        MachineClass *mc = MACHINE_CLASS(oc); \
+        virt_machine_##major##_##minor##_options(mc); \
+        mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
+        if (latest) { \
+            mc->alias = "virt"; \
+        } \
+    } \
+    static const TypeInfo machvirt_##major##_##minor##_info = { \
+        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
+        .parent = TYPE_VIRT_MACHINE, \
+        .class_init = virt_##major##_##minor##_class_init, \
+    }; \
+    static void machvirt_machine_##major##_##minor##_init(void) \
+    { \
+        type_register_static(&machvirt_##major##_##minor##_info); \
+    } \
+    type_init(machvirt_machine_##major##_##minor##_init);
+
+#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
+    DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
+#define DEFINE_VIRT_MACHINE(major, minor) \
+    DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
 
 struct loaderparams {
     uint64_t ram_size;
@@ -1151,18 +1177,26 @@ static void virt_class_init(ObjectClass *oc, void *data)
 #endif
 }
 
-static const TypeInfo virt_machine_types[] = {
-    {
-        .name           = TYPE_VIRT_MACHINE,
-        .parent         = TYPE_MACHINE,
-        .instance_size  = sizeof(VirtMachineState),
-        .class_init     = virt_class_init,
-        .instance_init = virt_machine_initfn,
-        .interfaces = (InterfaceInfo[]) {
-         { TYPE_HOTPLUG_HANDLER },
-         { }
-        },
-    }
+static const TypeInfo virt_machine_info = {
+    .name           = TYPE_VIRT_MACHINE,
+    .parent         = TYPE_MACHINE,
+    .abstract       = true,
+    .instance_size  = sizeof(VirtMachineState),
+    .class_init     = virt_class_init,
+    .instance_init = virt_machine_initfn,
+    .interfaces = (InterfaceInfo[]) {
+    { TYPE_HOTPLUG_HANDLER },
+    { }
+    },
 };
 
-DEFINE_TYPES(virt_machine_types)
+static void machvirt_machine_init(void)
+{
+    type_register_static(&virt_machine_info);
+}
+type_init(machvirt_machine_init);
+
+static void virt_machine_9_0_options(MachineClass *mc)
+{
+}
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 0)
-- 
2.39.3



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

* [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M
  2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
                   ` (2 preceding siblings ...)
  2024-02-20 12:41 ` [PATCH 3/5] hw/loongarch: Add compat machine for 9.0 Bibo Mao
@ 2024-02-20 12:41 ` Bibo Mao
  2024-02-20 16:47   ` Thomas Huth
  2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
  4 siblings, 1 reply; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

The minium memory size for LoongArch UEFI bios is 256M, also some
test cases such as migration and qos uses parameter 256M.

Here set minium memory size for Loongarch VirtMachine with 256M,
also default memory size is changed with 256M.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/virt.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index a7d700497d..5bc332f4e3 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -815,8 +815,8 @@ static void virt_init(MachineState *machine)
         cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
     }
 
-    if (ram_size < 1 * GiB) {
-        error_report("ram_size must be greater than 1G.");
+    if (ram_size < 256 * MiB) {
+        error_report("ram_size must be greater than 256M.");
         exit(1);
     }
     create_fdt(vms);
@@ -1144,7 +1144,7 @@ static void virt_class_init(ObjectClass *oc, void *data)
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
     mc->init = virt_init;
-    mc->default_ram_size = 1 * GiB;
+    mc->default_ram_size = 256 * MiB;
     mc->default_cpu_type = LOONGARCH_CPU_TYPE_NAME("la464");
     mc->default_ram_id = "loongarch.ram";
     mc->max_cpus = LOONGARCH_MAX_CPUS;
-- 
2.39.3



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

* [PATCH 5/5] tests: Add migration test for loongarch64
  2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
                   ` (3 preceding siblings ...)
  2024-02-20 12:41 ` [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M Bibo Mao
@ 2024-02-20 12:41 ` Bibo Mao
  2024-02-20 16:49   ` Thomas Huth
                     ` (2 more replies)
  4 siblings, 3 replies; 14+ messages in thread
From: Bibo Mao @ 2024-02-20 12:41 UTC (permalink / raw)
  To: Song Gao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

This patch adds migration test support for loongarch64. The test code
comes from aarch64 mostly, only that it it booted as bios in qemu since
kernel requires elf format and bios uses binary format.

In addition to providing the binary, this patch also includes the source
code and the build script in tests/migration/loongarch64. So users can
change the source and/or re-compile the binary as they wish.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 tests/migration/Makefile                 |  2 +-
 tests/migration/loongarch64/Makefile     | 18 ++++++++++
 tests/migration/loongarch64/a-b-kernel.S | 46 ++++++++++++++++++++++++
 tests/migration/loongarch64/a-b-kernel.h | 13 +++++++
 tests/migration/migration-test.h         |  3 ++
 tests/qtest/meson.build                  |  4 +++
 tests/qtest/migration-test.c             | 10 ++++++
 7 files changed, 95 insertions(+), 1 deletion(-)
 create mode 100644 tests/migration/loongarch64/Makefile
 create mode 100644 tests/migration/loongarch64/a-b-kernel.S
 create mode 100644 tests/migration/loongarch64/a-b-kernel.h

diff --git a/tests/migration/Makefile b/tests/migration/Makefile
index 13e99b1692..cfebfe23f8 100644
--- a/tests/migration/Makefile
+++ b/tests/migration/Makefile
@@ -5,7 +5,7 @@
 # See the COPYING file in the top-level directory.
 #
 
-TARGET_LIST = i386 aarch64 s390x
+TARGET_LIST = i386 aarch64 s390x loongarch64
 
 SRC_PATH = ../..
 
diff --git a/tests/migration/loongarch64/Makefile b/tests/migration/loongarch64/Makefile
new file mode 100644
index 0000000000..5d8719205f
--- /dev/null
+++ b/tests/migration/loongarch64/Makefile
@@ -0,0 +1,18 @@
+# To specify cross compiler prefix, use CROSS_PREFIX=
+#   $ make CROSS_PREFIX=loongarch64-linux-gnu-
+
+.PHONY: all clean
+all: a-b-kernel.h
+
+a-b-kernel.h: loongarch64.kernel
+	echo "$$__note" > $@
+	xxd -i $< | sed -e 's/.*int.*//' >> $@
+
+loongarch64.kernel: loongarch64.elf
+	$(CROSS_PREFIX)objcopy -j .text -O binary $< $@
+
+loongarch64.elf: a-b-kernel.S
+	$(CROSS_PREFIX)gcc -o $@ -nostdlib -Wl,--build-id=none $<
+
+clean:
+	$(RM) *.kernel *.elf
diff --git a/tests/migration/loongarch64/a-b-kernel.S b/tests/migration/loongarch64/a-b-kernel.S
new file mode 100644
index 0000000000..078f91b306
--- /dev/null
+++ b/tests/migration/loongarch64/a-b-kernel.S
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2024 Loongson Technology Corporation Limited
+ */
+#include "../migration-test.h"
+
+#define LOONGARCH_CSR_CRMD          0
+#define LOONGARCH_VIRT_UART         0x1FE001E0
+.section .text
+
+        .globl  _start
+_start:
+        /* output char 'A' to UART16550 */
+        li.d    $t0, LOONGARCH_VIRT_UART
+        li.w    $t1, 'A'
+        st.b    $t1, $t0, 0
+
+        /* traverse test memory region */
+	li.d    $t0, LOONGARCH_TEST_MEM_START
+        li.d    $t1, LOONGARCH_TEST_MEM_END
+        li.d    $t2, TEST_MEM_PAGE_SIZE
+
+clean:
+        st.b    $zero, $t0, 0
+        add.d   $t0,   $t0, $t2
+        bne     $t0,   $t1, clean
+
+mainloop:
+        li.d    $t0, LOONGARCH_TEST_MEM_START
+        li.d    $t1, LOONGARCH_TEST_MEM_END
+        li.d    $t2, TEST_MEM_PAGE_SIZE
+
+        li.d    $t4, LOONGARCH_VIRT_UART
+        li.w    $t5, 'B'
+
+innerloop:
+        ld.bu   $t3, $t0, 0
+        addi.w  $t3, $t3, 1
+        ext.w.b $t3, $t3
+        st.b    $t3, $t0, 0
+        add.d   $t0, $t0, $t2
+        bne     $t0, $t1, innerloop
+
+        st.b    $t5, $t4, 0
+        b       mainloop
+        nop
diff --git a/tests/migration/loongarch64/a-b-kernel.h b/tests/migration/loongarch64/a-b-kernel.h
new file mode 100644
index 0000000000..6019450229
--- /dev/null
+++ b/tests/migration/loongarch64/a-b-kernel.h
@@ -0,0 +1,13 @@
+
+unsigned char loongarch64_kernel[] = {
+  0x0c, 0xc0, 0x3f, 0x14, 0x8c, 0x81, 0x87, 0x03, 0x0d, 0x04, 0x81, 0x03,
+  0x8d, 0x01, 0x00, 0x29, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
+  0x2e, 0x00, 0x00, 0x14, 0x80, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
+  0x8d, 0xf9, 0xff, 0x5f, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
+  0x2e, 0x00, 0x00, 0x14, 0x10, 0xc0, 0x3f, 0x14, 0x10, 0x82, 0x87, 0x03,
+  0x11, 0x08, 0x81, 0x03, 0x8f, 0x01, 0x00, 0x2a, 0xef, 0x05, 0x80, 0x02,
+  0xef, 0x5d, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
+  0x8d, 0xed, 0xff, 0x5f, 0x11, 0x02, 0x00, 0x29, 0xff, 0xcf, 0xff, 0x53,
+  0x00, 0x00, 0x40, 0x03
+};
+
diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
index 68512c0b1b..b6e9914f9c 100644
--- a/tests/migration/migration-test.h
+++ b/tests/migration/migration-test.h
@@ -32,4 +32,7 @@
  */
 #define ARM_TEST_MAX_KERNEL_SIZE (512 * 1024)
 
+/* LoongArch64 */
+#define LOONGARCH_TEST_MEM_START (8 * 1024 * 1024)
+#define LOONGARCH_TEST_MEM_END   (100 * 1024 * 1024)
 #endif /* MIGRATION_TEST_H */
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 2b89e8634b..b634587b0a 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -249,6 +249,10 @@ qtests_s390x = \
 qtests_riscv32 = \
   (config_all_devices.has_key('CONFIG_SIFIVE_E_AON') ? ['sifive-e-aon-watchdog-test'] : [])
 
+qtests_loongarch64 = \
+  qtests_filter + \
+  ['migration-test']
+
 qos_test_ss = ss.source_set()
 qos_test_ss.add(
   'ac97-test.c',
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index 8a5bb1752e..8a25edfa77 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -132,6 +132,7 @@ static char *bootpath;
 #include "tests/migration/i386/a-b-bootblock.h"
 #include "tests/migration/aarch64/a-b-kernel.h"
 #include "tests/migration/s390x/a-b-bios.h"
+#include "tests/migration/loongarch64/a-b-kernel.h"
 
 static void bootfile_create(char *dir, bool suspend_me)
 {
@@ -158,6 +159,9 @@ static void bootfile_create(char *dir, bool suspend_me)
         content = aarch64_kernel;
         len = sizeof(aarch64_kernel);
         g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
+    } else if (strcmp(arch, "loongarch64") == 0) {
+        content = loongarch64_kernel;
+        len = sizeof(loongarch64_kernel);
     } else {
         g_assert_not_reached();
     }
@@ -823,6 +827,12 @@ static int test_migrate_start(QTestState **from, QTestState **to,
         arch_opts = g_strdup_printf("-cpu max -kernel %s", bootpath);
         start_address = ARM_TEST_MEM_START;
         end_address = ARM_TEST_MEM_END;
+    } else if (strcmp(arch, "loongarch64") == 0) {
+        memory_size = "256M";
+        machine_alias = "virt";
+        arch_opts = g_strdup_printf("-cpu max -bios %s", bootpath);
+        start_address = LOONGARCH_TEST_MEM_START;
+        end_address = LOONGARCH_TEST_MEM_END;
     } else {
         g_assert_not_reached();
     }
-- 
2.39.3



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

* Re: [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M
  2024-02-20 12:41 ` [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M Bibo Mao
@ 2024-02-20 16:47   ` Thomas Huth
  2024-02-21  1:52     ` maobibo
  0 siblings, 1 reply; 14+ messages in thread
From: Thomas Huth @ 2024-02-20 16:47 UTC (permalink / raw)
  To: Bibo Mao, Song Gao, Peter Xu, Fabiano Rosas, Laurent Vivier; +Cc: qemu-devel

On 20/02/2024 13.41, Bibo Mao wrote:
> The minium memory size for LoongArch UEFI bios is 256M, also some
> test cases such as migration and qos uses parameter 256M.
> 
> Here set minium memory size for Loongarch VirtMachine with 256M,
> also default memory size is changed with 256M.
> 
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   hw/loongarch/virt.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index a7d700497d..5bc332f4e3 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -815,8 +815,8 @@ static void virt_init(MachineState *machine)
>           cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
>       }
>   
> -    if (ram_size < 1 * GiB) {
> -        error_report("ram_size must be greater than 1G.");
> +    if (ram_size < 256 * MiB) {
> +        error_report("ram_size must be greater than 256M.");
>           exit(1);
>       }
>       create_fdt(vms);
> @@ -1144,7 +1144,7 @@ static void virt_class_init(ObjectClass *oc, void *data)
>       HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
>   
>       mc->init = virt_init;
> -    mc->default_ram_size = 1 * GiB;
> +    mc->default_ram_size = 256 * MiB;

While changing the minimum ram_size in the first hunk is certainly a good 
idea, you should maybe consider twice whether you also want to change the 
default_ram_size here. 256 MiB is often not enough to run a guest OS like 
Linux, so for most users it might be more convenient if you have a 
default_ram_size of 1GiB instead. At least that's what I've seen on other 
architectures. YMMV.

  Thomas



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

* Re: [PATCH 5/5] tests: Add migration test for loongarch64
  2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
@ 2024-02-20 16:49   ` Thomas Huth
  2024-02-21  3:01   ` Peter Xu
  2024-02-21 21:24   ` Fabiano Rosas
  2 siblings, 0 replies; 14+ messages in thread
From: Thomas Huth @ 2024-02-20 16:49 UTC (permalink / raw)
  To: Bibo Mao, Song Gao, Peter Xu, Fabiano Rosas, Laurent Vivier; +Cc: qemu-devel

On 20/02/2024 13.41, Bibo Mao wrote:
> This patch adds migration test support for loongarch64. The test code
> comes from aarch64 mostly, only that it it booted as bios in qemu since
> kernel requires elf format and bios uses binary format.
> 
> In addition to providing the binary, this patch also includes the source
> code and the build script in tests/migration/loongarch64. So users can
> change the source and/or re-compile the binary as they wish.
> 
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   tests/migration/Makefile                 |  2 +-
>   tests/migration/loongarch64/Makefile     | 18 ++++++++++
>   tests/migration/loongarch64/a-b-kernel.S | 46 ++++++++++++++++++++++++
>   tests/migration/loongarch64/a-b-kernel.h | 13 +++++++
>   tests/migration/migration-test.h         |  3 ++
>   tests/qtest/meson.build                  |  4 +++
>   tests/qtest/migration-test.c             | 10 ++++++
>   7 files changed, 95 insertions(+), 1 deletion(-)
>   create mode 100644 tests/migration/loongarch64/Makefile
>   create mode 100644 tests/migration/loongarch64/a-b-kernel.S
>   create mode 100644 tests/migration/loongarch64/a-b-kernel.h

FWIW:
Acked-by: Thomas Huth <thuth@redhat.com>



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

* Re: [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M
  2024-02-20 16:47   ` Thomas Huth
@ 2024-02-21  1:52     ` maobibo
  0 siblings, 0 replies; 14+ messages in thread
From: maobibo @ 2024-02-21  1:52 UTC (permalink / raw)
  To: Thomas Huth, Song Gao, Peter Xu, Fabiano Rosas, Laurent Vivier; +Cc: qemu-devel



On 2024/2/21 上午12:47, Thomas Huth wrote:
> On 20/02/2024 13.41, Bibo Mao wrote:
>> The minium memory size for LoongArch UEFI bios is 256M, also some
>> test cases such as migration and qos uses parameter 256M.
>>
>> Here set minium memory size for Loongarch VirtMachine with 256M,
>> also default memory size is changed with 256M.
>>
>> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
>> ---
>>   hw/loongarch/virt.c | 6 +++---
>>   1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
>> index a7d700497d..5bc332f4e3 100644
>> --- a/hw/loongarch/virt.c
>> +++ b/hw/loongarch/virt.c
>> @@ -815,8 +815,8 @@ static void virt_init(MachineState *machine)
>>           cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
>>       }
>> -    if (ram_size < 1 * GiB) {
>> -        error_report("ram_size must be greater than 1G.");
>> +    if (ram_size < 256 * MiB) {
>> +        error_report("ram_size must be greater than 256M.");
>>           exit(1);
>>       }
>>       create_fdt(vms);
>> @@ -1144,7 +1144,7 @@ static void virt_class_init(ObjectClass *oc, 
>> void *data)
>>       HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
>>       mc->init = virt_init;
>> -    mc->default_ram_size = 1 * GiB;
>> +    mc->default_ram_size = 256 * MiB;
> 
> While changing the minimum ram_size in the first hunk is certainly a 
> good idea, you should maybe consider twice whether you also want to 
> change the default_ram_size here. 256 MiB is often not enough to run a 
> guest OS like Linux, so for most users it might be more convenient if 
> you have a default_ram_size of 1GiB instead. At least that's what I've 
> seen on other architectures. YMMV.
Sounds good, I will keep default ram size unchanged, and only change 
minimum ram size with 256MiB.

And thanks for your suggestion.

Regards
Bibo Mao
> 
>   Thomas



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

* Re: [PATCH 5/5] tests: Add migration test for loongarch64
  2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
  2024-02-20 16:49   ` Thomas Huth
@ 2024-02-21  3:01   ` Peter Xu
       [not found]     ` <2c298d69-f7d2-829f-c700-e6d6e1f86080@loongson.cn>
  2024-02-21 21:24   ` Fabiano Rosas
  2 siblings, 1 reply; 14+ messages in thread
From: Peter Xu @ 2024-02-21  3:01 UTC (permalink / raw)
  To: Bibo Mao; +Cc: Song Gao, Fabiano Rosas, Thomas Huth, Laurent Vivier, qemu-devel

On Tue, Feb 20, 2024 at 08:41:26PM +0800, Bibo Mao wrote:
> @@ -823,6 +827,12 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>          arch_opts = g_strdup_printf("-cpu max -kernel %s", bootpath);
>          start_address = ARM_TEST_MEM_START;
>          end_address = ARM_TEST_MEM_END;
> +    } else if (strcmp(arch, "loongarch64") == 0) {
> +        memory_size = "256M";
> +        machine_alias = "virt";
> +        arch_opts = g_strdup_printf("-cpu max -bios %s", bootpath);
> +        start_address = LOONGARCH_TEST_MEM_START;
> +        end_address = LOONGARCH_TEST_MEM_END;
>      } else {
>          g_assert_not_reached();
>      }

Acked-by: Peter Xu <peterx@redhat.com>

One thing to mention is that Fabiano recently added a compatibility test
for old qemu binaries, in which we would prefer any tests in
migration-test.c to use stable qemu cmdline ABI (IOW, avoid using
"max"/"virt" if any of them can change its abi in newer QEMU binaries).

It's not a problem for now, but only a problem if loongarch also wants to
enable it some day.  More of a heads-up.  Feel free to see
migration-compat-x86_64 in .gitlab-ci.d/buildtest.yml for more info;
currently it's only enabled on x86_64.  Comment above
migration-compat-aarch64 explains what's missing for arm, which is similar.

Thanks,

-- 
Peter Xu



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

* Re: [PATCH 5/5] tests: Add migration test for loongarch64
       [not found]     ` <2c298d69-f7d2-829f-c700-e6d6e1f86080@loongson.cn>
@ 2024-02-21  4:14       ` Peter Xu
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Xu @ 2024-02-21  4:14 UTC (permalink / raw)
  To: maobibo; +Cc: Song Gao, Fabiano Rosas, Thomas Huth, Laurent Vivier, qemu-devel

On Wed, Feb 21, 2024 at 11:47:27AM +0800, maobibo wrote:
> Now loongarch virt machine type is not full-featured, it will be long-term
> issue to keep compatible ability access different qemu versions or kernel
> versions. It is a big challenge for us, now the main purpose of migration
> test is that it can check whether modification with kvm mmu part is correct
> or not.

That's fine then.  Feel free to pick this patch up through the loongarch64
branch when ready.  Thanks.

-- 
Peter Xu



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

* Re: [PATCH 5/5] tests: Add migration test for loongarch64
  2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
  2024-02-20 16:49   ` Thomas Huth
  2024-02-21  3:01   ` Peter Xu
@ 2024-02-21 21:24   ` Fabiano Rosas
  2024-02-22  1:57     ` maobibo
  2 siblings, 1 reply; 14+ messages in thread
From: Fabiano Rosas @ 2024-02-21 21:24 UTC (permalink / raw)
  To: Bibo Mao, Song Gao, Peter Xu, Thomas Huth, Laurent Vivier; +Cc: qemu-devel

Bibo Mao <maobibo@loongson.cn> writes:

> This patch adds migration test support for loongarch64. The test code
> comes from aarch64 mostly, only that it it booted as bios in qemu since
> kernel requires elf format and bios uses binary format.
>
> In addition to providing the binary, this patch also includes the source
> code and the build script in tests/migration/loongarch64. So users can
> change the source and/or re-compile the binary as they wish.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>

Just a nit below.

Reviewed-by: Fabiano Rosas <farosas@suse.de>

> ---
>  tests/migration/Makefile                 |  2 +-
>  tests/migration/loongarch64/Makefile     | 18 ++++++++++
>  tests/migration/loongarch64/a-b-kernel.S | 46 ++++++++++++++++++++++++
>  tests/migration/loongarch64/a-b-kernel.h | 13 +++++++
>  tests/migration/migration-test.h         |  3 ++
>  tests/qtest/meson.build                  |  4 +++
>  tests/qtest/migration-test.c             | 10 ++++++
>  7 files changed, 95 insertions(+), 1 deletion(-)
>  create mode 100644 tests/migration/loongarch64/Makefile
>  create mode 100644 tests/migration/loongarch64/a-b-kernel.S
>  create mode 100644 tests/migration/loongarch64/a-b-kernel.h
>
> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
> index 13e99b1692..cfebfe23f8 100644
> --- a/tests/migration/Makefile
> +++ b/tests/migration/Makefile
> @@ -5,7 +5,7 @@
>  # See the COPYING file in the top-level directory.
>  #
>  
> -TARGET_LIST = i386 aarch64 s390x
> +TARGET_LIST = i386 aarch64 s390x loongarch64
>  
>  SRC_PATH = ../..
>  
> diff --git a/tests/migration/loongarch64/Makefile b/tests/migration/loongarch64/Makefile
> new file mode 100644
> index 0000000000..5d8719205f
> --- /dev/null
> +++ b/tests/migration/loongarch64/Makefile
> @@ -0,0 +1,18 @@
> +# To specify cross compiler prefix, use CROSS_PREFIX=
> +#   $ make CROSS_PREFIX=loongarch64-linux-gnu-
> +
> +.PHONY: all clean
> +all: a-b-kernel.h
> +
> +a-b-kernel.h: loongarch64.kernel
> +	echo "$$__note" > $@
> +	xxd -i $< | sed -e 's/.*int.*//' >> $@
> +
> +loongarch64.kernel: loongarch64.elf
> +	$(CROSS_PREFIX)objcopy -j .text -O binary $< $@
> +
> +loongarch64.elf: a-b-kernel.S
> +	$(CROSS_PREFIX)gcc -o $@ -nostdlib -Wl,--build-id=none $<
> +
> +clean:
> +	$(RM) *.kernel *.elf
> diff --git a/tests/migration/loongarch64/a-b-kernel.S b/tests/migration/loongarch64/a-b-kernel.S
> new file mode 100644
> index 0000000000..078f91b306
> --- /dev/null
> +++ b/tests/migration/loongarch64/a-b-kernel.S
> @@ -0,0 +1,46 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (c) 2024 Loongson Technology Corporation Limited
> + */
> +#include "../migration-test.h"
> +
> +#define LOONGARCH_CSR_CRMD          0
> +#define LOONGARCH_VIRT_UART         0x1FE001E0
> +.section .text
> +
> +        .globl  _start
> +_start:
> +        /* output char 'A' to UART16550 */
> +        li.d    $t0, LOONGARCH_VIRT_UART
> +        li.w    $t1, 'A'
> +        st.b    $t1, $t0, 0
> +
> +        /* traverse test memory region */
> +	li.d    $t0, LOONGARCH_TEST_MEM_START

Stray tab here.

> +        li.d    $t1, LOONGARCH_TEST_MEM_END
> +        li.d    $t2, TEST_MEM_PAGE_SIZE
> +
> +clean:
> +        st.b    $zero, $t0, 0
> +        add.d   $t0,   $t0, $t2
> +        bne     $t0,   $t1, clean
> +
> +mainloop:
> +        li.d    $t0, LOONGARCH_TEST_MEM_START
> +        li.d    $t1, LOONGARCH_TEST_MEM_END
> +        li.d    $t2, TEST_MEM_PAGE_SIZE
> +
> +        li.d    $t4, LOONGARCH_VIRT_UART
> +        li.w    $t5, 'B'
> +
> +innerloop:
> +        ld.bu   $t3, $t0, 0
> +        addi.w  $t3, $t3, 1
> +        ext.w.b $t3, $t3
> +        st.b    $t3, $t0, 0
> +        add.d   $t0, $t0, $t2
> +        bne     $t0, $t1, innerloop
> +
> +        st.b    $t5, $t4, 0
> +        b       mainloop
> +        nop
> diff --git a/tests/migration/loongarch64/a-b-kernel.h b/tests/migration/loongarch64/a-b-kernel.h
> new file mode 100644
> index 0000000000..6019450229
> --- /dev/null
> +++ b/tests/migration/loongarch64/a-b-kernel.h
> @@ -0,0 +1,13 @@
> +
> +unsigned char loongarch64_kernel[] = {
> +  0x0c, 0xc0, 0x3f, 0x14, 0x8c, 0x81, 0x87, 0x03, 0x0d, 0x04, 0x81, 0x03,
> +  0x8d, 0x01, 0x00, 0x29, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
> +  0x2e, 0x00, 0x00, 0x14, 0x80, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
> +  0x8d, 0xf9, 0xff, 0x5f, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
> +  0x2e, 0x00, 0x00, 0x14, 0x10, 0xc0, 0x3f, 0x14, 0x10, 0x82, 0x87, 0x03,
> +  0x11, 0x08, 0x81, 0x03, 0x8f, 0x01, 0x00, 0x2a, 0xef, 0x05, 0x80, 0x02,
> +  0xef, 0x5d, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
> +  0x8d, 0xed, 0xff, 0x5f, 0x11, 0x02, 0x00, 0x29, 0xff, 0xcf, 0xff, 0x53,
> +  0x00, 0x00, 0x40, 0x03
> +};
> +
> diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
> index 68512c0b1b..b6e9914f9c 100644
> --- a/tests/migration/migration-test.h
> +++ b/tests/migration/migration-test.h
> @@ -32,4 +32,7 @@
>   */
>  #define ARM_TEST_MAX_KERNEL_SIZE (512 * 1024)
>  
> +/* LoongArch64 */
> +#define LOONGARCH_TEST_MEM_START (8 * 1024 * 1024)
> +#define LOONGARCH_TEST_MEM_END   (100 * 1024 * 1024)
>  #endif /* MIGRATION_TEST_H */
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 2b89e8634b..b634587b0a 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -249,6 +249,10 @@ qtests_s390x = \
>  qtests_riscv32 = \
>    (config_all_devices.has_key('CONFIG_SIFIVE_E_AON') ? ['sifive-e-aon-watchdog-test'] : [])
>  
> +qtests_loongarch64 = \
> +  qtests_filter + \
> +  ['migration-test']
> +
>  qos_test_ss = ss.source_set()
>  qos_test_ss.add(
>    'ac97-test.c',
> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
> index 8a5bb1752e..8a25edfa77 100644
> --- a/tests/qtest/migration-test.c
> +++ b/tests/qtest/migration-test.c
> @@ -132,6 +132,7 @@ static char *bootpath;
>  #include "tests/migration/i386/a-b-bootblock.h"
>  #include "tests/migration/aarch64/a-b-kernel.h"
>  #include "tests/migration/s390x/a-b-bios.h"
> +#include "tests/migration/loongarch64/a-b-kernel.h"
>  
>  static void bootfile_create(char *dir, bool suspend_me)
>  {
> @@ -158,6 +159,9 @@ static void bootfile_create(char *dir, bool suspend_me)
>          content = aarch64_kernel;
>          len = sizeof(aarch64_kernel);
>          g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
> +    } else if (strcmp(arch, "loongarch64") == 0) {
> +        content = loongarch64_kernel;
> +        len = sizeof(loongarch64_kernel);
>      } else {
>          g_assert_not_reached();
>      }
> @@ -823,6 +827,12 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>          arch_opts = g_strdup_printf("-cpu max -kernel %s", bootpath);
>          start_address = ARM_TEST_MEM_START;
>          end_address = ARM_TEST_MEM_END;
> +    } else if (strcmp(arch, "loongarch64") == 0) {
> +        memory_size = "256M";
> +        machine_alias = "virt";
> +        arch_opts = g_strdup_printf("-cpu max -bios %s", bootpath);
> +        start_address = LOONGARCH_TEST_MEM_START;
> +        end_address = LOONGARCH_TEST_MEM_END;
>      } else {
>          g_assert_not_reached();
>      }


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

* Re: [PATCH 5/5] tests: Add migration test for loongarch64
  2024-02-21 21:24   ` Fabiano Rosas
@ 2024-02-22  1:57     ` maobibo
  0 siblings, 0 replies; 14+ messages in thread
From: maobibo @ 2024-02-22  1:57 UTC (permalink / raw)
  To: Fabiano Rosas, Song Gao, Peter Xu, Thomas Huth, Laurent Vivier; +Cc: qemu-devel



On 2024/2/22 上午5:24, Fabiano Rosas wrote:
> Bibo Mao <maobibo@loongson.cn> writes:
> 
>> This patch adds migration test support for loongarch64. The test code
>> comes from aarch64 mostly, only that it it booted as bios in qemu since
>> kernel requires elf format and bios uses binary format.
>>
>> In addition to providing the binary, this patch also includes the source
>> code and the build script in tests/migration/loongarch64. So users can
>> change the source and/or re-compile the binary as they wish.
>>
>> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> 
> Just a nit below.
> 
> Reviewed-by: Fabiano Rosas <farosas@suse.de>
> 
>> ---
>>   tests/migration/Makefile                 |  2 +-
>>   tests/migration/loongarch64/Makefile     | 18 ++++++++++
>>   tests/migration/loongarch64/a-b-kernel.S | 46 ++++++++++++++++++++++++
>>   tests/migration/loongarch64/a-b-kernel.h | 13 +++++++
>>   tests/migration/migration-test.h         |  3 ++
>>   tests/qtest/meson.build                  |  4 +++
>>   tests/qtest/migration-test.c             | 10 ++++++
>>   7 files changed, 95 insertions(+), 1 deletion(-)
>>   create mode 100644 tests/migration/loongarch64/Makefile
>>   create mode 100644 tests/migration/loongarch64/a-b-kernel.S
>>   create mode 100644 tests/migration/loongarch64/a-b-kernel.h
>>
>> diff --git a/tests/migration/Makefile b/tests/migration/Makefile
>> index 13e99b1692..cfebfe23f8 100644
>> --- a/tests/migration/Makefile
>> +++ b/tests/migration/Makefile
>> @@ -5,7 +5,7 @@
>>   # See the COPYING file in the top-level directory.
>>   #
>>   
>> -TARGET_LIST = i386 aarch64 s390x
>> +TARGET_LIST = i386 aarch64 s390x loongarch64
>>   
>>   SRC_PATH = ../..
>>   
>> diff --git a/tests/migration/loongarch64/Makefile b/tests/migration/loongarch64/Makefile
>> new file mode 100644
>> index 0000000000..5d8719205f
>> --- /dev/null
>> +++ b/tests/migration/loongarch64/Makefile
>> @@ -0,0 +1,18 @@
>> +# To specify cross compiler prefix, use CROSS_PREFIX=
>> +#   $ make CROSS_PREFIX=loongarch64-linux-gnu-
>> +
>> +.PHONY: all clean
>> +all: a-b-kernel.h
>> +
>> +a-b-kernel.h: loongarch64.kernel
>> +	echo "$$__note" > $@
>> +	xxd -i $< | sed -e 's/.*int.*//' >> $@
>> +
>> +loongarch64.kernel: loongarch64.elf
>> +	$(CROSS_PREFIX)objcopy -j .text -O binary $< $@
>> +
>> +loongarch64.elf: a-b-kernel.S
>> +	$(CROSS_PREFIX)gcc -o $@ -nostdlib -Wl,--build-id=none $<
>> +
>> +clean:
>> +	$(RM) *.kernel *.elf
>> diff --git a/tests/migration/loongarch64/a-b-kernel.S b/tests/migration/loongarch64/a-b-kernel.S
>> new file mode 100644
>> index 0000000000..078f91b306
>> --- /dev/null
>> +++ b/tests/migration/loongarch64/a-b-kernel.S
>> @@ -0,0 +1,46 @@
>> +/* SPDX-License-Identifier: GPL-2.0-or-later */
>> +/*
>> + * Copyright (c) 2024 Loongson Technology Corporation Limited
>> + */
>> +#include "../migration-test.h"
>> +
>> +#define LOONGARCH_CSR_CRMD          0
>> +#define LOONGARCH_VIRT_UART         0x1FE001E0
>> +.section .text
>> +
>> +        .globl  _start
>> +_start:
>> +        /* output char 'A' to UART16550 */
>> +        li.d    $t0, LOONGARCH_VIRT_UART
>> +        li.w    $t1, 'A'
>> +        st.b    $t1, $t0, 0
>> +
>> +        /* traverse test memory region */
>> +	li.d    $t0, LOONGARCH_TEST_MEM_START
> 
> Stray tab here.
Good catch, there is tab here. Will fix it in next version.

Regards
Bibo Mao
> 
>> +        li.d    $t1, LOONGARCH_TEST_MEM_END
>> +        li.d    $t2, TEST_MEM_PAGE_SIZE
>> +
>> +clean:
>> +        st.b    $zero, $t0, 0
>> +        add.d   $t0,   $t0, $t2
>> +        bne     $t0,   $t1, clean
>> +
>> +mainloop:
>> +        li.d    $t0, LOONGARCH_TEST_MEM_START
>> +        li.d    $t1, LOONGARCH_TEST_MEM_END
>> +        li.d    $t2, TEST_MEM_PAGE_SIZE
>> +
>> +        li.d    $t4, LOONGARCH_VIRT_UART
>> +        li.w    $t5, 'B'
>> +
>> +innerloop:
>> +        ld.bu   $t3, $t0, 0
>> +        addi.w  $t3, $t3, 1
>> +        ext.w.b $t3, $t3
>> +        st.b    $t3, $t0, 0
>> +        add.d   $t0, $t0, $t2
>> +        bne     $t0, $t1, innerloop
>> +
>> +        st.b    $t5, $t4, 0
>> +        b       mainloop
>> +        nop
>> diff --git a/tests/migration/loongarch64/a-b-kernel.h b/tests/migration/loongarch64/a-b-kernel.h
>> new file mode 100644
>> index 0000000000..6019450229
>> --- /dev/null
>> +++ b/tests/migration/loongarch64/a-b-kernel.h
>> @@ -0,0 +1,13 @@
>> +
>> +unsigned char loongarch64_kernel[] = {
>> +  0x0c, 0xc0, 0x3f, 0x14, 0x8c, 0x81, 0x87, 0x03, 0x0d, 0x04, 0x81, 0x03,
>> +  0x8d, 0x01, 0x00, 0x29, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
>> +  0x2e, 0x00, 0x00, 0x14, 0x80, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
>> +  0x8d, 0xf9, 0xff, 0x5f, 0x0c, 0x00, 0x01, 0x14, 0x0d, 0x80, 0x0c, 0x14,
>> +  0x2e, 0x00, 0x00, 0x14, 0x10, 0xc0, 0x3f, 0x14, 0x10, 0x82, 0x87, 0x03,
>> +  0x11, 0x08, 0x81, 0x03, 0x8f, 0x01, 0x00, 0x2a, 0xef, 0x05, 0x80, 0x02,
>> +  0xef, 0x5d, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x29, 0x8c, 0xb9, 0x10, 0x00,
>> +  0x8d, 0xed, 0xff, 0x5f, 0x11, 0x02, 0x00, 0x29, 0xff, 0xcf, 0xff, 0x53,
>> +  0x00, 0x00, 0x40, 0x03
>> +};
>> +
>> diff --git a/tests/migration/migration-test.h b/tests/migration/migration-test.h
>> index 68512c0b1b..b6e9914f9c 100644
>> --- a/tests/migration/migration-test.h
>> +++ b/tests/migration/migration-test.h
>> @@ -32,4 +32,7 @@
>>    */
>>   #define ARM_TEST_MAX_KERNEL_SIZE (512 * 1024)
>>   
>> +/* LoongArch64 */
>> +#define LOONGARCH_TEST_MEM_START (8 * 1024 * 1024)
>> +#define LOONGARCH_TEST_MEM_END   (100 * 1024 * 1024)
>>   #endif /* MIGRATION_TEST_H */
>> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
>> index 2b89e8634b..b634587b0a 100644
>> --- a/tests/qtest/meson.build
>> +++ b/tests/qtest/meson.build
>> @@ -249,6 +249,10 @@ qtests_s390x = \
>>   qtests_riscv32 = \
>>     (config_all_devices.has_key('CONFIG_SIFIVE_E_AON') ? ['sifive-e-aon-watchdog-test'] : [])
>>   
>> +qtests_loongarch64 = \
>> +  qtests_filter + \
>> +  ['migration-test']
>> +
>>   qos_test_ss = ss.source_set()
>>   qos_test_ss.add(
>>     'ac97-test.c',
>> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
>> index 8a5bb1752e..8a25edfa77 100644
>> --- a/tests/qtest/migration-test.c
>> +++ b/tests/qtest/migration-test.c
>> @@ -132,6 +132,7 @@ static char *bootpath;
>>   #include "tests/migration/i386/a-b-bootblock.h"
>>   #include "tests/migration/aarch64/a-b-kernel.h"
>>   #include "tests/migration/s390x/a-b-bios.h"
>> +#include "tests/migration/loongarch64/a-b-kernel.h"
>>   
>>   static void bootfile_create(char *dir, bool suspend_me)
>>   {
>> @@ -158,6 +159,9 @@ static void bootfile_create(char *dir, bool suspend_me)
>>           content = aarch64_kernel;
>>           len = sizeof(aarch64_kernel);
>>           g_assert(sizeof(aarch64_kernel) <= ARM_TEST_MAX_KERNEL_SIZE);
>> +    } else if (strcmp(arch, "loongarch64") == 0) {
>> +        content = loongarch64_kernel;
>> +        len = sizeof(loongarch64_kernel);
>>       } else {
>>           g_assert_not_reached();
>>       }
>> @@ -823,6 +827,12 @@ static int test_migrate_start(QTestState **from, QTestState **to,
>>           arch_opts = g_strdup_printf("-cpu max -kernel %s", bootpath);
>>           start_address = ARM_TEST_MEM_START;
>>           end_address = ARM_TEST_MEM_END;
>> +    } else if (strcmp(arch, "loongarch64") == 0) {
>> +        memory_size = "256M";
>> +        machine_alias = "virt";
>> +        arch_opts = g_strdup_printf("-cpu max -bios %s", bootpath);
>> +        start_address = LOONGARCH_TEST_MEM_START;
>> +        end_address = LOONGARCH_TEST_MEM_END;
>>       } else {
>>           g_assert_not_reached();
>>       }



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

* Re: [PATCH 3/5] hw/loongarch: Add compat machine for 9.0
  2024-02-20 12:41 ` [PATCH 3/5] hw/loongarch: Add compat machine for 9.0 Bibo Mao
@ 2024-03-04  8:40   ` gaosong
  0 siblings, 0 replies; 14+ messages in thread
From: gaosong @ 2024-03-04  8:40 UTC (permalink / raw)
  To: Bibo Mao, Peter Xu, Fabiano Rosas, Thomas Huth, Laurent Vivier; +Cc: qemu-devel



在 2024/2/20 20:41, Bibo Mao 写道:
> Since migration test case requires compat machine type support,
> compat machine is added for qemu 9.0 here.
> 
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   hw/loongarch/virt.c | 60 +++++++++++++++++++++++++++++++++++----------
>   1 file changed, 47 insertions(+), 13 deletions(-)
> 
Reviewed-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index d0827aafab..a7d700497d 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -46,6 +46,32 @@
>   #include "hw/block/flash.h"
>   #include "qemu/error-report.h"
>   
> +#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
> +    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
> +                                                    void *data) \
> +    { \
> +        MachineClass *mc = MACHINE_CLASS(oc); \
> +        virt_machine_##major##_##minor##_options(mc); \
> +        mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
> +        if (latest) { \
> +            mc->alias = "virt"; \
> +        } \
> +    } \
> +    static const TypeInfo machvirt_##major##_##minor##_info = { \
> +        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
> +        .parent = TYPE_VIRT_MACHINE, \
> +        .class_init = virt_##major##_##minor##_class_init, \
> +    }; \
> +    static void machvirt_machine_##major##_##minor##_init(void) \
> +    { \
> +        type_register_static(&machvirt_##major##_##minor##_info); \
> +    } \
> +    type_init(machvirt_machine_##major##_##minor##_init);
> +
> +#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
> +    DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
> +#define DEFINE_VIRT_MACHINE(major, minor) \
> +    DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
>   
>   struct loaderparams {
>       uint64_t ram_size;
> @@ -1151,18 +1177,26 @@ static void virt_class_init(ObjectClass *oc, void *data)
>   #endif
>   }
>   
> -static const TypeInfo virt_machine_types[] = {
> -    {
> -        .name           = TYPE_VIRT_MACHINE,
> -        .parent         = TYPE_MACHINE,
> -        .instance_size  = sizeof(VirtMachineState),
> -        .class_init     = virt_class_init,
> -        .instance_init = virt_machine_initfn,
> -        .interfaces = (InterfaceInfo[]) {
> -         { TYPE_HOTPLUG_HANDLER },
> -         { }
> -        },
> -    }
> +static const TypeInfo virt_machine_info = {
> +    .name           = TYPE_VIRT_MACHINE,
> +    .parent         = TYPE_MACHINE,
> +    .abstract       = true,
> +    .instance_size  = sizeof(VirtMachineState),
> +    .class_init     = virt_class_init,
> +    .instance_init = virt_machine_initfn,
> +    .interfaces = (InterfaceInfo[]) {
> +    { TYPE_HOTPLUG_HANDLER },
> +    { }
> +    },
>   };
>   
> -DEFINE_TYPES(virt_machine_types)
> +static void machvirt_machine_init(void)
> +{
> +    type_register_static(&virt_machine_info);
> +}
> +type_init(machvirt_machine_init);
> +
> +static void virt_machine_9_0_options(MachineClass *mc)
> +{
> +}
> +DEFINE_VIRT_MACHINE_AS_LATEST(9, 0)
> 



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

end of thread, other threads:[~2024-03-04  8:42 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-20 12:41 [PATCH 0/5] Add migration test for loongarch64 Bibo Mao
2024-02-20 12:41 ` [PATCH 1/5] hw/loongarch: Rename LOONGARCH_MACHINE with VIRT_MACHINE Bibo Mao
2024-02-20 12:41 ` [PATCH 2/5] hw/loongarch: Rename LoongArchMachineState with VirtMachineState Bibo Mao
2024-02-20 12:41 ` [PATCH 3/5] hw/loongarch: Add compat machine for 9.0 Bibo Mao
2024-03-04  8:40   ` gaosong
2024-02-20 12:41 ` [PATCH 4/5] hw/loongarch: Set minimium memory size as 256M Bibo Mao
2024-02-20 16:47   ` Thomas Huth
2024-02-21  1:52     ` maobibo
2024-02-20 12:41 ` [PATCH 5/5] tests: Add migration test for loongarch64 Bibo Mao
2024-02-20 16:49   ` Thomas Huth
2024-02-21  3:01   ` Peter Xu
     [not found]     ` <2c298d69-f7d2-829f-c700-e6d6e1f86080@loongson.cn>
2024-02-21  4:14       ` Peter Xu
2024-02-21 21:24   ` Fabiano Rosas
2024-02-22  1:57     ` maobibo

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).