qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PULL 00/10] loongarch-to-apply queue
@ 2024-05-23  1:46 Song Gao
  2024-05-23  1:46 ` [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures Song Gao
                   ` (10 more replies)
  0 siblings, 11 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson

The following changes since commit 6af8037c42fdc3d20d5aa2686799ab356a9ee1a9:

  Merge tag 'pull-vfio-20240522' of https://github.com/legoater/qemu into staging (2024-05-22 06:02:06 -0700)

are available in the Git repository at:

  https://gitlab.com/gaosong/qemu.git tags/pull-loongarch-20240523

for you to fetch changes up to 6204af704a071ea68d3af55c0502b112a7af9546:

  hw/loongarch/virt: Fix FDT memory node address width (2024-05-23 09:30:41 +0800)

----------------------------------------------------------------
pull-loongarch-20240523

----------------------------------------------------------------
Bibo Mao (7):
      hw/loongarch: Add VM mode in IOCSR feature register in kvm mode
      hw/loongarch: Refine acpi srat table for numa memory
      hw/loongarch: Refine fadt memory table for numa memory
      hw/loongarch: Refine fwcfg memory map
      hw/loongarch: Refine system dram memory region
      hw/loongarch: Remove minimum and default memory size
      target/loongarch: Add loongarch vector property unconditionally

Jiaxun Yang (1):
      hw/loongarch/virt: Fix FDT memory node address width

Song Gao (2):
      target/loongarch/kvm: Fix VM recovery from disk failures
      target/loongarch/kvm: fpu save the vreg registers high 192bit

 hw/loongarch/acpi-build.c  |  58 +++++++++------
 hw/loongarch/virt.c        | 179 ++++++++++++++++++++++++++++++++-------------
 target/loongarch/cpu.c     |  14 +---
 target/loongarch/kvm/kvm.c |   6 ++
 target/loongarch/machine.c |   6 +-
 5 files changed, 176 insertions(+), 87 deletions(-)



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

* [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-24 10:00   ` Michael Tokarev
  2024-05-23  1:46 ` [PULL 02/10] target/loongarch/kvm: fpu save the vreg registers high 192bit Song Gao
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, qemu-stable, Peter Xu

vmstate does not save kvm_state_conter,
which can cause VM recovery from disk to fail.

Cc: qemu-stable@nongnu.org
Signed-off-by: Song Gao <gaosong@loongson.cn>
Acked-by: Peter Xu <peterx@redhat.com>
Message-Id: <20240508024732.3127792-1-gaosong@loongson.cn>
---
 target/loongarch/machine.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
index 9cd9e848d6..08a7fa5370 100644
--- a/target/loongarch/machine.c
+++ b/target/loongarch/machine.c
@@ -145,8 +145,8 @@ static const VMStateDescription vmstate_tlb = {
 /* LoongArch CPU state */
 const VMStateDescription vmstate_loongarch_cpu = {
     .name = "cpu",
-    .version_id = 1,
-    .minimum_version_id = 1,
+    .version_id = 2,
+    .minimum_version_id = 2,
     .fields = (const VMStateField[]) {
         VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
         VMSTATE_UINTTL(env.pc, LoongArchCPU),
@@ -208,6 +208,8 @@ const VMStateDescription vmstate_loongarch_cpu = {
         VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
         VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
 
+        VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
+
         VMSTATE_END_OF_LIST()
     },
     .subsections = (const VMStateDescription * const []) {
-- 
2.34.1



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

* [PULL 02/10] target/loongarch/kvm: fpu save the vreg registers high 192bit
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
  2024-05-23  1:46 ` [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 03/10] hw/loongarch: Add VM mode in IOCSR feature register in kvm mode Song Gao
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, qemu-stable, Bibo Mao

On kvm side, get_fpu/set_fpu save the vreg registers high 192bits,
but QEMU missing.

Cc: qemu-stable@nongnu.org
Signed-off-by: Song Gao <gaosong@loongson.cn>
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
Message-Id: <20240514110752.989572-1-gaosong@loongson.cn>
---
 target/loongarch/kvm/kvm.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index bc75552d0f..8e6e27c8bf 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -436,6 +436,9 @@ static int kvm_loongarch_get_regs_fp(CPUState *cs)
     env->fcsr0 = fpu.fcsr;
     for (i = 0; i < 32; i++) {
         env->fpr[i].vreg.UD[0] = fpu.fpr[i].val64[0];
+        env->fpr[i].vreg.UD[1] = fpu.fpr[i].val64[1];
+        env->fpr[i].vreg.UD[2] = fpu.fpr[i].val64[2];
+        env->fpr[i].vreg.UD[3] = fpu.fpr[i].val64[3];
     }
     for (i = 0; i < 8; i++) {
         env->cf[i] = fpu.fcc & 0xFF;
@@ -455,6 +458,9 @@ static int kvm_loongarch_put_regs_fp(CPUState *cs)
     fpu.fcc = 0;
     for (i = 0; i < 32; i++) {
         fpu.fpr[i].val64[0] = env->fpr[i].vreg.UD[0];
+        fpu.fpr[i].val64[1] = env->fpr[i].vreg.UD[1];
+        fpu.fpr[i].val64[2] = env->fpr[i].vreg.UD[2];
+        fpu.fpr[i].val64[3] = env->fpr[i].vreg.UD[3];
     }
 
     for (i = 0; i < 8; i++) {
-- 
2.34.1



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

* [PULL 03/10] hw/loongarch: Add VM mode in IOCSR feature register in kvm mode
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
  2024-05-23  1:46 ` [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures Song Gao
  2024-05-23  1:46 ` [PULL 02/10] target/loongarch/kvm: fpu save the vreg registers high 192bit Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 04/10] hw/loongarch: Refine acpi srat table for numa memory Song Gao
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

If VM runs in kvm mode, VM mode is added in IOCSR feature register.
So guest can detect kvm hypervisor type and enable possible pv functions.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240514025109.3238398-1-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index f0640d2d80..95f9ed5cae 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -10,6 +10,7 @@
 #include "qapi/error.h"
 #include "hw/boards.h"
 #include "hw/char/serial.h"
+#include "sysemu/kvm.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/qtest.h"
 #include "sysemu/runstate.h"
@@ -840,18 +841,23 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
 
 static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
 {
+    uint64_t ret;
+
     switch (addr) {
     case VERSION_REG:
         return 0x11ULL;
     case FEATURE_REG:
-        return 1ULL << IOCSRF_MSI | 1ULL << IOCSRF_EXTIOI |
-               1ULL << IOCSRF_CSRIPI;
+        ret = BIT(IOCSRF_MSI) | BIT(IOCSRF_EXTIOI) | BIT(IOCSRF_CSRIPI);
+        if (kvm_enabled()) {
+            ret |= BIT(IOCSRF_VM);
+        }
+        return ret;
     case VENDOR_REG:
         return 0x6e6f73676e6f6f4cULL; /* "Loongson" */
     case CPUNAME_REG:
         return 0x303030354133ULL;     /* "3A5000" */
     case MISC_FUNC_REG:
-        return 1ULL << IOCSRM_EXTIOI_EN;
+        return BIT_ULL(IOCSRM_EXTIOI_EN);
     }
     return 0ULL;
 }
-- 
2.34.1



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

* [PULL 04/10] hw/loongarch: Refine acpi srat table for numa memory
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (2 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 03/10] hw/loongarch: Add VM mode in IOCSR feature register in kvm mode Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 05/10] hw/loongarch: Refine fadt memory " Song Gao
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

One LoongArch virt machine platform, there is limitation for memory
map information. The minimum memory size is 256M and minimum memory
size for numa node0 is 256M also. With qemu numa qtest, it is possible
that memory size of numa node0 is 128M.

Limitations for minimum memory size for both total memory and numa
node0 is removed for acpi srat table creation.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240515093927.3453674-2-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/acpi-build.c | 58 +++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 24 deletions(-)

diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c
index 5ef010d4da..af45ce526d 100644
--- a/hw/loongarch/acpi-build.c
+++ b/hw/loongarch/acpi-build.c
@@ -166,8 +166,9 @@ static void
 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;
+    hwaddr len, base, gap;
+    NodeInfo *numa_info;
+    int nodes, nb_numa_nodes = machine->numa_state->num_nodes;
     LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(machine);
     MachineClass *mc = MACHINE_GET_CLASS(lvms);
     const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
@@ -196,35 +197,44 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
         build_append_int_noprefix(table_data, 0, 4); /* Reserved */
     }
 
-    /* Node0 */
-    build_srat_memory(table_data, VIRT_LOWMEM_BASE, VIRT_LOWMEM_SIZE,
-                      0, MEM_AFFINITY_ENABLED);
-    mem_base = VIRT_HIGHMEM_BASE;
-    if (!nb_numa_nodes) {
-        mem_len = machine->ram_size - VIRT_LOWMEM_SIZE;
-    } else {
-        mem_len = machine->numa_state->nodes[0].node_mem - VIRT_LOWMEM_SIZE;
+    base = VIRT_LOWMEM_BASE;
+    gap = VIRT_LOWMEM_SIZE;
+    numa_info = machine->numa_state->nodes;
+    nodes = nb_numa_nodes;
+    if (!nodes) {
+        nodes = 1;
     }
-    if (mem_len)
-        build_srat_memory(table_data, mem_base, mem_len, 0, MEM_AFFINITY_ENABLED);
-
-    /* Node1 - Nodemax */
-    if (nb_numa_nodes) {
-        mem_base += mem_len;
-        for (i = 1; i < nb_numa_nodes; ++i) {
-            if (machine->numa_state->nodes[i].node_mem > 0) {
-                build_srat_memory(table_data, mem_base,
-                                  machine->numa_state->nodes[i].node_mem, i,
-                                  MEM_AFFINITY_ENABLED);
-                mem_base += machine->numa_state->nodes[i].node_mem;
-            }
+
+    for (i = 0; i < nodes; i++) {
+        if (nb_numa_nodes) {
+            len = numa_info[i].node_mem;
+        } else {
+            len = machine->ram_size;
+        }
+
+        /*
+         * memory for the node splited into two part
+         *   lowram:  [base, +gap)
+         *   highram: [VIRT_HIGHMEM_BASE, +(len - gap))
+         */
+        if (len >= gap) {
+            build_srat_memory(table_data, base, len, i, MEM_AFFINITY_ENABLED);
+            len -= gap;
+            base = VIRT_HIGHMEM_BASE;
+            gap = machine->ram_size - VIRT_LOWMEM_SIZE;
+        }
+
+        if (len) {
+            build_srat_memory(table_data, base, len, i, MEM_AFFINITY_ENABLED);
+            base += len;
+            gap  -= len;
         }
     }
 
     if (machine->device_memory) {
         build_srat_memory(table_data, machine->device_memory->base,
                           memory_region_size(&machine->device_memory->mr),
-                          nb_numa_nodes - 1,
+                          nodes - 1,
                           MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
     }
 
-- 
2.34.1



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

* [PULL 05/10] hw/loongarch: Refine fadt memory table for numa memory
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (3 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 04/10] hw/loongarch: Refine acpi srat table for numa memory Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 06/10] hw/loongarch: Refine fwcfg memory map Song Gao
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

One LoongArch virt machine platform, there is limitation for memory
map information. The minimum memory size is 256M and minimum memory
size for numa node0 is 256M also. With qemu numa qtest, it is possible
that memory size of numa node0 is 128M.

Limitations for minimum memory size for both total memory and numa
node0 is removed for fadt numa memory table creation.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240515093927.3453674-3-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 46 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 95f9ed5cae..850729202f 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -474,6 +474,48 @@ static void fdt_add_memory_node(MachineState *ms,
     g_free(nodename);
 }
 
+static void fdt_add_memory_nodes(MachineState *ms)
+{
+    hwaddr base, size, ram_size, gap;
+    int i, nb_numa_nodes, nodes;
+    NodeInfo *numa_info;
+
+    ram_size = ms->ram_size;
+    base = VIRT_LOWMEM_BASE;
+    gap = VIRT_LOWMEM_SIZE;
+    nodes = nb_numa_nodes = ms->numa_state->num_nodes;
+    numa_info = ms->numa_state->nodes;
+    if (!nodes) {
+        nodes = 1;
+    }
+
+    for (i = 0; i < nodes; i++) {
+        if (nb_numa_nodes) {
+            size = numa_info[i].node_mem;
+        } else {
+            size = ram_size;
+        }
+
+        /*
+         * memory for the node splited into two part
+         *   lowram:  [base, +gap)
+         *   highram: [VIRT_HIGHMEM_BASE, +(len - gap))
+         */
+        if (size >= gap) {
+            fdt_add_memory_node(ms, base, gap, i);
+            size -= gap;
+            base = VIRT_HIGHMEM_BASE;
+            gap = ram_size - VIRT_LOWMEM_SIZE;
+        }
+
+        if (size) {
+            fdt_add_memory_node(ms, base, size, i);
+            base += size;
+            gap -= size;
+        }
+    }
+}
+
 static void virt_build_smbios(LoongArchVirtMachineState *lvms)
 {
     MachineState *ms = MACHINE(lvms);
@@ -921,10 +963,10 @@ static void virt_init(MachineState *machine)
         lacpu->phy_id = machine->possible_cpus->cpus[i].arch_id;
     }
     fdt_add_cpu_nodes(lvms);
+    fdt_add_memory_nodes(machine);
 
     /* 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(&lvms->lowmem, NULL, "loongarch.node0.lowram",
                              machine->ram, offset, VIRT_LOWMEM_SIZE);
     memory_region_add_subregion(address_space_mem, phyAddr, &lvms->lowmem);
@@ -938,7 +980,6 @@ static void virt_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(&lvms->highmem, NULL, "loongarch.node0.highram",
                               machine->ram, offset, highram_size);
     memory_region_add_subregion(address_space_mem, phyAddr, &lvms->highmem);
@@ -954,7 +995,6 @@ static void virt_init(MachineState *machine)
                                  offset,  numa_info[i].node_mem);
         memory_region_add_subregion(address_space_mem, phyAddr, nodemem);
         memmap_add_entry(phyAddr, numa_info[i].node_mem, 1);
-        fdt_add_memory_node(machine, phyAddr, numa_info[i].node_mem, i);
         offset += numa_info[i].node_mem;
         phyAddr += numa_info[i].node_mem;
     }
-- 
2.34.1



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

* [PULL 06/10] hw/loongarch: Refine fwcfg memory map
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (4 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 05/10] hw/loongarch: Refine fadt memory " Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-06-07 14:31   ` Peter Maydell
  2024-05-23  1:46 ` [PULL 07/10] hw/loongarch: Refine system dram memory region Song Gao
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

Memory map table for fwcfg is used for UEFI BIOS, UEFI BIOS uses the first
entry from fwcfg memory map as the first memory HOB, the second memory HOB
will be used if the first memory HOB is used up.

Memory map table for fwcfg does not care about numa node, however in
generic the first memory HOB is part of numa node0, so that runtime
memory of UEFI which is allocated from the first memory HOB is located
at numa node0.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240515093927.3453674-4-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 60 ++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 57 insertions(+), 3 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 850729202f..449050cba5 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -918,6 +918,62 @@ static const MemoryRegionOps virt_iocsr_misc_ops = {
     },
 };
 
+static void fw_cfg_add_memory(MachineState *ms)
+{
+    hwaddr base, size, ram_size, gap;
+    int nb_numa_nodes, nodes;
+    NodeInfo *numa_info;
+
+    ram_size = ms->ram_size;
+    base = VIRT_LOWMEM_BASE;
+    gap = VIRT_LOWMEM_SIZE;
+    nodes = nb_numa_nodes = ms->numa_state->num_nodes;
+    numa_info = ms->numa_state->nodes;
+    if (!nodes) {
+        nodes = 1;
+    }
+
+    /* add fw_cfg memory map of node0 */
+    if (nb_numa_nodes) {
+        size = numa_info[0].node_mem;
+    } else {
+        size = ram_size;
+    }
+
+    if (size >= gap) {
+        memmap_add_entry(base, gap, 1);
+        size -= gap;
+        base = VIRT_HIGHMEM_BASE;
+        gap = ram_size - VIRT_LOWMEM_SIZE;
+    }
+
+    if (size) {
+        memmap_add_entry(base, size, 1);
+        base += size;
+    }
+
+    if (nodes < 2) {
+        return;
+    }
+
+    /* add fw_cfg memory map of other nodes */
+    size = ram_size - numa_info[0].node_mem;
+    gap  = VIRT_LOWMEM_BASE + VIRT_LOWMEM_SIZE;
+    if (base < gap && (base + size) > gap) {
+        /*
+         * memory map for the maining nodes splited into two part
+         *   lowram:  [base, +(gap - base))
+         *   highram: [VIRT_HIGHMEM_BASE, +(size - (gap - base)))
+         */
+        memmap_add_entry(base, gap - base, 1);
+        size -= gap - base;
+        base = VIRT_HIGHMEM_BASE;
+    }
+
+   if (size)
+        memmap_add_entry(base, size, 1);
+}
+
 static void virt_init(MachineState *machine)
 {
     LoongArchCPU *lacpu;
@@ -964,9 +1020,9 @@ static void virt_init(MachineState *machine)
     }
     fdt_add_cpu_nodes(lvms);
     fdt_add_memory_nodes(machine);
+    fw_cfg_add_memory(machine);
 
     /* Node0 memory */
-    memmap_add_entry(VIRT_LOWMEM_BASE, VIRT_LOWMEM_SIZE, 1);
     memory_region_init_alias(&lvms->lowmem, NULL, "loongarch.node0.lowram",
                              machine->ram, offset, VIRT_LOWMEM_SIZE);
     memory_region_add_subregion(address_space_mem, phyAddr, &lvms->lowmem);
@@ -979,7 +1035,6 @@ static void virt_init(MachineState *machine)
         highram_size = ram_size - VIRT_LOWMEM_SIZE;
     }
     phyAddr = VIRT_HIGHMEM_BASE;
-    memmap_add_entry(phyAddr, highram_size, 1);
     memory_region_init_alias(&lvms->highmem, NULL, "loongarch.node0.highram",
                               machine->ram, offset, highram_size);
     memory_region_add_subregion(address_space_mem, phyAddr, &lvms->highmem);
@@ -994,7 +1049,6 @@ static void virt_init(MachineState *machine)
         memory_region_init_alias(nodemem, NULL, ramName, machine->ram,
                                  offset,  numa_info[i].node_mem);
         memory_region_add_subregion(address_space_mem, phyAddr, nodemem);
-        memmap_add_entry(phyAddr, numa_info[i].node_mem, 1);
         offset += numa_info[i].node_mem;
         phyAddr += numa_info[i].node_mem;
     }
-- 
2.34.1



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

* [PULL 07/10] hw/loongarch: Refine system dram memory region
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (5 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 06/10] hw/loongarch: Refine fwcfg memory map Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 08/10] hw/loongarch: Remove minimum and default memory size Song Gao
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

For system dram memory region, it is not necessary to use numa node
information. There is only low memory region and high memory region.

Remove numa node information for ddr memory region here, it can reduce
memory region number on LoongArch virt machine.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240515093927.3453674-5-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 53 +++++++++++++++------------------------------
 1 file changed, 17 insertions(+), 36 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 449050cba5..4ec2b9a061 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -978,14 +978,10 @@ static void virt_init(MachineState *machine)
 {
     LoongArchCPU *lacpu;
     const char *cpu_model = machine->cpu_type;
-    ram_addr_t offset = 0;
-    ram_addr_t ram_size = machine->ram_size;
-    uint64_t highram_size = 0, phyAddr = 0;
     MemoryRegion *address_space_mem = get_system_memory();
     LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(machine);
-    int nb_numa_nodes = machine->numa_state->num_nodes;
-    NodeInfo *numa_info = machine->numa_state->nodes;
     int i;
+    hwaddr base, size, ram_size = machine->ram_size;
     const CPUArchIdList *possible_cpus;
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     CPUState *cpu;
@@ -1023,40 +1019,27 @@ static void virt_init(MachineState *machine)
     fw_cfg_add_memory(machine);
 
     /* Node0 memory */
-    memory_region_init_alias(&lvms->lowmem, NULL, "loongarch.node0.lowram",
-                             machine->ram, offset, VIRT_LOWMEM_SIZE);
-    memory_region_add_subregion(address_space_mem, phyAddr, &lvms->lowmem);
-
-    offset += VIRT_LOWMEM_SIZE;
-    if (nb_numa_nodes > 0) {
-        assert(numa_info[0].node_mem > VIRT_LOWMEM_SIZE);
-        highram_size = numa_info[0].node_mem - VIRT_LOWMEM_SIZE;
-    } else {
-        highram_size = ram_size - VIRT_LOWMEM_SIZE;
+    size = ram_size;
+    base = VIRT_LOWMEM_BASE;
+    if (size > VIRT_LOWMEM_SIZE) {
+        size = VIRT_LOWMEM_SIZE;
     }
-    phyAddr = VIRT_HIGHMEM_BASE;
-    memory_region_init_alias(&lvms->highmem, NULL, "loongarch.node0.highram",
-                              machine->ram, offset, highram_size);
-    memory_region_add_subregion(address_space_mem, phyAddr, &lvms->highmem);
-
-    /* Node1 - Nodemax memory */
-    offset += highram_size;
-    phyAddr += highram_size;
-
-    for (i = 1; i < nb_numa_nodes; i++) {
-        MemoryRegion *nodemem = g_new(MemoryRegion, 1);
-        g_autofree char *ramName = g_strdup_printf("loongarch.node%d.ram", i);
-        memory_region_init_alias(nodemem, NULL, ramName, machine->ram,
-                                 offset,  numa_info[i].node_mem);
-        memory_region_add_subregion(address_space_mem, phyAddr, nodemem);
-        offset += numa_info[i].node_mem;
-        phyAddr += numa_info[i].node_mem;
+
+    memory_region_init_alias(&lvms->lowmem, NULL, "loongarch.lowram",
+                              machine->ram, base, size);
+    memory_region_add_subregion(address_space_mem, base, &lvms->lowmem);
+    base += size;
+    if (ram_size - size) {
+        base = VIRT_HIGHMEM_BASE;
+        memory_region_init_alias(&lvms->highmem, NULL, "loongarch.highram",
+                machine->ram, VIRT_LOWMEM_BASE + size, ram_size - size);
+        memory_region_add_subregion(address_space_mem, base, &lvms->highmem);
+        base += ram_size - size;
     }
 
     /* initialize device memory address space */
     if (machine->ram_size < machine->maxram_size) {
         ram_addr_t device_mem_size = machine->maxram_size - machine->ram_size;
-        hwaddr device_mem_base;
 
         if (machine->ram_slots > ACPI_MAX_RAM_SLOTS) {
             error_report("unsupported amount of memory slots: %"PRIu64,
@@ -1070,9 +1053,7 @@ static void virt_init(MachineState *machine)
                          "%d bytes", TARGET_PAGE_SIZE);
             exit(EXIT_FAILURE);
         }
-        /* device memory base is the top of high memory address. */
-        device_mem_base = ROUND_UP(VIRT_HIGHMEM_BASE + highram_size, 1 * GiB);
-        machine_memory_devices_init(machine, device_mem_base, device_mem_size);
+        machine_memory_devices_init(machine, base, device_mem_size);
     }
 
     /* load the BIOS image. */
-- 
2.34.1



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

* [PULL 08/10] hw/loongarch: Remove minimum and default memory size
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (6 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 07/10] hw/loongarch: Refine system dram memory region Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 09/10] target/loongarch: Add loongarch vector property unconditionally Song Gao
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

Some qtest test cases such as numa use default memory size of generic
machine class, which is 128M by fault.

Here generic default memory size is used, and also remove minimum memory
size which is 1G originally.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240515093927.3453674-6-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 4ec2b9a061..e3bdf085b5 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -990,10 +990,6 @@ 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.");
-        exit(1);
-    }
     create_fdt(lvms);
 
     /* Create IOCSR space */
@@ -1279,7 +1275,6 @@ 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_cpu_type = LOONGARCH_CPU_TYPE_NAME("la464");
     mc->default_ram_id = "loongarch.ram";
     mc->max_cpus = LOONGARCH_MAX_CPUS;
-- 
2.34.1



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

* [PULL 09/10] target/loongarch: Add loongarch vector property unconditionally
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (7 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 08/10] hw/loongarch: Remove minimum and default memory size Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-23  1:46 ` [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width Song Gao
  2024-05-23 16:44 ` [PULL 00/10] loongarch-to-apply queue Richard Henderson
  10 siblings, 0 replies; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Bibo Mao

From: Bibo Mao <maobibo@loongson.cn>

Currently LSX/LASX vector property is decided by the default value.
Instead vector property should be added unconditionally, and it is
irrelative with its default value. If vector is disabled by default,
vector also can be enabled from command line.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240521080549.434197-2-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 target/loongarch/cpu.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index a0cad53676..b5c1ec94af 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -645,16 +645,10 @@ static void loongarch_set_lasx(Object *obj, bool value, Error **errp)
 
 void loongarch_cpu_post_init(Object *obj)
 {
-    LoongArchCPU *cpu = LOONGARCH_CPU(obj);
-
-    if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) {
-        object_property_add_bool(obj, "lsx", loongarch_get_lsx,
-                                 loongarch_set_lsx);
-    }
-    if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LASX)) {
-        object_property_add_bool(obj, "lasx", loongarch_get_lasx,
-                                 loongarch_set_lasx);
-    }
+    object_property_add_bool(obj, "lsx", loongarch_get_lsx,
+                             loongarch_set_lsx);
+    object_property_add_bool(obj, "lasx", loongarch_get_lasx,
+                             loongarch_set_lasx);
 }
 
 static void loongarch_cpu_init(Object *obj)
-- 
2.34.1



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

* [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (8 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 09/10] target/loongarch: Add loongarch vector property unconditionally Song Gao
@ 2024-05-23  1:46 ` Song Gao
  2024-05-24 10:10   ` Michael Tokarev
  2024-05-23 16:44 ` [PULL 00/10] loongarch-to-apply queue Richard Henderson
  10 siblings, 1 reply; 18+ messages in thread
From: Song Gao @ 2024-05-23  1:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: richard.henderson, Jiaxun Yang, qemu-stable

From: Jiaxun Yang <jiaxun.yang@flygoat.com>

Higher bits for memory nodes were omitted at qemu_fdt_setprop_cells.

Cc: qemu-stable@nongnu.org
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20240520-loongarch-fdt-memnode-v1-1-5ea9be93911e@flygoat.com>
Signed-off-by: Song Gao <gaosong@loongson.cn>
---
 hw/loongarch/virt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index e3bdf085b5..3e6e93edf3 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -464,7 +464,8 @@ static void fdt_add_memory_node(MachineState *ms,
     char *nodename = g_strdup_printf("/memory@%" PRIx64, base);
 
     qemu_fdt_add_subnode(ms->fdt, nodename);
-    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, base, 0, size);
+    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", base >> 32, base,
+                           size >> 32, size);
     qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
 
     if (ms->numa_state && ms->numa_state->num_nodes) {
-- 
2.34.1



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

* Re: [PULL 00/10] loongarch-to-apply queue
  2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
                   ` (9 preceding siblings ...)
  2024-05-23  1:46 ` [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width Song Gao
@ 2024-05-23 16:44 ` Richard Henderson
  10 siblings, 0 replies; 18+ messages in thread
From: Richard Henderson @ 2024-05-23 16:44 UTC (permalink / raw)
  To: Song Gao, qemu-devel

On 5/22/24 18:46, Song Gao wrote:
> The following changes since commit 6af8037c42fdc3d20d5aa2686799ab356a9ee1a9:
> 
>    Merge tag 'pull-vfio-20240522' ofhttps://github.com/legoater/qemu  into staging (2024-05-22 06:02:06 -0700)
> 
> are available in the Git repository at:
> 
>    https://gitlab.com/gaosong/qemu.git  tags/pull-loongarch-20240523
> 
> for you to fetch changes up to 6204af704a071ea68d3af55c0502b112a7af9546:
> 
>    hw/loongarch/virt: Fix FDT memory node address width (2024-05-23 09:30:41 +0800)
> 
> ----------------------------------------------------------------
> pull-loongarch-20240523

Applied, thanks.  Please update https://wiki.qemu.org/ChangeLog/9.1 as appropriate.


r~



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

* Re: [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures
  2024-05-23  1:46 ` [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures Song Gao
@ 2024-05-24 10:00   ` Michael Tokarev
  2024-05-27  1:54     ` gaosong
  0 siblings, 1 reply; 18+ messages in thread
From: Michael Tokarev @ 2024-05-24 10:00 UTC (permalink / raw)
  To: Song Gao, qemu-devel; +Cc: richard.henderson, qemu-stable, Peter Xu

23.05.2024 04:46, Song Gao wrote:
> vmstate does not save kvm_state_conter,
> which can cause VM recovery from disk to fail.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Song Gao <gaosong@loongson.cn>
> Acked-by: Peter Xu <peterx@redhat.com>
> Message-Id: <20240508024732.3127792-1-gaosong@loongson.cn>
> ---
>   target/loongarch/machine.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
> index 9cd9e848d6..08a7fa5370 100644
> --- a/target/loongarch/machine.c
> +++ b/target/loongarch/machine.c
> @@ -145,8 +145,8 @@ static const VMStateDescription vmstate_tlb = {
>   /* LoongArch CPU state */
>   const VMStateDescription vmstate_loongarch_cpu = {
>       .name = "cpu",
> -    .version_id = 1,
> -    .minimum_version_id = 1,
> +    .version_id = 2,
> +    .minimum_version_id = 2,
>       .fields = (const VMStateField[]) {
>           VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
>           VMSTATE_UINTTL(env.pc, LoongArchCPU),
> @@ -208,6 +208,8 @@ const VMStateDescription vmstate_loongarch_cpu = {
>           VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
>           VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
>   
> +        VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
> +
>           VMSTATE_END_OF_LIST()
>       },
>       .subsections = (const VMStateDescription * const []) {

Should this really be part of any stable releases?
Wouldn't it break migration between, say, 8.2 with this change
and without?

Thanks,

/mjt
-- 
GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24.
New key: rsa4096/61AD3D98ECDF2C8E  9D8B E14E 3F2A 9DD7 9199  28F1 61AD 3D98 ECDF 2C8E
Old key: rsa2048/457CE0A0804465C5  6EE1 95D1 886E 8FFB 810D  4324 457C E0A0 8044 65C5
Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt



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

* Re: [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width
  2024-05-23  1:46 ` [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width Song Gao
@ 2024-05-24 10:10   ` Michael Tokarev
  2024-05-24 10:54     ` Jiaxun Yang
  0 siblings, 1 reply; 18+ messages in thread
From: Michael Tokarev @ 2024-05-24 10:10 UTC (permalink / raw)
  To: Song Gao, qemu-devel; +Cc: richard.henderson, Jiaxun Yang, qemu-stable

23.05.2024 04:46, Song Gao wrote:
> From: Jiaxun Yang <jiaxun.yang@flygoat.com>
> 
> Higher bits for memory nodes were omitted at qemu_fdt_setprop_cells.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> Reviewed-by: Song Gao <gaosong@loongson.cn>
> Message-Id: <20240520-loongarch-fdt-memnode-v1-1-5ea9be93911e@flygoat.com>
> Signed-off-by: Song Gao <gaosong@loongson.cn>
> ---
>   hw/loongarch/virt.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index e3bdf085b5..3e6e93edf3 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -464,7 +464,8 @@ static void fdt_add_memory_node(MachineState *ms,
>       char *nodename = g_strdup_printf("/memory@%" PRIx64, base);
>   
>       qemu_fdt_add_subnode(ms->fdt, nodename);
> -    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, base, 0, size);
> +    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", base >> 32, base,
> +                           size >> 32, size);
>       qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
>   
>       if (ms->numa_state && ms->numa_state->num_nodes) {

This commit changes exactly the same place as the previous commit,
v9.0.0-274-gb11f981452, "hw/loongarch: Fix fdt memory node wrong 'reg'".

Was it the wrong fix?

Note the previous commit isn't in any released version of qemu.  So
when picking up for any stable release, both needs to be picked up :)

Thanks,

/mjt
-- 
GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24.
New key: rsa4096/61AD3D98ECDF2C8E  9D8B E14E 3F2A 9DD7 9199  28F1 61AD 3D98 ECDF 2C8E
Old key: rsa2048/457CE0A0804465C5  6EE1 95D1 886E 8FFB 810D  4324 457C E0A0 8044 65C5
Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt



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

* Re: [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width
  2024-05-24 10:10   ` Michael Tokarev
@ 2024-05-24 10:54     ` Jiaxun Yang
  0 siblings, 0 replies; 18+ messages in thread
From: Jiaxun Yang @ 2024-05-24 10:54 UTC (permalink / raw)
  To: Michael Tokarev, Song Gao, QEMU devel; +Cc: Richard Henderson, qemu-stable



在2024年5月24日五月 上午11:10,Michael Tokarev写道:
> 23.05.2024 04:46, Song Gao wrote:
>> From: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> 
>> Higher bits for memory nodes were omitted at qemu_fdt_setprop_cells.
>> 
>> Cc: qemu-stable@nongnu.org
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> Reviewed-by: Song Gao <gaosong@loongson.cn>
>> Message-Id: <20240520-loongarch-fdt-memnode-v1-1-5ea9be93911e@flygoat.com>
>> Signed-off-by: Song Gao <gaosong@loongson.cn>
>> ---
>>   hw/loongarch/virt.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>> 
>> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
>> index e3bdf085b5..3e6e93edf3 100644
>> --- a/hw/loongarch/virt.c
>> +++ b/hw/loongarch/virt.c
>> @@ -464,7 +464,8 @@ static void fdt_add_memory_node(MachineState *ms,
>>       char *nodename = g_strdup_printf("/memory@%" PRIx64, base);
>>   
>>       qemu_fdt_add_subnode(ms->fdt, nodename);
>> -    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", 0, base, 0, size);
>> +    qemu_fdt_setprop_cells(ms->fdt, nodename, "reg", base >> 32, base,
>> +                           size >> 32, size);
>>       qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
>>   
>>       if (ms->numa_state && ms->numa_state->num_nodes) {
>
> This commit changes exactly the same place as the previous commit,
> v9.0.0-274-gb11f981452, "hw/loongarch: Fix fdt memory node wrong 'reg'".
>
> Was it the wrong fix?

Yes, I believe previous commit is the wrong fix on the same problem.

>
> Note the previous commit isn't in any released version of qemu.  So
> when picking up for any stable release, both needs to be picked up :)

Please go ahead!

Thanks
- Jiaxun

>
> Thanks,
>
> /mjt
> -- 
> GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24.
> New key: rsa4096/61AD3D98ECDF2C8E  9D8B E14E 3F2A 9DD7 9199  28F1 61AD 
> 3D98 ECDF 2C8E
> Old key: rsa2048/457CE0A0804465C5  6EE1 95D1 886E 8FFB 810D  4324 457C 
> E0A0 8044 65C5
> Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt

-- 
- Jiaxun


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

* Re: [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures
  2024-05-24 10:00   ` Michael Tokarev
@ 2024-05-27  1:54     ` gaosong
  0 siblings, 0 replies; 18+ messages in thread
From: gaosong @ 2024-05-27  1:54 UTC (permalink / raw)
  To: Michael Tokarev, qemu-devel; +Cc: richard.henderson, qemu-stable, Peter Xu

在 2024/5/24 下午6:00, Michael Tokarev 写道:
> 23.05.2024 04:46, Song Gao wrote:
>> vmstate does not save kvm_state_conter,
>> which can cause VM recovery from disk to fail.
>>
>> Cc: qemu-stable@nongnu.org
>> Signed-off-by: Song Gao <gaosong@loongson.cn>
>> Acked-by: Peter Xu <peterx@redhat.com>
>> Message-Id: <20240508024732.3127792-1-gaosong@loongson.cn>
>> ---
>>   target/loongarch/machine.c | 6 ++++--
>>   1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
>> index 9cd9e848d6..08a7fa5370 100644
>> --- a/target/loongarch/machine.c
>> +++ b/target/loongarch/machine.c
>> @@ -145,8 +145,8 @@ static const VMStateDescription vmstate_tlb = {
>>   /* LoongArch CPU state */
>>   const VMStateDescription vmstate_loongarch_cpu = {
>>       .name = "cpu",
>> -    .version_id = 1,
>> -    .minimum_version_id = 1,
>> +    .version_id = 2,
>> +    .minimum_version_id = 2,
>>       .fields = (const VMStateField[]) {
>>           VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
>>           VMSTATE_UINTTL(env.pc, LoongArchCPU),
>> @@ -208,6 +208,8 @@ const VMStateDescription vmstate_loongarch_cpu = {
>>           VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
>>           VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
>>   +        VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
>> +
>>           VMSTATE_END_OF_LIST()
>>       },
>>       .subsections = (const VMStateDescription * const []) {
>
> Should this really be part of any stable releases?
[...]
>
> Wouldn't it break migration between, say, 8.2 with this change
> and without?
Yes, I didn't take this into consideration, please ignore this patch.

Thanks.
Song Gao
> Thanks,
>
> /mjt



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

* Re: [PULL 06/10] hw/loongarch: Refine fwcfg memory map
  2024-05-23  1:46 ` [PULL 06/10] hw/loongarch: Refine fwcfg memory map Song Gao
@ 2024-06-07 14:31   ` Peter Maydell
  2024-06-11  1:57     ` maobibo
  0 siblings, 1 reply; 18+ messages in thread
From: Peter Maydell @ 2024-06-07 14:31 UTC (permalink / raw)
  To: Song Gao; +Cc: qemu-devel, richard.henderson, Bibo Mao

On Thu, 23 May 2024 at 02:48, Song Gao <gaosong@loongson.cn> wrote:
>
> From: Bibo Mao <maobibo@loongson.cn>
>
> Memory map table for fwcfg is used for UEFI BIOS, UEFI BIOS uses the first
> entry from fwcfg memory map as the first memory HOB, the second memory HOB
> will be used if the first memory HOB is used up.
>
> Memory map table for fwcfg does not care about numa node, however in
> generic the first memory HOB is part of numa node0, so that runtime
> memory of UEFI which is allocated from the first memory HOB is located
> at numa node0.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> Reviewed-by: Song Gao <gaosong@loongson.cn>
> Message-Id: <20240515093927.3453674-4-maobibo@loongson.cn>
> Signed-off-by: Song Gao <gaosong@loongson.cn>

Hi; Coverity points out a possible issue with this code
(CID 1546441):

> +static void fw_cfg_add_memory(MachineState *ms)
> +{
> +    hwaddr base, size, ram_size, gap;
> +    int nb_numa_nodes, nodes;
> +    NodeInfo *numa_info;
> +
> +    ram_size = ms->ram_size;
> +    base = VIRT_LOWMEM_BASE;
> +    gap = VIRT_LOWMEM_SIZE;
> +    nodes = nb_numa_nodes = ms->numa_state->num_nodes;
> +    numa_info = ms->numa_state->nodes;
> +    if (!nodes) {
> +        nodes = 1;
> +    }
> +
> +    /* add fw_cfg memory map of node0 */
> +    if (nb_numa_nodes) {
> +        size = numa_info[0].node_mem;
> +    } else {
> +        size = ram_size;
> +    }
> +
> +    if (size >= gap) {
> +        memmap_add_entry(base, gap, 1);
> +        size -= gap;
> +        base = VIRT_HIGHMEM_BASE;
> +        gap = ram_size - VIRT_LOWMEM_SIZE;

In this if() statement we set 'gap'...

> +    }
> +
> +    if (size) {
> +        memmap_add_entry(base, size, 1);
> +        base += size;
> +    }
> +
> +    if (nodes < 2) {
> +        return;
> +    }
> +
> +    /* add fw_cfg memory map of other nodes */
> +    size = ram_size - numa_info[0].node_mem;
> +    gap  = VIRT_LOWMEM_BASE + VIRT_LOWMEM_SIZE;

...but then later here we unconditionally overwrite 'gap',
without ever using it in between, making the previous
assignment useless.

What was the intention here ?

thanks
-- PMM


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

* Re: [PULL 06/10] hw/loongarch: Refine fwcfg memory map
  2024-06-07 14:31   ` Peter Maydell
@ 2024-06-11  1:57     ` maobibo
  0 siblings, 0 replies; 18+ messages in thread
From: maobibo @ 2024-06-11  1:57 UTC (permalink / raw)
  To: Peter Maydell, Song Gao; +Cc: qemu-devel, richard.henderson



On 2024/6/7 下午10:31, Peter Maydell wrote:
> On Thu, 23 May 2024 at 02:48, Song Gao <gaosong@loongson.cn> wrote:
>>
>> From: Bibo Mao <maobibo@loongson.cn>
>>
>> Memory map table for fwcfg is used for UEFI BIOS, UEFI BIOS uses the first
>> entry from fwcfg memory map as the first memory HOB, the second memory HOB
>> will be used if the first memory HOB is used up.
>>
>> Memory map table for fwcfg does not care about numa node, however in
>> generic the first memory HOB is part of numa node0, so that runtime
>> memory of UEFI which is allocated from the first memory HOB is located
>> at numa node0.
>>
>> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
>> Reviewed-by: Song Gao <gaosong@loongson.cn>
>> Message-Id: <20240515093927.3453674-4-maobibo@loongson.cn>
>> Signed-off-by: Song Gao <gaosong@loongson.cn>
> 
> Hi; Coverity points out a possible issue with this code
> (CID 1546441):
> 
>> +static void fw_cfg_add_memory(MachineState *ms)
>> +{
>> +    hwaddr base, size, ram_size, gap;
>> +    int nb_numa_nodes, nodes;
>> +    NodeInfo *numa_info;
>> +
>> +    ram_size = ms->ram_size;
>> +    base = VIRT_LOWMEM_BASE;
>> +    gap = VIRT_LOWMEM_SIZE;
>> +    nodes = nb_numa_nodes = ms->numa_state->num_nodes;
>> +    numa_info = ms->numa_state->nodes;
>> +    if (!nodes) {
>> +        nodes = 1;
>> +    }
>> +
>> +    /* add fw_cfg memory map of node0 */
>> +    if (nb_numa_nodes) {
>> +        size = numa_info[0].node_mem;
>> +    } else {
>> +        size = ram_size;
>> +    }
>> +
>> +    if (size >= gap) {
>> +        memmap_add_entry(base, gap, 1);
>> +        size -= gap;
>> +        base = VIRT_HIGHMEM_BASE;
>> +        gap = ram_size - VIRT_LOWMEM_SIZE;
> 
> In this if() statement we set 'gap'...
> 
>> +    }
>> +
>> +    if (size) {
>> +        memmap_add_entry(base, size, 1);
>> +        base += size;
>> +    }
>> +
>> +    if (nodes < 2) {
>> +        return;
>> +    }
>> +
>> +    /* add fw_cfg memory map of other nodes */
>> +    size = ram_size - numa_info[0].node_mem;
>> +    gap  = VIRT_LOWMEM_BASE + VIRT_LOWMEM_SIZE;
> 
> ...but then later here we unconditionally overwrite 'gap',
> without ever using it in between, making the previous
> assignment useless.
> 
> What was the intention here ?
It is abuse about variable gap, sometimes it represents low memory size,
sometimes it represents the end address of low memory.

It can be removed at both placed, what is this patch?

--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1054,7 +1054,6 @@ static void fw_cfg_add_memory(MachineState *ms)
          memmap_add_entry(base, gap, 1);
          size -= gap;
          base = VIRT_HIGHMEM_BASE;
-        gap = ram_size - VIRT_LOWMEM_SIZE;
      }

      if (size) {
@@ -1068,15 +1067,14 @@ static void fw_cfg_add_memory(MachineState *ms)

      /* add fw_cfg memory map of other nodes */
      size = ram_size - numa_info[0].node_mem;
-    gap  = VIRT_LOWMEM_BASE + VIRT_LOWMEM_SIZE;
-    if (base < gap && (base + size) > gap) {
+    if (numa_info[0].node_mem < gap && ram_size > gap) {
          /*
           * memory map for the maining nodes splited into two part
-         *   lowram:  [base, +(gap - base))
-         *   highram: [VIRT_HIGHMEM_BASE, +(size - (gap - base)))
+         * lowram:  [base, +(gap - numa_info[0].node_mem))
+         * highram: [VIRT_HIGHMEM_BASE, +(size - (gap - 
numa_info[0].node_mem)))
           */
-        memmap_add_entry(base, gap - base, 1);
-        size -= gap - base;
+        memmap_add_entry(base, gap - numa_info[0].node_mem, 1);
+        size -= gap - numa_info[0].node_mem;
          base = VIRT_HIGHMEM_BASE;
      }

Regards
Bibo Mao


> 
> thanks
> -- PMM
> 



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

end of thread, other threads:[~2024-06-11  1:58 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-23  1:46 [PULL 00/10] loongarch-to-apply queue Song Gao
2024-05-23  1:46 ` [PULL 01/10] target/loongarch/kvm: Fix VM recovery from disk failures Song Gao
2024-05-24 10:00   ` Michael Tokarev
2024-05-27  1:54     ` gaosong
2024-05-23  1:46 ` [PULL 02/10] target/loongarch/kvm: fpu save the vreg registers high 192bit Song Gao
2024-05-23  1:46 ` [PULL 03/10] hw/loongarch: Add VM mode in IOCSR feature register in kvm mode Song Gao
2024-05-23  1:46 ` [PULL 04/10] hw/loongarch: Refine acpi srat table for numa memory Song Gao
2024-05-23  1:46 ` [PULL 05/10] hw/loongarch: Refine fadt memory " Song Gao
2024-05-23  1:46 ` [PULL 06/10] hw/loongarch: Refine fwcfg memory map Song Gao
2024-06-07 14:31   ` Peter Maydell
2024-06-11  1:57     ` maobibo
2024-05-23  1:46 ` [PULL 07/10] hw/loongarch: Refine system dram memory region Song Gao
2024-05-23  1:46 ` [PULL 08/10] hw/loongarch: Remove minimum and default memory size Song Gao
2024-05-23  1:46 ` [PULL 09/10] target/loongarch: Add loongarch vector property unconditionally Song Gao
2024-05-23  1:46 ` [PULL 10/10] hw/loongarch/virt: Fix FDT memory node address width Song Gao
2024-05-24 10:10   ` Michael Tokarev
2024-05-24 10:54     ` Jiaxun Yang
2024-05-23 16:44 ` [PULL 00/10] loongarch-to-apply queue Richard Henderson

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