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
在 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")
© 2016 - 2025 Red Hat, Inc.