All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] Register reset interface with hot-add CPUs
@ 2025-09-03  2:35 Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Bibo Mao @ 2025-09-03  2:35 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.

---
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 object

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


base-commit: 91589bcd9fee0e66b241d04e5f37cd4f218187a2
-- 
2.39.3



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

* [PATCH v3 1/3] hw/loongarch/virt: Add BSP support with aux boot code
  2025-09-03  2:35 [PATCH v3 0/3] Register reset interface with hot-add CPUs Bibo Mao
@ 2025-09-03  2:35 ` Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object Bibo Mao
  2 siblings, 0 replies; 8+ messages in thread
From: Bibo Mao @ 2025-09-03  2:35 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] 8+ messages in thread

* [PATCH v3 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP
  2025-09-03  2:35 [PATCH v3 0/3] Register reset interface with hot-add CPUs Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
@ 2025-09-03  2:35 ` Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object Bibo Mao
  2 siblings, 0 replies; 8+ messages in thread
From: Bibo Mao @ 2025-09-03  2:35 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 9538e8d61d..7648f94584 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] 8+ messages in thread

* [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object
  2025-09-03  2:35 [PATCH v3 0/3] Register reset interface with hot-add CPUs Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
  2025-09-03  2:35 ` [PATCH v3 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
@ 2025-09-03  2:35 ` Bibo Mao
  2025-09-04  8:13   ` Igor Mammedov
  2 siblings, 1 reply; 8+ messages in thread
From: Bibo Mao @ 2025-09-03  2:35 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 object is realized and remove
the reset interface with CPU object unrealizd.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 hw/loongarch/boot.c    | 13 -------------
 target/loongarch/cpu.c |  4 ++++
 2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
index 3a7621c0ea..9edb8ebc4d 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
 
     qemu_init_vcpu(cs);
     cpu_reset(cs);
+ #ifndef CONFIG_USER_ONLY
+    qemu_register_resettable(OBJECT(dev));
+ #endif
 
     lacc->parent_realize(dev, errp);
 }
@@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
 
 #ifndef CONFIG_USER_ONLY
     cpu_remove_sync(CPU(dev));
+    qemu_unregister_resettable(OBJECT(dev));
 #endif
 
     lacc->parent_unrealize(dev);
-- 
2.39.3



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

* Re: [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object
  2025-09-03  2:35 ` [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object Bibo Mao
@ 2025-09-04  8:13   ` Igor Mammedov
  2025-09-04 11:55     ` Bibo Mao
  0 siblings, 1 reply; 8+ messages in thread
From: Igor Mammedov @ 2025-09-04  8:13 UTC (permalink / raw)
  To: Bibo Mao
  Cc: Song Gao, Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	qemu-devel

On Wed,  3 Sep 2025 10:35:56 +0800
Bibo Mao <maobibo@loongson.cn> wrote:

> 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 object is realized and remove
> the reset interface with CPU object unrealizd.
> 
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>  hw/loongarch/boot.c    | 13 -------------
>  target/loongarch/cpu.c |  4 ++++
>  2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
> index 3a7621c0ea..9edb8ebc4d 100644
> --- a/target/loongarch/cpu.c
> +++ b/target/loongarch/cpu.c
> @@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
>  
>      qemu_init_vcpu(cs);
>      cpu_reset(cs);
> + #ifndef CONFIG_USER_ONLY
> +    qemu_register_resettable(OBJECT(dev));
> + #endif

I'd put this in virt_cpu_plug() as last step, which should work both for
cold and hotpluged cpus. And drop CONFIG_USER_ONLY while at it.

with that
Reviewed-by: Igor Mammedov <imammedo@redhat.com>

PS:
the rest of the patches are very arch specific so I won't review them.

>  
>      lacc->parent_realize(dev, errp);
>  }
> @@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
>  
>  #ifndef CONFIG_USER_ONLY
>      cpu_remove_sync(CPU(dev));
> +    qemu_unregister_resettable(OBJECT(dev));
>  #endif
>  
>      lacc->parent_unrealize(dev);



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

* Re: [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object
  2025-09-04  8:13   ` Igor Mammedov
@ 2025-09-04 11:55     ` Bibo Mao
  2025-09-04 14:08       ` Igor Mammedov
  0 siblings, 1 reply; 8+ messages in thread
From: Bibo Mao @ 2025-09-04 11:55 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Song Gao, Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	qemu-devel



On 2025/9/4 下午4:13, Igor Mammedov wrote:
> On Wed,  3 Sep 2025 10:35:56 +0800
> Bibo Mao <maobibo@loongson.cn> wrote:
> 
>> 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 object is realized and remove
>> the reset interface with CPU object unrealizd.
>>
>> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
>> ---
>>   hw/loongarch/boot.c    | 13 -------------
>>   target/loongarch/cpu.c |  4 ++++
>>   2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
>> index 3a7621c0ea..9edb8ebc4d 100644
>> --- a/target/loongarch/cpu.c
>> +++ b/target/loongarch/cpu.c
>> @@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
>>   
>>       qemu_init_vcpu(cs);
>>       cpu_reset(cs);
>> + #ifndef CONFIG_USER_ONLY
>> +    qemu_register_resettable(OBJECT(dev));
>> + #endif
> 
> I'd put this in virt_cpu_plug() as last step, which should work both for
> cold and hotpluged cpus. And drop CONFIG_USER_ONLY while at it.
With symmetry is the same with qemu_unregister_resettable() 
Symmetrically, to put it in virt_cpu_unplug()?

If there are many boards in future, the boards do not need to care about 
registering cpu reset interface, which is done in CPU object already.

Regards
Bibo Mao
> 
> with that
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> 
> PS:
> the rest of the patches are very arch specific so I won't review them.
> 
>>   
>>       lacc->parent_realize(dev, errp);
>>   }
>> @@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
>>   
>>   #ifndef CONFIG_USER_ONLY
>>       cpu_remove_sync(CPU(dev));
>> +    qemu_unregister_resettable(OBJECT(dev));
>>   #endif
>>   
>>       lacc->parent_unrealize(dev);
> 



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

* Re: [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object
  2025-09-04 11:55     ` Bibo Mao
@ 2025-09-04 14:08       ` Igor Mammedov
  2025-09-05  0:57         ` Bibo Mao
  0 siblings, 1 reply; 8+ messages in thread
From: Igor Mammedov @ 2025-09-04 14:08 UTC (permalink / raw)
  To: Bibo Mao
  Cc: Song Gao, Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	qemu-devel

On Thu, 4 Sep 2025 19:55:49 +0800
Bibo Mao <maobibo@loongson.cn> wrote:

> On 2025/9/4 下午4:13, Igor Mammedov wrote:
> > On Wed,  3 Sep 2025 10:35:56 +0800
> > Bibo Mao <maobibo@loongson.cn> wrote:
> >   
> >> 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 object is realized and remove
> >> the reset interface with CPU object unrealizd.
> >>
> >> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> >> ---
> >>   hw/loongarch/boot.c    | 13 -------------
> >>   target/loongarch/cpu.c |  4 ++++
> >>   2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
> >> index 3a7621c0ea..9edb8ebc4d 100644
> >> --- a/target/loongarch/cpu.c
> >> +++ b/target/loongarch/cpu.c
> >> @@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
> >>   
> >>       qemu_init_vcpu(cs);
> >>       cpu_reset(cs);
> >> + #ifndef CONFIG_USER_ONLY
> >> +    qemu_register_resettable(OBJECT(dev));
> >> + #endif  
> > 
> > I'd put this in virt_cpu_plug() as last step, which should work both for
> > cold and hotpluged cpus. And drop CONFIG_USER_ONLY while at it.  
> With symmetry is the same with qemu_unregister_resettable() 
> Symmetrically, to put it in virt_cpu_unplug()?

yep

> 
> If there are many boards in future, the boards do not need to care about 
> registering cpu reset interface, which is done in CPU object already.

lets worry about more boards when that arrives.
that said, yanking reset pin on CPU is usually the board/firmware responsibility.

PS:
we have reset registered in realizefn() across QEMU, largely due to historical reasons.

> 
> Regards
> Bibo Mao
> > 
> > with that
> > Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> > 
> > PS:
> > the rest of the patches are very arch specific so I won't review them.
> >   
> >>   
> >>       lacc->parent_realize(dev, errp);
> >>   }
> >> @@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
> >>   
> >>   #ifndef CONFIG_USER_ONLY
> >>       cpu_remove_sync(CPU(dev));
> >> +    qemu_unregister_resettable(OBJECT(dev));
> >>   #endif
> >>   
> >>       lacc->parent_unrealize(dev);  
> >   
> 



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

* Re: [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object
  2025-09-04 14:08       ` Igor Mammedov
@ 2025-09-05  0:57         ` Bibo Mao
  0 siblings, 0 replies; 8+ messages in thread
From: Bibo Mao @ 2025-09-05  0:57 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Song Gao, Philippe Mathieu-Daudé, Peter Maydell, Xianglai Li,
	qemu-devel



On 2025/9/4 下午10:08, Igor Mammedov wrote:
> On Thu, 4 Sep 2025 19:55:49 +0800
> Bibo Mao <maobibo@loongson.cn> wrote:
> 
>> On 2025/9/4 下午4:13, Igor Mammedov wrote:
>>> On Wed,  3 Sep 2025 10:35:56 +0800
>>> Bibo Mao <maobibo@loongson.cn> wrote:
>>>    
>>>> 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 object is realized and remove
>>>> the reset interface with CPU object unrealizd.
>>>>
>>>> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
>>>> ---
>>>>    hw/loongarch/boot.c    | 13 -------------
>>>>    target/loongarch/cpu.c |  4 ++++
>>>>    2 files changed, 4 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/target/loongarch/cpu.c b/target/loongarch/cpu.c
>>>> index 3a7621c0ea..9edb8ebc4d 100644
>>>> --- a/target/loongarch/cpu.c
>>>> +++ b/target/loongarch/cpu.c
>>>> @@ -668,6 +668,9 @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
>>>>    
>>>>        qemu_init_vcpu(cs);
>>>>        cpu_reset(cs);
>>>> + #ifndef CONFIG_USER_ONLY
>>>> +    qemu_register_resettable(OBJECT(dev));
>>>> + #endif
>>>
>>> I'd put this in virt_cpu_plug() as last step, which should work both for
>>> cold and hotpluged cpus. And drop CONFIG_USER_ONLY while at it.
>> With symmetry is the same with qemu_unregister_resettable()
>> Symmetrically, to put it in virt_cpu_unplug()?
> 
> yep
Will do in next version.
> 
>>
>> If there are many boards in future, the boards do not need to care about
>> registering cpu reset interface, which is done in CPU object already.
> 
> lets worry about more boards when that arrives.
> that said, yanking reset pin on CPU is usually the board/firmware responsibility.
> 
> PS:
> we have reset registered in realizefn() across QEMU, largely due to historical reasons.
Ok, thanks for your explanation.

Regards
Bibo Mao
> 
>>
>> Regards
>> Bibo Mao
>>>
>>> with that
>>> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
>>>
>>> PS:
>>> the rest of the patches are very arch specific so I won't review them.
>>>    
>>>>    
>>>>        lacc->parent_realize(dev, errp);
>>>>    }
>>>> @@ -678,6 +681,7 @@ static void loongarch_cpu_unrealizefn(DeviceState *dev)
>>>>    
>>>>    #ifndef CONFIG_USER_ONLY
>>>>        cpu_remove_sync(CPU(dev));
>>>> +    qemu_unregister_resettable(OBJECT(dev));
>>>>    #endif
>>>>    
>>>>        lacc->parent_unrealize(dev);
>>>    
>>
> 



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

end of thread, other threads:[~2025-09-05  1:01 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-03  2:35 [PATCH v3 0/3] Register reset interface with hot-add CPUs Bibo Mao
2025-09-03  2:35 ` [PATCH v3 1/3] hw/loongarch/virt: Add BSP support with aux boot code Bibo Mao
2025-09-03  2:35 ` [PATCH v3 2/3] hw/loongarch/virt: Remove unnecessay pre-boot setting with BSP Bibo Mao
2025-09-03  2:35 ` [PATCH v3 3/3] hw/loongarch/virt: Register reset interface with CPU object Bibo Mao
2025-09-04  8:13   ` Igor Mammedov
2025-09-04 11:55     ` Bibo Mao
2025-09-04 14:08       ` Igor Mammedov
2025-09-05  0:57         ` Bibo Mao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.