@samitouri / QOSamiQemu / commits / 16d73d390c

hw/loongarch: Use loongarch_palen_mask()

Replaces remaining uses of TARGET_PHYS_ADDR_SPACE_BITS with runtime calls to loongarch_palen_mask() to fetch the physical address mask from the cpucfg PALEN field. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Anton Johansson <anjo@rev.ng> Message-ID: <20260218-phys_addr-v6-5-a603bf363218@rev.ng> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Anton Johansson committed Dec 9, 2025 at 14:56 UTC 16d73d390ced91154caf5acdf3fa4b780d8b3228
3 files changed +22 -14
hw/loongarch/boot.c
+16 -12
@@ -217,10 +217,12 @@ static void init_cmdline(struct loongarch_boot_info *info, void *p, void *start)
217
218 static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr)
219 {
220 - return addr & MAKE_64BIT_MASK(0, TARGET_PHYS_ADDR_SPACE_BITS);
220 + uint64_t *phys_addr_mask = opaque;
221 + return addr & *phys_addr_mask;
222 }
223
224 static int64_t load_loongarch_linux_image(const char *filename,
225 + uint64_t phys_addr_mask,
226 uint64_t *kernel_entry,
227 uint64_t *kernel_low,
228 uint64_t *kernel_high)
@@ -251,10 +253,8 @@ static int64_t load_loongarch_linux_image(const char *filename,
253 }
254
255 /* Early kernel versions may have those fields in virtual address */
254 - *kernel_entry = extract64(le64_to_cpu(hdr->kernel_entry),
255 - 0, TARGET_PHYS_ADDR_SPACE_BITS);
256 - *kernel_low = extract64(le64_to_cpu(hdr->load_offset),
257 - 0, TARGET_PHYS_ADDR_SPACE_BITS);
256 + *kernel_entry = le64_to_cpu(hdr->kernel_entry) & phys_addr_mask;
257 + *kernel_low = le64_to_cpu(hdr->load_offset) & phys_addr_mask;
258 *kernel_high = *kernel_low + size;
259
260 rom_add_blob_fixed(filename, buffer, size, *kernel_low);
@@ -303,19 +303,21 @@ static ram_addr_t alloc_initrd_memory(struct loongarch_boot_info *info,
303 exit(1);
304 }
305
306 -static int64_t load_kernel_info(struct loongarch_boot_info *info)
306 +static int64_t load_kernel_info(struct loongarch_boot_info *info,
307 + uint64_t phys_addr_mask)
308 {
309 uint64_t kernel_entry, kernel_low, kernel_high, initrd_offset = 0;
310 ssize_t kernel_size;
311
312 kernel_size = load_elf(info->kernel_filename, NULL,
312 - cpu_loongarch_virt_to_phys, NULL,
313 + cpu_loongarch_virt_to_phys, &phys_addr_mask,
314 &kernel_entry, &kernel_low,
315 &kernel_high, NULL, ELFDATA2LSB,
316 EM_LOONGARCH, 1, 0);
316 - kernel_entry = cpu_loongarch_virt_to_phys(NULL, kernel_entry);
317 + kernel_entry = cpu_loongarch_virt_to_phys(&phys_addr_mask, kernel_entry);
318 if (kernel_size < 0) {
319 kernel_size = load_loongarch_linux_image(info->kernel_filename,
320 + phys_addr_mask,
321 &kernel_entry, &kernel_low,
322 &kernel_high);
323 }
@@ -395,14 +397,15 @@ static void init_boot_rom(MachineState *ms,
397 }
398
399 static void loongarch_direct_kernel_boot(MachineState *ms,
398 - struct loongarch_boot_info *info)
400 + struct loongarch_boot_info *info,
401 + uint64_t phys_addr_mask)
402 {
403 void *p, *bp;
404 int64_t kernel_addr = VIRT_FLASH0_BASE;
405 uint64_t *data;
406
407 if (info->kernel_filename) {
405 - kernel_addr = load_kernel_info(info);
408 + kernel_addr = load_kernel_info(info, phys_addr_mask);
409 } else {
410 if (!qtest_enabled()) {
411 warn_report("No kernel provided, booting from flash drive.");
@@ -429,7 +432,8 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
432 g_free(bp);
433 }
434
432 -void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
435 +void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info,
436 + uint64_t phys_addr_mask)
437 {
438 LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
439
@@ -440,6 +444,6 @@ void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
444 if (lvms->bios_loaded) {
445 loongarch_firmware_boot(lvms, info);
446 } else {
443 - loongarch_direct_kernel_boot(ms, info);
447 + loongarch_direct_kernel_boot(ms, info, phys_addr_mask);
448 }
449 }
hw/loongarch/virt.c
+4 -1
@@ -34,6 +34,7 @@
34 #include "hw/misc/unimp.h"
35 #include "hw/loongarch/fw_cfg.h"
36 #include "target/loongarch/cpu.h"
37 +#include "target/loongarch/cpu-mmu.h"
38 #include "hw/firmware/smbios.h"
39 #include "qapi/qapi-visit-common.h"
40 #include "hw/acpi/generic_event_device.h"
@@ -928,6 +929,7 @@ static void virt_init(MachineState *machine)
929 hwaddr base, size, ram_size = machine->ram_size;
930 MachineClass *mc = MACHINE_GET_CLASS(machine);
931 Object *cpuobj;
932 + uint64_t phys_addr_mask = 0;
933
934 if (!cpu_model) {
935 cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
@@ -1017,7 +1019,8 @@ static void virt_init(MachineState *machine)
1019 qemu_register_powerdown_notifier(&lvms->powerdown_notifier);
1020
1021 lvms->bootinfo.ram_size = ram_size;
1020 - loongarch_load_kernel(machine, &lvms->bootinfo);
1022 + phys_addr_mask = loongarch_palen_mask(&LOONGARCH_CPU(first_cpu)->env);
1023 + loongarch_load_kernel(machine, &lvms->bootinfo, phys_addr_mask);
1024 }
1025
1026 static void virt_get_acpi(Object *obj, Visitor *v, const char *name,
include/hw/loongarch/boot.h
+2 -1
@@ -113,6 +113,7 @@ struct memmap_entry {
113 uint32_t reserved;
114 };
115
116 -void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info);
116 +void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info,
117 + uint64_t phys_addr_mask);
118
119 #endif /* HW_LOONGARCH_BOOT_H */