mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
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:
parent
4332a641e2
commit
ffe89c1762
4 changed files with 37 additions and 22 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue