[PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP

Bibo Mao posted 3 patches 3 weeks, 1 day ago
Maintainers: Song Gao <gaosong@loongson.cn>, Bibo Mao <maobibo@loongson.cn>, Jiaxun Yang <jiaxun.yang@flygoat.com>
[PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
Posted by Bibo Mao 3 weeks, 1 day ago
With BSP core, it boots from aux boot code and loads data into register
A0-A2 and PC. Pre-boot setting is not unnecessary and can be removed.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/boot.c    | 22 ----------------------
 target/loongarch/cpu.h |  4 ----
 2 files changed, 26 deletions(-)

diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index 4962668e5a..5799b4c75c 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -353,17 +353,8 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
 static void reset_load_elf(void *opaque)
 {
     LoongArchCPU *cpu = opaque;
-    CPULoongArchState *env = &cpu->env;
 
     cpu_reset(CPU(cpu));
-    if (env->load_elf) {
-        if (cpu == LOONGARCH_CPU(first_cpu)) {
-            env->gpr[4] = env->boot_info->a0;
-            env->gpr[5] = env->boot_info->a1;
-            env->gpr[6] = env->boot_info->a2;
-        }
-        cpu_set_pc(CPU(cpu), env->elf_address);
-    }
 }
 
 static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
@@ -415,8 +406,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
 {
     void *p, *bp;
     int64_t kernel_addr = VIRT_FLASH0_BASE;
-    LoongArchCPU *lacpu;
-    CPUState *cs;
     uint64_t *data;
 
     if (info->kernel_filename) {
@@ -443,17 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
     *(data - 1) = cpu_to_le64(kernel_addr);
     rom_add_blob_fixed("boot_code", boot_code, VIRT_FLASH0_SIZE, VIRT_FLASH0_BASE);
 
-    CPU_FOREACH(cs) {
-        lacpu = LOONGARCH_CPU(cs);
-        lacpu->env.load_elf = true;
-        if (cs == first_cpu) {
-            lacpu->env.elf_address = kernel_addr;
-        } else {
-            lacpu->env.elf_address = VIRT_FLASH0_BASE;
-        }
-        lacpu->env.boot_info = info;
-    }
-
     g_free(boot_code);
     g_free(bp);
 }
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index 7731f6acdc..c8b96f74dc 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -387,11 +387,7 @@ typedef struct CPUArchState {
 #endif
 
     AddressSpace *address_space_iocsr;
-    bool load_elf;
-    uint64_t elf_address;
     uint32_t mp_state;
-
-    struct loongarch_boot_info *boot_info;
 #endif
 } CPULoongArchState;
 
-- 
2.39.3
Re: [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
Posted by gaosong 2 weeks, 4 days ago
在 2025/9/6 下午3:01, Bibo Mao 写道:
> With BSP core, it boots from aux boot code and loads data into register
> A0-A2 and PC. Pre-boot setting is not unnecessary and can be removed.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   hw/loongarch/boot.c    | 22 ----------------------
>   target/loongarch/cpu.h |  4 ----
>   2 files changed, 26 deletions(-)
Reviewed-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
> index 4962668e5a..5799b4c75c 100644
> --- a/hw/loongarch/boot.c
> +++ b/hw/loongarch/boot.c
> @@ -353,17 +353,8 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
>   static void reset_load_elf(void *opaque)
>   {
>       LoongArchCPU *cpu = opaque;
> -    CPULoongArchState *env = &cpu->env;
>   
>       cpu_reset(CPU(cpu));
> -    if (env->load_elf) {
> -        if (cpu == LOONGARCH_CPU(first_cpu)) {
> -            env->gpr[4] = env->boot_info->a0;
> -            env->gpr[5] = env->boot_info->a1;
> -            env->gpr[6] = env->boot_info->a2;
> -        }
> -        cpu_set_pc(CPU(cpu), env->elf_address);
> -    }
>   }
>   
>   static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
> @@ -415,8 +406,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
>   {
>       void *p, *bp;
>       int64_t kernel_addr = VIRT_FLASH0_BASE;
> -    LoongArchCPU *lacpu;
> -    CPUState *cs;
>       uint64_t *data;
>   
>       if (info->kernel_filename) {
> @@ -443,17 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
>       *(data - 1) = cpu_to_le64(kernel_addr);
>       rom_add_blob_fixed("boot_code", boot_code, VIRT_FLASH0_SIZE, VIRT_FLASH0_BASE);
>   
> -    CPU_FOREACH(cs) {
> -        lacpu = LOONGARCH_CPU(cs);
> -        lacpu->env.load_elf = true;
> -        if (cs == first_cpu) {
> -            lacpu->env.elf_address = kernel_addr;
> -        } else {
> -            lacpu->env.elf_address = VIRT_FLASH0_BASE;
> -        }
> -        lacpu->env.boot_info = info;
> -    }
> -
>       g_free(boot_code);
>       g_free(bp);
>   }
> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
> index 7731f6acdc..c8b96f74dc 100644
> --- a/target/loongarch/cpu.h
> +++ b/target/loongarch/cpu.h
> @@ -387,11 +387,7 @@ typedef struct CPUArchState {
>   #endif
>   
>       AddressSpace *address_space_iocsr;
> -    bool load_elf;
> -    uint64_t elf_address;
>       uint32_t mp_state;
> -
> -    struct loongarch_boot_info *boot_info;
>   #endif
>   } CPULoongArchState;
>