* [PATCH 0/2] hw/core: Don't dump incompletely reset cpu
@ 2025-08-27 5:38 Richard Henderson
2025-08-27 5:38 ` [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase Richard Henderson
2025-08-27 5:38 ` [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit Richard Henderson
0 siblings, 2 replies; 7+ messages in thread
From: Richard Henderson @ 2025-08-27 5:38 UTC (permalink / raw)
To: qemu-devel
The start of CPUState reset.hold happens before any subclasses,
which can result in attempting to dump uninitialized data.
In the case of Sparc, this will SIGSEGV.
r~
Richard Henderson (2):
hw/core: Dump cpu_reset in the reset.exit phase
hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit
hw/core/cpu-common.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase
2025-08-27 5:38 [PATCH 0/2] hw/core: Don't dump incompletely reset cpu Richard Henderson
@ 2025-08-27 5:38 ` Richard Henderson
2025-08-28 15:24 ` Peter Maydell
2025-08-27 5:38 ` [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit Richard Henderson
1 sibling, 1 reply; 7+ messages in thread
From: Richard Henderson @ 2025-08-27 5:38 UTC (permalink / raw)
To: qemu-devel; +Cc: Henk van der Laak
During reset.hold, the cpu is in an inconsistent state,
where the leaf class has not had a chance to initialize
state at all.
This is visible as a SIGSEGV in "qemu-system-sparc64 -d cpu_reset".
Move the dump to the exit phase, where all initialization
is certain to be complete.
Reported-by: Henk van der Laak <henk@laaksoft.nl>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
hw/core/cpu-common.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index 39e674aca2..26321be785 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -119,11 +119,6 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
{
CPUState *cpu = CPU(obj);
- if (qemu_loglevel_mask(CPU_LOG_RESET)) {
- qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
- log_cpu_state(cpu, cpu->cc->reset_dump_flags);
- }
-
cpu->interrupt_request = 0;
cpu->halted = cpu->start_powered_off;
cpu->mem_io_pc = 0;
@@ -137,6 +132,16 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
cpu_exec_reset_hold(cpu);
}
+static void cpu_common_reset_exit(Object *obj, ResetType type)
+{
+ if (qemu_loglevel_mask(CPU_LOG_RESET)) {
+ CPUState *cpu = CPU(obj);
+
+ qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
+ log_cpu_state(cpu, cpu->cc->reset_dump_flags);
+ }
+}
+
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
{
ObjectClass *oc;
@@ -380,6 +385,7 @@ static void cpu_common_class_init(ObjectClass *klass, const void *data)
dc->realize = cpu_common_realizefn;
dc->unrealize = cpu_common_unrealizefn;
rc->phases.hold = cpu_common_reset_hold;
+ rc->phases.exit = cpu_common_reset_exit;
cpu_class_init_props(dc);
/*
* Reason: CPUs still need special care by board code: wiring up
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit
2025-08-27 5:38 [PATCH 0/2] hw/core: Don't dump incompletely reset cpu Richard Henderson
2025-08-27 5:38 ` [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase Richard Henderson
@ 2025-08-27 5:38 ` Richard Henderson
2025-08-28 15:29 ` Peter Maydell
2025-08-28 21:55 ` Philippe Mathieu-Daudé
1 sibling, 2 replies; 7+ messages in thread
From: Richard Henderson @ 2025-08-27 5:38 UTC (permalink / raw)
To: qemu-devel
Ensure that the "CPU Reset" message won't be separated
from the cpu_dump_state output.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
hw/core/cpu-common.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index 26321be785..259cf2a3c3 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -135,10 +135,15 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
static void cpu_common_reset_exit(Object *obj, ResetType type)
{
if (qemu_loglevel_mask(CPU_LOG_RESET)) {
- CPUState *cpu = CPU(obj);
+ FILE *f = qemu_log_trylock();
- qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
- log_cpu_state(cpu, cpu->cc->reset_dump_flags);
+ if (f) {
+ CPUState *cpu = CPU(obj);
+
+ fprintf(f, "CPU Reset (CPU %d)\n", cpu->cpu_index);
+ cpu_dump_state(cpu, f, cpu->cc->reset_dump_flags);
+ qemu_log_unlock(f);
+ }
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase
2025-08-27 5:38 ` [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase Richard Henderson
@ 2025-08-28 15:24 ` Peter Maydell
2025-08-28 21:57 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 7+ messages in thread
From: Peter Maydell @ 2025-08-28 15:24 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, Henk van der Laak
On Wed, 27 Aug 2025 at 06:39, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> During reset.hold, the cpu is in an inconsistent state,
> where the leaf class has not had a chance to initialize
> state at all.
>
> This is visible as a SIGSEGV in "qemu-system-sparc64 -d cpu_reset".
>
> Move the dump to the exit phase, where all initialization
> is certain to be complete.
>
> Reported-by: Henk van der Laak <henk@laaksoft.nl>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> hw/core/cpu-common.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
> index 39e674aca2..26321be785 100644
> --- a/hw/core/cpu-common.c
> +++ b/hw/core/cpu-common.c
> @@ -119,11 +119,6 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
> {
> CPUState *cpu = CPU(obj);
>
> - if (qemu_loglevel_mask(CPU_LOG_RESET)) {
> - qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
> - log_cpu_state(cpu, cpu->cc->reset_dump_flags);
> - }
> -
> cpu->interrupt_request = 0;
> cpu->halted = cpu->start_powered_off;
> cpu->mem_io_pc = 0;
> @@ -137,6 +132,16 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
> cpu_exec_reset_hold(cpu);
> }
>
> +static void cpu_common_reset_exit(Object *obj, ResetType type)
> +{
> + if (qemu_loglevel_mask(CPU_LOG_RESET)) {
> + CPUState *cpu = CPU(obj);
> +
> + qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
> + log_cpu_state(cpu, cpu->cc->reset_dump_flags);
> + }
> +}
> +
> ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
> {
> ObjectClass *oc;
> @@ -380,6 +385,7 @@ static void cpu_common_class_init(ObjectClass *klass, const void *data)
> dc->realize = cpu_common_realizefn;
> dc->unrealize = cpu_common_unrealizefn;
> rc->phases.hold = cpu_common_reset_hold;
> + rc->phases.exit = cpu_common_reset_exit;
> cpu_class_init_props(dc);
> /*
> * Reason: CPUs still need special care by board code: wiring up
If we ever have CPUs that actually update their state in
the reset exit phase (e.g. if we manage to complete the refactoring
that would let us implement M-profile "load starting PC and SP
from memory" in reset-exit after rom blob loading rather than
having a hack to do it in reset-hold), this won't capture that.
But it's clearly better than trying to do it in the common
reset-hold method...
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit
2025-08-27 5:38 ` [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit Richard Henderson
@ 2025-08-28 15:29 ` Peter Maydell
2025-08-28 21:55 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 7+ messages in thread
From: Peter Maydell @ 2025-08-28 15:29 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel
On Wed, 27 Aug 2025 at 06:39, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Ensure that the "CPU Reset" message won't be separated
> from the cpu_dump_state output.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> hw/core/cpu-common.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
> index 26321be785..259cf2a3c3 100644
> --- a/hw/core/cpu-common.c
> +++ b/hw/core/cpu-common.c
> @@ -135,10 +135,15 @@ static void cpu_common_reset_hold(Object *obj, ResetType type)
> static void cpu_common_reset_exit(Object *obj, ResetType type)
> {
> if (qemu_loglevel_mask(CPU_LOG_RESET)) {
> - CPUState *cpu = CPU(obj);
> + FILE *f = qemu_log_trylock();
>
> - qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index);
> - log_cpu_state(cpu, cpu->cc->reset_dump_flags);
> + if (f) {
> + CPUState *cpu = CPU(obj);
> +
> + fprintf(f, "CPU Reset (CPU %d)\n", cpu->cpu_index);
> + cpu_dump_state(cpu, f, cpu->cc->reset_dump_flags);
> + qemu_log_unlock(f);
> + }
> }
> }
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit
2025-08-27 5:38 ` [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit Richard Henderson
2025-08-28 15:29 ` Peter Maydell
@ 2025-08-28 21:55 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-08-28 21:55 UTC (permalink / raw)
To: Richard Henderson, qemu-devel
On 27/8/25 07:38, Richard Henderson wrote:
> Ensure that the "CPU Reset" message won't be separated
> from the cpu_dump_state output.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> hw/core/cpu-common.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase
2025-08-28 15:24 ` Peter Maydell
@ 2025-08-28 21:57 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-08-28 21:57 UTC (permalink / raw)
To: Peter Maydell, Richard Henderson; +Cc: qemu-devel, Henk van der Laak
On 28/8/25 17:24, Peter Maydell wrote:
> On Wed, 27 Aug 2025 at 06:39, Richard Henderson
> <richard.henderson@linaro.org> wrote:
>>
>> During reset.hold, the cpu is in an inconsistent state,
>> where the leaf class has not had a chance to initialize
>> state at all.
>>
>> This is visible as a SIGSEGV in "qemu-system-sparc64 -d cpu_reset".
>>
>> Move the dump to the exit phase, where all initialization
>> is certain to be complete.
>>
>> Reported-by: Henk van der Laak <henk@laaksoft.nl>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>> hw/core/cpu-common.c | 16 +++++++++++-----
>> 1 file changed, 11 insertions(+), 5 deletions(-)
>> @@ -380,6 +385,7 @@ static void cpu_common_class_init(ObjectClass *klass, const void *data)
>> dc->realize = cpu_common_realizefn;
>> dc->unrealize = cpu_common_unrealizefn;
>> rc->phases.hold = cpu_common_reset_hold;
>> + rc->phases.exit = cpu_common_reset_exit;
>> cpu_class_init_props(dc);
>> /*
>> * Reason: CPUs still need special care by board code: wiring up
>
> If we ever have CPUs that actually update their state in
> the reset exit phase (e.g. if we manage to complete the refactoring
> that would let us implement M-profile "load starting PC and SP
> from memory" in reset-exit after rom blob loading rather than
> having a hack to do it in reset-hold), this won't capture that.
> But it's clearly better than trying to do it in the common
> reset-hold method...
>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-08-30 17:16 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-27 5:38 [PATCH 0/2] hw/core: Don't dump incompletely reset cpu Richard Henderson
2025-08-27 5:38 ` [PATCH 1/2] hw/core: Dump cpu_reset in the reset.exit phase Richard Henderson
2025-08-28 15:24 ` Peter Maydell
2025-08-28 21:57 ` Philippe Mathieu-Daudé
2025-08-27 5:38 ` [PATCH 2/2] hw/core: Use qemu_log_trylock/unlock in cpu_common_reset_exit Richard Henderson
2025-08-28 15:29 ` Peter Maydell
2025-08-28 21:55 ` Philippe Mathieu-Daudé
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).