hw/loongarch/virt: Remove global variables about memmap tables

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>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Message-Id: <20250430094738.1556670-3-maobibo@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
This commit is contained in:
Bibo Mao 2025-04-30 17:47:38 +08:00 committed by Song Gao
parent 4332a641e2
commit ffe89c1762
4 changed files with 37 additions and 22 deletions

View file

@ -35,9 +35,6 @@ struct loongarch_linux_hdr {
uint32_t pe_header_offset; uint32_t pe_header_offset;
} QEMU_PACKED; } QEMU_PACKED;
struct memmap_entry *memmap_table;
unsigned memmap_entries;
static const unsigned int slave_boot_code[] = { static const unsigned int slave_boot_code[] = {
/* Configure reset ebase. */ /* Configure reset ebase. */
0x0400302c, /* csrwr $t0, LOONGARCH_CSR_EENTRY */ 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)); 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) void *p, void *start)
{ {
unsigned i; unsigned i;
struct efi_boot_memmap *boot_memmap = p; struct efi_boot_memmap *boot_memmap = p;
efi_guid_t tbl_guid = LINUX_EFI_BOOT_MEMMAP_GUID; 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 */ /* efi_configuration_table 1 */
guidcpy(&systab->tables[0].guid, &tbl_guid); 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; boot_memmap->map_size = 0;
efi_memory_desc_t *map = p + sizeof(struct efi_boot_memmap); 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++) { for (i = 0; i < memmap_entries; i++) {
map = (void *)boot_memmap + sizeof(*map); map = (void *)boot_memmap + sizeof(*map);
map[i].type = memmap_table[i].type; 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; 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; void *bp_tables_start;
struct efi_system_table *systab = p; struct efi_system_table *systab = p;
LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
info->a2 = p - start; info->a2 = p - start;
@ -164,9 +169,9 @@ static void init_systab(struct loongarch_boot_info *info, void *p, void *start)
systab->tables = p; systab->tables = p;
bp_tables_start = 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) + 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); init_efi_initrd_table(info, systab, p, start);
p += ROUND_UP(sizeof(struct efi_initrd), 64 * KiB); p += ROUND_UP(sizeof(struct efi_initrd), 64 * KiB);
init_efi_fdt_table(systab); init_efi_fdt_table(systab);
@ -368,17 +373,19 @@ static void loongarch_firmware_boot(LoongArchVirtMachineState *lvms,
fw_cfg_add_kernel_info(info, lvms->fw_cfg); 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; void *start = p;
init_cmdline(info, p, start); init_cmdline(info, p, start);
p += COMMAND_LINE_SIZE; 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; void *p, *bp;
int64_t kernel_addr = VIRT_FLASH0_BASE; int64_t kernel_addr = VIRT_FLASH0_BASE;
@ -396,7 +403,7 @@ static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
/* Load cmdline and system tables at [0 - 1 MiB] */ /* Load cmdline and system tables at [0 - 1 MiB] */
p = g_malloc0(1 * MiB); p = g_malloc0(1 * MiB);
bp = p; 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); rom_add_blob_fixed_as("boot_info", bp, 1 * MiB, 0, &address_space_memory);
/* Load slave boot code at pflash0 . */ /* Load slave boot code at pflash0 . */
@ -436,6 +443,6 @@ void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
if (lvms->bios_loaded) { if (lvms->bios_loaded) {
loongarch_firmware_boot(lvms, info); loongarch_firmware_boot(lvms, info);
} else { } else {
loongarch_direct_kernel_boot(info); loongarch_direct_kernel_boot(ms, info);
} }
} }

View file

@ -172,8 +172,15 @@ static void virt_powerdown_req(Notifier *notifier, void *opaque)
acpi_send_event(s->acpi_ged, ACPI_POWER_DOWN_STATUS); 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. */ /* Ensure there are no duplicate entries. */
for (unsigned i = 0; i < memmap_entries; i++) { for (unsigned i = 0; i < memmap_entries; i++) {
assert(memmap_table[i].address != address); assert(memmap_table[i].address != address);
@ -186,6 +193,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].type = cpu_to_le32(type);
memmap_table[memmap_entries].reserved = 0; memmap_table[memmap_entries].reserved = 0;
memmap_entries++; memmap_entries++;
lvms->memmap_table = memmap_table;
lvms->memmap_entries = memmap_entries;
} }
static DeviceState *create_acpi_ged(DeviceState *pch_pic, static DeviceState *create_acpi_ged(DeviceState *pch_pic,
@ -623,13 +632,13 @@ static void fw_cfg_add_memory(MachineState *ms)
} }
if (size >= gap) { if (size >= gap) {
memmap_add_entry(base, gap, 1); memmap_add_entry(ms, base, gap, 1);
size -= gap; size -= gap;
base = VIRT_HIGHMEM_BASE; base = VIRT_HIGHMEM_BASE;
} }
if (size) { if (size) {
memmap_add_entry(base, size, 1); memmap_add_entry(ms, base, size, 1);
base += size; base += size;
} }
@ -644,7 +653,7 @@ static void fw_cfg_add_memory(MachineState *ms)
* lowram: [base, +(gap - numa_info[0].node_mem)) * lowram: [base, +(gap - numa_info[0].node_mem))
* highram: [VIRT_HIGHMEM_BASE, +(ram_size - gap)) * 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; size = ram_size - gap;
base = VIRT_HIGHMEM_BASE; base = VIRT_HIGHMEM_BASE;
} else { } else {
@ -652,7 +661,7 @@ static void fw_cfg_add_memory(MachineState *ms)
} }
if (size) { if (size) {
memmap_add_entry(base, size, 1); memmap_add_entry(ms, base, size, 1);
} }
} }
@ -738,8 +747,8 @@ static void virt_init(MachineState *machine)
rom_set_fw(lvms->fw_cfg); rom_set_fw(lvms->fw_cfg);
if (lvms->fw_cfg != NULL) { if (lvms->fw_cfg != NULL) {
fw_cfg_add_file(lvms->fw_cfg, "etc/memmap", fw_cfg_add_file(lvms->fw_cfg, "etc/memmap",
memmap_table, lvms->memmap_table,
sizeof(struct memmap_entry) * (memmap_entries)); sizeof(struct memmap_entry) * lvms->memmap_entries);
} }
/* Initialize the IO interrupt subsystem */ /* Initialize the IO interrupt subsystem */

View file

@ -106,9 +106,6 @@ struct loongarch_boot_info {
uint64_t initrd_size; uint64_t initrd_size;
}; };
extern struct memmap_entry *memmap_table;
extern unsigned memmap_entries;
struct memmap_entry { struct memmap_entry {
uint64_t address; uint64_t address;
uint64_t length; uint64_t length;

View file

@ -63,6 +63,8 @@ struct LoongArchVirtMachineState {
struct loongarch_boot_info bootinfo; struct loongarch_boot_info bootinfo;
DeviceState *ipi; DeviceState *ipi;
DeviceState *extioi; DeviceState *extioi;
struct memmap_entry *memmap_table;
unsigned int memmap_entries;
}; };
#define TYPE_LOONGARCH_VIRT_MACHINE MACHINE_TYPE_NAME("virt") #define TYPE_LOONGARCH_VIRT_MACHINE MACHINE_TYPE_NAME("virt")