[PATCH 2/2] hw/loongarch/virt: Remove global variables about memmap tables

Bibo Mao posted 2 patches 6 months, 2 weeks ago
Maintainers: Song Gao <gaosong@loongson.cn>, Bibo Mao <maobibo@loongson.cn>, Jiaxun Yang <jiaxun.yang@flygoat.com>
[PATCH 2/2] hw/loongarch/virt: Remove global variables about memmap tables
Posted by Bibo Mao 6 months, 2 weeks ago
Global variables memmap_table and memmap_entries stores UEFI memory
map table informations. It can be moved into structure
LoongArchVirtMachineState.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/boot.c         | 31 +++++++++++++++++++------------
 hw/loongarch/virt.c         | 23 ++++++++++++++++-------
 include/hw/loongarch/boot.h |  3 ---
 include/hw/loongarch/virt.h |  2 ++
 4 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index 44d537d987..86435caa5e 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -35,9 +35,6 @@ struct loongarch_linux_hdr {
     uint32_t pe_header_offset;
 } QEMU_PACKED;
 
-struct memmap_entry *memmap_table;
-unsigned memmap_entries;
-
 static const unsigned int slave_boot_code[] = {
                   /* Configure reset ebase.                    */
     0x0400302c,   /* csrwr      $t0, LOONGARCH_CSR_EENTRY      */
@@ -91,12 +88,16 @@ static inline void *guidcpy(void *dst, const void *src)
     return memcpy(dst, src, sizeof(efi_guid_t));
 }
 
-static void init_efi_boot_memmap(struct efi_system_table *systab,
+static void init_efi_boot_memmap(MachineState *ms,
+                                 struct efi_system_table *systab,
                                  void *p, void *start)
 {
     unsigned i;
     struct efi_boot_memmap *boot_memmap = p;
     efi_guid_t tbl_guid = LINUX_EFI_BOOT_MEMMAP_GUID;
+    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
+    struct memmap_entry *memmap_table;
+    unsigned int memmap_entries;
 
     /* efi_configuration_table 1 */
     guidcpy(&systab->tables[0].guid, &tbl_guid);
@@ -108,6 +109,8 @@ static void init_efi_boot_memmap(struct efi_system_table *systab,
     boot_memmap->map_size = 0;
 
     efi_memory_desc_t *map = p + sizeof(struct efi_boot_memmap);
+    memmap_table = lvms->memmap_table;
+    memmap_entries = lvms->memmap_entries;
     for (i = 0; i < memmap_entries; i++) {
         map = (void *)boot_memmap + sizeof(*map);
         map[i].type = memmap_table[i].type;
@@ -144,10 +147,12 @@ static void init_efi_fdt_table(struct efi_system_table *systab)
     systab->nr_tables = 3;
 }
 
-static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
+static void init_systab(MachineState *ms,
+                        struct loongarch_boot_info *info, void *p, void *start)
 {
     void *bp_tables_start;
     struct efi_system_table *systab = p;
+    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
 
     info->a2 = p - start;
 
@@ -164,9 +169,9 @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
     systab->tables = p;
     bp_tables_start = p;
 
-    init_efi_boot_memmap(systab, p, start);
+    init_efi_boot_memmap(ms, systab, p, start);
     p += ROUND_UP(sizeof(struct efi_boot_memmap) +
-                  sizeof(efi_memory_desc_t) * memmap_entries, 64 * KiB);
+                  sizeof(efi_memory_desc_t) * lvms->memmap_entries, 64 * KiB);
     init_efi_initrd_table(info, systab, p, start);
     p += ROUND_UP(sizeof(struct efi_initrd), 64 * KiB);
     init_efi_fdt_table(systab);
@@ -333,17 +338,19 @@ static void loongarch_firmware_boot(LoongArchVirtMachineState *lvms,
     fw_cfg_add_kernel_info(info, lvms->fw_cfg);
 }
 
-static void init_boot_rom(struct loongarch_boot_info *info, void *p)
+static void init_boot_rom(MachineState *ms,
+                          struct loongarch_boot_info *info, void *p)
 {
     void *start = p;
 
     init_cmdline(info, p, start);
     p += COMMAND_LINE_SIZE;
 
-    init_systab(info, p, start);
+    init_systab(ms, info, p, start);
 }
 
-static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
+static void loongarch_direct_kernel_boot(MachineState *ms,
+                                         struct loongarch_boot_info *info)
 {
     void *p, *bp;
     int64_t kernel_addr = VIRT_FLASH0_BASE;
@@ -361,7 +368,7 @@ static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
     /* Load cmdline and system tables at [0 - 1 MiB] */
     p = g_malloc0(1 * MiB);
     bp = p;
-    init_boot_rom(info, p);
+    init_boot_rom(ms, info, p);
     rom_add_blob_fixed_as("boot_info", bp, 1 * MiB, 0, &address_space_memory);
 
     /* Load slave boot code at pflash0 . */
@@ -401,6 +408,6 @@ void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
     if (lvms->bios_loaded) {
         loongarch_firmware_boot(lvms, info);
     } else {
-        loongarch_direct_kernel_boot(info);
+        loongarch_direct_kernel_boot(ms, info);
     }
 }
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 779544fada..601e7c6bd3 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -168,8 +168,15 @@ static void virt_powerdown_req(Notifier *notifier, void *opaque)
     acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
 }
 
-static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
+static void memmap_add_entry(MachineState *ms, uint64_t address,
+                             uint64_t length, uint32_t type)
 {
+    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
+    struct memmap_entry *memmap_table;
+    unsigned int memmap_entries;
+
+    memmap_table = lvms->memmap_table;
+    memmap_entries = lvms->memmap_entries;
     /* Ensure there are no duplicate entries. */
     for (unsigned i = 0; i < memmap_entries; i++) {
         assert(memmap_table[i].address != address);
@@ -182,6 +189,8 @@ static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
     memmap_table[memmap_entries].type = cpu_to_le32(type);
     memmap_table[memmap_entries].reserved = 0;
     memmap_entries++;
+    lvms->memmap_table = memmap_table;
+    lvms->memmap_entries = memmap_entries;
 }
 
 static DeviceState *create_acpi_ged(DeviceState *pch_pic,
@@ -625,13 +634,13 @@ static void fw_cfg_add_memory(MachineState *ms)
     }
 
     if (size >= gap) {
-        memmap_add_entry(base, gap, 1);
+        memmap_add_entry(ms, base, gap, 1);
         size -= gap;
         base = VIRT_HIGHMEM_BASE;
     }
 
     if (size) {
-        memmap_add_entry(base, size, 1);
+        memmap_add_entry(ms, base, size, 1);
         base += size;
     }
 
@@ -646,7 +655,7 @@ static void fw_cfg_add_memory(MachineState *ms)
          * lowram:  [base, +(gap - numa_info[0].node_mem))
          * highram: [VIRT_HIGHMEM_BASE, +(ram_size - gap))
          */
-        memmap_add_entry(base, gap - numa_info[0].node_mem, 1);
+        memmap_add_entry(ms, base, gap - numa_info[0].node_mem, 1);
         size = ram_size - gap;
         base = VIRT_HIGHMEM_BASE;
     } else {
@@ -654,7 +663,7 @@ static void fw_cfg_add_memory(MachineState *ms)
     }
 
     if (size) {
-        memmap_add_entry(base, size, 1);
+        memmap_add_entry(ms, base, size, 1);
     }
 }
 
@@ -740,8 +749,8 @@ static void virt_init(MachineState *machine)
     rom_set_fw(lvms->fw_cfg);
     if (lvms->fw_cfg != NULL) {
         fw_cfg_add_file(lvms->fw_cfg, "etc/memmap",
-                        memmap_table,
-                        sizeof(struct memmap_entry) * (memmap_entries));
+                        lvms->memmap_table,
+                        sizeof(struct memmap_entry) * lvms->memmap_entries);
     }
 
     /* Initialize the IO interrupt subsystem */
diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
index 27399de99c..9819f7fbe3 100644
--- a/include/hw/loongarch/boot.h
+++ b/include/hw/loongarch/boot.h
@@ -106,9 +106,6 @@ struct loongarch_boot_info {
     uint64_t initrd_size;
 };
 
-extern struct memmap_entry *memmap_table;
-extern unsigned memmap_entries;
-
 struct memmap_entry {
     uint64_t address;
     uint64_t length;
diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
index 2b7d19953f..602feab0f0 100644
--- a/include/hw/loongarch/virt.h
+++ b/include/hw/loongarch/virt.h
@@ -63,6 +63,8 @@ struct LoongArchVirtMachineState {
     struct loongarch_boot_info bootinfo;
     DeviceState *ipi;
     DeviceState *extioi;
+    struct memmap_entry *memmap_table;
+    unsigned int memmap_entries;
 };
 
 #define TYPE_LOONGARCH_VIRT_MACHINE  MACHINE_TYPE_NAME("virt")
-- 
2.39.3
Re: [PATCH 2/2] hw/loongarch/virt: Remove global variables about memmap tables
Posted by gaosong 5 months, 3 weeks ago
在 2025/4/30 下午5:47, Bibo Mao 写道:
> Global variables memmap_table and memmap_entries stores UEFI memory
> map table informations. It can be moved into structure
> LoongArchVirtMachineState.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   hw/loongarch/boot.c         | 31 +++++++++++++++++++------------
>   hw/loongarch/virt.c         | 23 ++++++++++++++++-------
>   include/hw/loongarch/boot.h |  3 ---
>   include/hw/loongarch/virt.h |  2 ++
>   4 files changed, 37 insertions(+), 22 deletions(-)
Reviewed-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
> index 44d537d987..86435caa5e 100644
> --- a/hw/loongarch/boot.c
> +++ b/hw/loongarch/boot.c
> @@ -35,9 +35,6 @@ struct loongarch_linux_hdr {
>       uint32_t pe_header_offset;
>   } QEMU_PACKED;
>   
> -struct memmap_entry *memmap_table;
> -unsigned memmap_entries;
> -
>   static const unsigned int slave_boot_code[] = {
>                     /* Configure reset ebase.                    */
>       0x0400302c,   /* csrwr      $t0, LOONGARCH_CSR_EENTRY      */
> @@ -91,12 +88,16 @@ static inline void *guidcpy(void *dst, const void *src)
>       return memcpy(dst, src, sizeof(efi_guid_t));
>   }
>   
> -static void init_efi_boot_memmap(struct efi_system_table *systab,
> +static void init_efi_boot_memmap(MachineState *ms,
> +                                 struct efi_system_table *systab,
>                                    void *p, void *start)
>   {
>       unsigned i;
>       struct efi_boot_memmap *boot_memmap = p;
>       efi_guid_t tbl_guid = LINUX_EFI_BOOT_MEMMAP_GUID;
> +    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
> +    struct memmap_entry *memmap_table;
> +    unsigned int memmap_entries;
>   
>       /* efi_configuration_table 1 */
>       guidcpy(&systab->tables[0].guid, &tbl_guid);
> @@ -108,6 +109,8 @@ static void init_efi_boot_memmap(struct efi_system_table *systab,
>       boot_memmap->map_size = 0;
>   
>       efi_memory_desc_t *map = p + sizeof(struct efi_boot_memmap);
> +    memmap_table = lvms->memmap_table;
> +    memmap_entries = lvms->memmap_entries;
>       for (i = 0; i < memmap_entries; i++) {
>           map = (void *)boot_memmap + sizeof(*map);
>           map[i].type = memmap_table[i].type;
> @@ -144,10 +147,12 @@ static void init_efi_fdt_table(struct efi_system_table *systab)
>       systab->nr_tables = 3;
>   }
>   
> -static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
> +static void init_systab(MachineState *ms,
> +                        struct loongarch_boot_info *info, void *p, void *start)
>   {
>       void *bp_tables_start;
>       struct efi_system_table *systab = p;
> +    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
>   
>       info->a2 = p - start;
>   
> @@ -164,9 +169,9 @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
>       systab->tables = p;
>       bp_tables_start = p;
>   
> -    init_efi_boot_memmap(systab, p, start);
> +    init_efi_boot_memmap(ms, systab, p, start);
>       p += ROUND_UP(sizeof(struct efi_boot_memmap) +
> -                  sizeof(efi_memory_desc_t) * memmap_entries, 64 * KiB);
> +                  sizeof(efi_memory_desc_t) * lvms->memmap_entries, 64 * KiB);
>       init_efi_initrd_table(info, systab, p, start);
>       p += ROUND_UP(sizeof(struct efi_initrd), 64 * KiB);
>       init_efi_fdt_table(systab);
> @@ -333,17 +338,19 @@ static void loongarch_firmware_boot(LoongArchVirtMachineState *lvms,
>       fw_cfg_add_kernel_info(info, lvms->fw_cfg);
>   }
>   
> -static void init_boot_rom(struct loongarch_boot_info *info, void *p)
> +static void init_boot_rom(MachineState *ms,
> +                          struct loongarch_boot_info *info, void *p)
>   {
>       void *start = p;
>   
>       init_cmdline(info, p, start);
>       p += COMMAND_LINE_SIZE;
>   
> -    init_systab(info, p, start);
> +    init_systab(ms, info, p, start);
>   }
>   
> -static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
> +static void loongarch_direct_kernel_boot(MachineState *ms,
> +                                         struct loongarch_boot_info *info)
>   {
>       void *p, *bp;
>       int64_t kernel_addr = VIRT_FLASH0_BASE;
> @@ -361,7 +368,7 @@ static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
>       /* Load cmdline and system tables at [0 - 1 MiB] */
>       p = g_malloc0(1 * MiB);
>       bp = p;
> -    init_boot_rom(info, p);
> +    init_boot_rom(ms, info, p);
>       rom_add_blob_fixed_as("boot_info", bp, 1 * MiB, 0, &address_space_memory);
>   
>       /* Load slave boot code at pflash0 . */
> @@ -401,6 +408,6 @@ void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
>       if (lvms->bios_loaded) {
>           loongarch_firmware_boot(lvms, info);
>       } else {
> -        loongarch_direct_kernel_boot(info);
> +        loongarch_direct_kernel_boot(ms, info);
>       }
>   }
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 779544fada..601e7c6bd3 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -168,8 +168,15 @@ static void virt_powerdown_req(Notifier *notifier, void *opaque)
>       acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS);
>   }
>   
> -static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
> +static void memmap_add_entry(MachineState *ms, uint64_t address,
> +                             uint64_t length, uint32_t type)
>   {
> +    LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
> +    struct memmap_entry *memmap_table;
> +    unsigned int memmap_entries;
> +
> +    memmap_table = lvms->memmap_table;
> +    memmap_entries = lvms->memmap_entries;
>       /* Ensure there are no duplicate entries. */
>       for (unsigned i = 0; i < memmap_entries; i++) {
>           assert(memmap_table[i].address != address);
> @@ -182,6 +189,8 @@ static void memmap_add_entry(uint64_t address, uint64_t length, uint32_t type)
>       memmap_table[memmap_entries].type = cpu_to_le32(type);
>       memmap_table[memmap_entries].reserved = 0;
>       memmap_entries++;
> +    lvms->memmap_table = memmap_table;
> +    lvms->memmap_entries = memmap_entries;
>   }
>   
>   static DeviceState *create_acpi_ged(DeviceState *pch_pic,
> @@ -625,13 +634,13 @@ static void fw_cfg_add_memory(MachineState *ms)
>       }
>   
>       if (size >= gap) {
> -        memmap_add_entry(base, gap, 1);
> +        memmap_add_entry(ms, base, gap, 1);
>           size -= gap;
>           base = VIRT_HIGHMEM_BASE;
>       }
>   
>       if (size) {
> -        memmap_add_entry(base, size, 1);
> +        memmap_add_entry(ms, base, size, 1);
>           base += size;
>       }
>   
> @@ -646,7 +655,7 @@ static void fw_cfg_add_memory(MachineState *ms)
>            * lowram:  [base, +(gap - numa_info[0].node_mem))
>            * highram: [VIRT_HIGHMEM_BASE, +(ram_size - gap))
>            */
> -        memmap_add_entry(base, gap - numa_info[0].node_mem, 1);
> +        memmap_add_entry(ms, base, gap - numa_info[0].node_mem, 1);
>           size = ram_size - gap;
>           base = VIRT_HIGHMEM_BASE;
>       } else {
> @@ -654,7 +663,7 @@ static void fw_cfg_add_memory(MachineState *ms)
>       }
>   
>       if (size) {
> -        memmap_add_entry(base, size, 1);
> +        memmap_add_entry(ms, base, size, 1);
>       }
>   }
>   
> @@ -740,8 +749,8 @@ static void virt_init(MachineState *machine)
>       rom_set_fw(lvms->fw_cfg);
>       if (lvms->fw_cfg != NULL) {
>           fw_cfg_add_file(lvms->fw_cfg, "etc/memmap",
> -                        memmap_table,
> -                        sizeof(struct memmap_entry) * (memmap_entries));
> +                        lvms->memmap_table,
> +                        sizeof(struct memmap_entry) * lvms->memmap_entries);
>       }
>   
>       /* Initialize the IO interrupt subsystem */
> diff --git a/include/hw/loongarch/boot.h b/include/hw/loongarch/boot.h
> index 27399de99c..9819f7fbe3 100644
> --- a/include/hw/loongarch/boot.h
> +++ b/include/hw/loongarch/boot.h
> @@ -106,9 +106,6 @@ struct loongarch_boot_info {
>       uint64_t initrd_size;
>   };
>   
> -extern struct memmap_entry *memmap_table;
> -extern unsigned memmap_entries;
> -
>   struct memmap_entry {
>       uint64_t address;
>       uint64_t length;
> diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
> index 2b7d19953f..602feab0f0 100644
> --- a/include/hw/loongarch/virt.h
> +++ b/include/hw/loongarch/virt.h
> @@ -63,6 +63,8 @@ struct LoongArchVirtMachineState {
>       struct loongarch_boot_info bootinfo;
>       DeviceState *ipi;
>       DeviceState *extioi;
> +    struct memmap_entry *memmap_table;
> +    unsigned int memmap_entries;
>   };
>   
>   #define TYPE_LOONGARCH_VIRT_MACHINE  MACHINE_TYPE_NAME("virt")