qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/3] Register reset interface with hot-add CPUs
@ 2025-09-06  7:01 Bibo Mao
  2025-09-06  7:01 ` [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Bibo Mao @ 2025-09-06  7:01 UTC (permalink / raw)
  To: Song Gao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

With cpu hotplug is implemented on LoongArch virt machine, reset
interface with hot-added CPU should be registered. Otherwise there
will be problem if system reboots after cpu is hot-added.

Also there is cleanup when system directly boot from Linux kernel image,
both BSP and APs boots from aux boot code, so that special reset
callback with BSP is not necessary.

---
v3 ... v4:
  1. Register CPU reset interface in CPU hotplug callback rather than
     CPU object realize stage.

v2 ... v3:
  1. Add BSP core boot support from aux boot code.
  2. Remove unnecessay pre-boot setting with BSP core.
  3. Use qemu_register_resettable() API rather than legacy API
     qemu_register_reset() to register reset interface.

v1 ... v2:
  1. Add qemu_unregister_reset() in function loongarch_cpu_unrealizefn(),
     remove reset callback if vCPU is unrealized.
---

Bibo Mao (3):
  hw/loongarch/virt: Add BSP support with aux boot code
  hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
  hw/loongarch/virt: Register reset interface with cpu plug callback

 hw/loongarch/boot.c    | 71 ++++++++++++++++++++----------------------
 hw/loongarch/virt.c    |  2 ++
 target/loongarch/cpu.h |  4 ---
 3 files changed, 36 insertions(+), 41 deletions(-)


base-commit: baa79455fa92984ff0f4b9ae94bed66823177a27
-- 
2.39.3



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code
  2025-09-06  7:01 [PATCH v4 0/3] Register reset interface with hot-add CPUs Bibo Mao
@ 2025-09-06  7:01 ` Bibo Mao
  2025-09-10  2:13   ` gaosong
  2025-09-06  7:01 ` [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
  2025-09-06  7:02 ` [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback Bibo Mao
  2 siblings, 1 reply; 7+ messages in thread
From: Bibo Mao @ 2025-09-06  7:01 UTC (permalink / raw)
  To: Song Gao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

If system boots directly from Linux kernel, BSP core jumps to kernel
entry of Linux kernel image and other APs jump to aux boot code. Instead
BSP and APs can all jump to aux boot code like UEFI bios.

With aux boot code, BSP core is judged from physical cpu id, whose
cpu id is 0. With BSP core, load data to register A0-A2 and PC.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/boot.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index 14d6c52d4e..4962668e5a 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -35,13 +35,19 @@ struct loongarch_linux_hdr {
     uint32_t pe_header_offset;
 } QEMU_PACKED;
 
-static const unsigned int slave_boot_code[] = {
+static const unsigned int aux_boot_code[] = {
                   /* Configure reset ebase.                    */
     0x0400302c,   /* csrwr      $t0, LOONGARCH_CSR_EENTRY      */
 
                   /* Disable interrupt.                        */
     0x0380100c,   /* ori        $t0, $zero,0x4                 */
     0x04000180,   /* csrxchg    $zero, $t0, LOONGARCH_CSR_CRMD */
+    0x03400000,   /* nop                                       */
+
+    0x0400800c,   /* csrrd      $t0, LOONGARCH_CSR_CPUNUM      */
+    0x034ffd8c,   /* andi       $t0, $t0, 0x3ff                */
+    0x0015000d,   /* move       $t1, $zero                     */
+    0x5800718d,   /* beq        $t0, $t1, 112                  */
 
                   /* Clear mailbox.                            */
     0x1400002d,   /* lu12i.w    $t1, 1(0x1)                    */
@@ -81,6 +87,26 @@ static const unsigned int slave_boot_code[] = {
     0x06480dac,   /* iocsrrd.d  $t0, $t1                       */
     0x00150181,   /* move       $ra, $t0                       */
     0x4c000020,   /* jirl       $zero, $ra,0                   */
+                  /* BSP Core                                  */
+    0x03400000,   /* nop                                       */
+    0x1800000d,   /* pcaddi     $t1, 0                         */
+    0x28c0a1a4,   /* ld.d       $a0, $t1, 40                   */
+    0x1800000d,   /* pcaddi     $t1, 0                         */
+    0x28c0a1a5,   /* ld.d       $a1, $t1, 40                   */
+    0x1800000d,   /* pcaddi     $t1, 0                         */
+    0x28c0a1a6,   /* ld.d       $a2, $t1, 40                   */
+    0x1800000d,   /* pcaddi     $t1, 0                         */
+    0x28c0a1ac,   /* ld.d       $t0, $t1, 40                   */
+    0x00150181,   /* move       $ra, $t0                       */
+    0x4c000020,   /* jirl       $zero, $ra,0                   */
+    0x00000000,   /* .dword 0   A0                             */
+    0x00000000,
+    0x00000000,   /* .dword 0   A1                             */
+    0x00000000,
+    0x00000000,   /* .dword 0   A2                             */
+    0x00000000,
+    0x00000000,   /* .dword 0   PC                             */
+    0x00000000,
 };
 
 static inline void *guidcpy(void *dst, const void *src)
@@ -391,6 +417,7 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
     int64_t kernel_addr = VIRT_FLASH0_BASE;
     LoongArchCPU *lacpu;
     CPUState *cs;
+    uint64_t *data;
 
     if (info->kernel_filename) {
         kernel_addr = load_kernel_info(info);
@@ -408,7 +435,12 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
 
     /* Load slave boot code at pflash0 . */
     void *boot_code = g_malloc0(VIRT_FLASH0_SIZE);
-    memcpy(boot_code, &slave_boot_code, sizeof(slave_boot_code));
+    memcpy(boot_code, &aux_boot_code, sizeof(aux_boot_code));
+    data = (uint64_t *)(boot_code + sizeof(aux_boot_code));
+    *(data - 4) = cpu_to_le64(info->a0);
+    *(data - 3) = cpu_to_le64(info->a1);
+    *(data - 2) = cpu_to_le64(info->a2);
+    *(data - 1) = cpu_to_le64(kernel_addr);
     rom_add_blob_fixed("boot_code", boot_code, VIRT_FLASH0_SIZE, VIRT_FLASH0_BASE);
 
     CPU_FOREACH(cs) {
-- 
2.39.3



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
  2025-09-06  7:01 [PATCH v4 0/3] Register reset interface with hot-add CPUs Bibo Mao
  2025-09-06  7:01 ` [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
@ 2025-09-06  7:01 ` Bibo Mao
  2025-09-10  2:27   ` gaosong
  2025-09-06  7:02 ` [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback Bibo Mao
  2 siblings, 1 reply; 7+ messages in thread
From: Bibo Mao @ 2025-09-06  7:01 UTC (permalink / raw)
  To: Song Gao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

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



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback
  2025-09-06  7:01 [PATCH v4 0/3] Register reset interface with hot-add CPUs Bibo Mao
  2025-09-06  7:01 ` [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
  2025-09-06  7:01 ` [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
@ 2025-09-06  7:02 ` Bibo Mao
  2025-09-10  2:28   ` gaosong
  2 siblings, 1 reply; 7+ messages in thread
From: Bibo Mao @ 2025-09-06  7:02 UTC (permalink / raw)
  To: Song Gao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

With cpu hotplug is implemented on LoongArch virt machine, reset
interface with hot-added CPU should be registered. Otherwise there
will be problem if system reboots after cpu is hot-added.

Now register reset interface with CPU plug callback, so that all
cold/hot added CPUs let their reset interface registered. And remove
reset interface with CPU unplug callback.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/loongarch/boot.c | 13 -------------
 hw/loongarch/virt.c |  2 ++
 2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
index 5799b4c75c..a516415822 100644
--- a/hw/loongarch/boot.c
+++ b/hw/loongarch/boot.c
@@ -350,13 +350,6 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
     return kernel_entry;
 }
 
-static void reset_load_elf(void *opaque)
-{
-    LoongArchCPU *cpu = opaque;
-
-    cpu_reset(CPU(cpu));
-}
-
 static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
                                    FWCfgState *fw_cfg)
 {
@@ -439,12 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
 void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
 {
     LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
-    int i;
-
-    /* register reset function */
-    for (i = 0; i < ms->smp.cpus; i++) {
-        qemu_register_reset(reset_load_elf, LOONGARCH_CPU(qemu_get_cpu(i)));
-    }
 
     info->kernel_filename = ms->kernel_filename;
     info->kernel_cmdline = ms->kernel_cmdline;
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 31215b7785..bd5cff1f1e 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -1014,6 +1014,7 @@ static void virt_cpu_unplug(HotplugHandler *hotplug_dev,
     /* Notify acpi ged CPU removed */
     hotplug_handler_unplug(HOTPLUG_HANDLER(lvms->acpi_ged), dev, &error_abort);
 
+    qemu_unregister_resettable(OBJECT(dev));
     cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
     cpu_slot->cpu = NULL;
 }
@@ -1038,6 +1039,7 @@ static void virt_cpu_plug(HotplugHandler *hotplug_dev,
                              &error_abort);
     }
 
+    qemu_register_resettable(OBJECT(dev));
     cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
     cpu_slot->cpu = CPU(dev);
 }
-- 
2.39.3



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code
  2025-09-06  7:01 ` [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
@ 2025-09-10  2:13   ` gaosong
  0 siblings, 0 replies; 7+ messages in thread
From: gaosong @ 2025-09-10  2:13 UTC (permalink / raw)
  To: Bibo Mao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

在 2025/9/6 下午3:01, Bibo Mao 写道:
> If system boots directly from Linux kernel, BSP core jumps to kernel
> entry of Linux kernel image and other APs jump to aux boot code. Instead
> BSP and APs can all jump to aux boot code like UEFI bios.
>
> With aux boot code, BSP core is judged from physical cpu id, whose
> cpu id is 0. With BSP core, load data to register A0-A2 and PC.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   hw/loongarch/boot.c | 36 ++++++++++++++++++++++++++++++++++--
>   1 file changed, 34 insertions(+), 2 deletions(-)
Reviewed-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
> index 14d6c52d4e..4962668e5a 100644
> --- a/hw/loongarch/boot.c
> +++ b/hw/loongarch/boot.c
> @@ -35,13 +35,19 @@ struct loongarch_linux_hdr {
>       uint32_t pe_header_offset;
>   } QEMU_PACKED;
>   
> -static const unsigned int slave_boot_code[] = {
> +static const unsigned int aux_boot_code[] = {
>                     /* Configure reset ebase.                    */
>       0x0400302c,   /* csrwr      $t0, LOONGARCH_CSR_EENTRY      */
>   
>                     /* Disable interrupt.                        */
>       0x0380100c,   /* ori        $t0, $zero,0x4                 */
>       0x04000180,   /* csrxchg    $zero, $t0, LOONGARCH_CSR_CRMD */
> +    0x03400000,   /* nop                                       */
> +
> +    0x0400800c,   /* csrrd      $t0, LOONGARCH_CSR_CPUNUM      */
> +    0x034ffd8c,   /* andi       $t0, $t0, 0x3ff                */
> +    0x0015000d,   /* move       $t1, $zero                     */
> +    0x5800718d,   /* beq        $t0, $t1, 112                  */
>   
>                     /* Clear mailbox.                            */
>       0x1400002d,   /* lu12i.w    $t1, 1(0x1)                    */
> @@ -81,6 +87,26 @@ static const unsigned int slave_boot_code[] = {
>       0x06480dac,   /* iocsrrd.d  $t0, $t1                       */
>       0x00150181,   /* move       $ra, $t0                       */
>       0x4c000020,   /* jirl       $zero, $ra,0                   */
> +                  /* BSP Core                                  */
> +    0x03400000,   /* nop                                       */
> +    0x1800000d,   /* pcaddi     $t1, 0                         */
> +    0x28c0a1a4,   /* ld.d       $a0, $t1, 40                   */
> +    0x1800000d,   /* pcaddi     $t1, 0                         */
> +    0x28c0a1a5,   /* ld.d       $a1, $t1, 40                   */
> +    0x1800000d,   /* pcaddi     $t1, 0                         */
> +    0x28c0a1a6,   /* ld.d       $a2, $t1, 40                   */
> +    0x1800000d,   /* pcaddi     $t1, 0                         */
> +    0x28c0a1ac,   /* ld.d       $t0, $t1, 40                   */
> +    0x00150181,   /* move       $ra, $t0                       */
> +    0x4c000020,   /* jirl       $zero, $ra,0                   */
> +    0x00000000,   /* .dword 0   A0                             */
> +    0x00000000,
> +    0x00000000,   /* .dword 0   A1                             */
> +    0x00000000,
> +    0x00000000,   /* .dword 0   A2                             */
> +    0x00000000,
> +    0x00000000,   /* .dword 0   PC                             */
> +    0x00000000,
>   };
>   
>   static inline void *guidcpy(void *dst, const void *src)
> @@ -391,6 +417,7 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
>       int64_t kernel_addr = VIRT_FLASH0_BASE;
>       LoongArchCPU *lacpu;
>       CPUState *cs;
> +    uint64_t *data;
>   
>       if (info->kernel_filename) {
>           kernel_addr = load_kernel_info(info);
> @@ -408,7 +435,12 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
>   
>       /* Load slave boot code at pflash0 . */
>       void *boot_code = g_malloc0(VIRT_FLASH0_SIZE);
> -    memcpy(boot_code, &slave_boot_code, sizeof(slave_boot_code));
> +    memcpy(boot_code, &aux_boot_code, sizeof(aux_boot_code));
> +    data = (uint64_t *)(boot_code + sizeof(aux_boot_code));
> +    *(data - 4) = cpu_to_le64(info->a0);
> +    *(data - 3) = cpu_to_le64(info->a1);
> +    *(data - 2) = cpu_to_le64(info->a2);
> +    *(data - 1) = cpu_to_le64(kernel_addr);
>       rom_add_blob_fixed("boot_code", boot_code, VIRT_FLASH0_SIZE, VIRT_FLASH0_BASE);
>   
>       CPU_FOREACH(cs) {



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
  2025-09-06  7:01 ` [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
@ 2025-09-10  2:27   ` gaosong
  0 siblings, 0 replies; 7+ messages in thread
From: gaosong @ 2025-09-10  2:27 UTC (permalink / raw)
  To: Bibo Mao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

在 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;
>   



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback
  2025-09-06  7:02 ` [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback Bibo Mao
@ 2025-09-10  2:28   ` gaosong
  0 siblings, 0 replies; 7+ messages in thread
From: gaosong @ 2025-09-10  2:28 UTC (permalink / raw)
  To: Bibo Mao
  Cc: Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	Igor Mammedov, qemu-devel

在 2025/9/6 下午3:02, Bibo Mao 写道:
> With cpu hotplug is implemented on LoongArch virt machine, reset
> interface with hot-added CPU should be registered. Otherwise there
> will be problem if system reboots after cpu is hot-added.
>
> Now register reset interface with CPU plug callback, so that all
> cold/hot added CPUs let their reset interface registered. And remove
> reset interface with CPU unplug callback.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> ---
>   hw/loongarch/boot.c | 13 -------------
>   hw/loongarch/virt.c |  2 ++
>   2 files changed, 2 insertions(+), 13 deletions(-)
Tested-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
> index 5799b4c75c..a516415822 100644
> --- a/hw/loongarch/boot.c
> +++ b/hw/loongarch/boot.c
> @@ -350,13 +350,6 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info)
>       return kernel_entry;
>   }
>   
> -static void reset_load_elf(void *opaque)
> -{
> -    LoongArchCPU *cpu = opaque;
> -
> -    cpu_reset(CPU(cpu));
> -}
> -
>   static void fw_cfg_add_kernel_info(struct loongarch_boot_info *info,
>                                      FWCfgState *fw_cfg)
>   {
> @@ -439,12 +432,6 @@ static void loongarch_direct_kernel_boot(MachineState *ms,
>   void loongarch_load_kernel(MachineState *ms, struct loongarch_boot_info *info)
>   {
>       LoongArchVirtMachineState *lvms = LOONGARCH_VIRT_MACHINE(ms);
> -    int i;
> -
> -    /* register reset function */
> -    for (i = 0; i < ms->smp.cpus; i++) {
> -        qemu_register_reset(reset_load_elf, LOONGARCH_CPU(qemu_get_cpu(i)));
> -    }
>   
>       info->kernel_filename = ms->kernel_filename;
>       info->kernel_cmdline = ms->kernel_cmdline;
> diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
> index 31215b7785..bd5cff1f1e 100644
> --- a/hw/loongarch/virt.c
> +++ b/hw/loongarch/virt.c
> @@ -1014,6 +1014,7 @@ static void virt_cpu_unplug(HotplugHandler *hotplug_dev,
>       /* Notify acpi ged CPU removed */
>       hotplug_handler_unplug(HOTPLUG_HANDLER(lvms->acpi_ged), dev, &error_abort);
>   
> +    qemu_unregister_resettable(OBJECT(dev));
>       cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
>       cpu_slot->cpu = NULL;
>   }
> @@ -1038,6 +1039,7 @@ static void virt_cpu_plug(HotplugHandler *hotplug_dev,
>                                &error_abort);
>       }
>   
> +    qemu_register_resettable(OBJECT(dev));
>       cpu_slot = virt_find_cpu_slot(MACHINE(lvms), cpu->phy_id);
>       cpu_slot->cpu = CPU(dev);
>   }



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-09-10  2:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-06  7:01 [PATCH v4 0/3] Register reset interface with hot-add CPUs Bibo Mao
2025-09-06  7:01 ` [PATCH v4 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
2025-09-10  2:13   ` gaosong
2025-09-06  7:01 ` [PATCH v4 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
2025-09-10  2:27   ` gaosong
2025-09-06  7:02 ` [PATCH v4 3/3] hw/loongarch/virt: Register reset interface with cpu plug callback Bibo Mao
2025-09-10  2:28   ` gaosong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).