Running the WDR opcode triggers a segfault:
$ cat > foo.S << EOF
> __start:
> wdr
> EOF
$ avr-gcc -nostdlib -nostartfiles -mmcu=avr6 foo.S -o foo.elf
$ qemu-system-avr -serial mon:stdio -nographic -no-reboot \
-M mega -bios foo.elf -d in_asm --singlestep
IN:
0x00000000: WDR
Segmentation fault (core dumped)
(gdb) bt
#0 0x00005555add0b23a in gdb_get_cpu_pid (cpu=0x5555af5a4af0) at ../gdbstub.c:718
#1 0x00005555add0b2dd in gdb_get_cpu_process (cpu=0x5555af5a4af0) at ../gdbstub.c:743
#2 0x00005555add0e477 in gdb_set_stop_cpu (cpu=0x5555af5a4af0) at ../gdbstub.c:2742
#3 0x00005555adc99b96 in cpu_handle_guest_debug (cpu=0x5555af5a4af0) at ../softmmu/cpus.c:306
#4 0x00005555adcc66ab in rr_cpu_thread_fn (arg=0x5555af5a4af0) at ../accel/tcg/tcg-accel-ops-rr.c:224
#5 0x00005555adefaf12 in qemu_thread_start (args=0x5555af5d9870) at ../util/qemu-thread-posix.c:521
#6 0x00007f692d940ea5 in start_thread () from /lib64/libpthread.so.0
#7 0x00007f692d6699fd in clone () from /lib64/libc.so.6
Since the watchdog peripheral is not implemented, simply
log the opcode as unimplemented and keep going.
Reported-by: Fred Konrad <konrad@adacore.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
target/avr/helper.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/target/avr/helper.c b/target/avr/helper.c
index 35e10195940..981c29da453 100644
--- a/target/avr/helper.c
+++ b/target/avr/helper.c
@@ -188,11 +188,7 @@ void helper_break(CPUAVRState *env)
void helper_wdr(CPUAVRState *env)
{
- CPUState *cs = env_cpu(env);
-
- /* WD is not implemented yet, placeholder */
- cs->exception_index = EXCP_DEBUG;
- cpu_loop_exit(cs);
+ qemu_log_mask(LOG_UNIMP, "WDG reset (not implemented)\n");
}
/*
--
2.26.3
Le 5/2/21 à 9:09 PM, Philippe Mathieu-Daudé a écrit :
> Running the WDR opcode triggers a segfault:
>
> $ cat > foo.S << EOF
> > __start:
> > wdr
> > EOF
> $ avr-gcc -nostdlib -nostartfiles -mmcu=avr6 foo.S -o foo.elf
> $ qemu-system-avr -serial mon:stdio -nographic -no-reboot \
> -M mega -bios foo.elf -d in_asm --singlestep
> IN:
> 0x00000000: WDR
> Segmentation fault (core dumped)
>
> (gdb) bt
> #0 0x00005555add0b23a in gdb_get_cpu_pid (cpu=0x5555af5a4af0) at ../gdbstub.c:718
> #1 0x00005555add0b2dd in gdb_get_cpu_process (cpu=0x5555af5a4af0) at ../gdbstub.c:743
> #2 0x00005555add0e477 in gdb_set_stop_cpu (cpu=0x5555af5a4af0) at ../gdbstub.c:2742
> #3 0x00005555adc99b96 in cpu_handle_guest_debug (cpu=0x5555af5a4af0) at ../softmmu/cpus.c:306
> #4 0x00005555adcc66ab in rr_cpu_thread_fn (arg=0x5555af5a4af0) at ../accel/tcg/tcg-accel-ops-rr.c:224
> #5 0x00005555adefaf12 in qemu_thread_start (args=0x5555af5d9870) at ../util/qemu-thread-posix.c:521
> #6 0x00007f692d940ea5 in start_thread () from /lib64/libpthread.so.0
> #7 0x00007f692d6699fd in clone () from /lib64/libc.so.6
>
> Since the watchdog peripheral is not implemented, simply
> log the opcode as unimplemented and keep going.
>
> Reported-by: Fred Konrad <konrad@adacore.com>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> target/avr/helper.c | 6 +-----
> 1 file changed, 1 insertion(+), 5 deletions(-)
>
> diff --git a/target/avr/helper.c b/target/avr/helper.c
> index 35e10195940..981c29da453 100644
> --- a/target/avr/helper.c
> +++ b/target/avr/helper.c
> @@ -188,11 +188,7 @@ void helper_break(CPUAVRState *env)
>
> void helper_wdr(CPUAVRState *env)
> {
> - CPUState *cs = env_cpu(env);
> -
> - /* WD is not implemented yet, placeholder */
> - cs->exception_index = EXCP_DEBUG;
> - cpu_loop_exit(cs);
> + qemu_log_mask(LOG_UNIMP, "WDG reset (not implemented)\n");
> }
Seems ok to me, at least better than having a segfault.
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
>
> /*
>
Cc'ing qemu-trivial@
On 5/5/21 3:35 PM, Fred Konrad wrote:
> Le 5/2/21 à 9:09 PM, Philippe Mathieu-Daudé a écrit :
>> Running the WDR opcode triggers a segfault:
>>
>> $ cat > foo.S << EOF
>> > __start:
>> > wdr
>> > EOF
>> $ avr-gcc -nostdlib -nostartfiles -mmcu=avr6 foo.S -o foo.elf
>> $ qemu-system-avr -serial mon:stdio -nographic -no-reboot \
>> -M mega -bios foo.elf -d in_asm --singlestep
>> IN:
>> 0x00000000: WDR
>> Segmentation fault (core dumped)
>>
>> (gdb) bt
>> #0 0x00005555add0b23a in gdb_get_cpu_pid (cpu=0x5555af5a4af0)
>> at ../gdbstub.c:718
>> #1 0x00005555add0b2dd in gdb_get_cpu_process
>> (cpu=0x5555af5a4af0) at ../gdbstub.c:743
>> #2 0x00005555add0e477 in gdb_set_stop_cpu (cpu=0x5555af5a4af0)
>> at ../gdbstub.c:2742
>> #3 0x00005555adc99b96 in cpu_handle_guest_debug
>> (cpu=0x5555af5a4af0) at ../softmmu/cpus.c:306
>> #4 0x00005555adcc66ab in rr_cpu_thread_fn (arg=0x5555af5a4af0)
>> at ../accel/tcg/tcg-accel-ops-rr.c:224
>> #5 0x00005555adefaf12 in qemu_thread_start
>> (args=0x5555af5d9870) at ../util/qemu-thread-posix.c:521
>> #6 0x00007f692d940ea5 in start_thread () from
>> /lib64/libpthread.so.0
>> #7 0x00007f692d6699fd in clone () from /lib64/libc.so.6
>>
>> Since the watchdog peripheral is not implemented, simply
>> log the opcode as unimplemented and keep going.
>>
>> Reported-by: Fred Konrad <konrad@adacore.com>
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>> target/avr/helper.c | 6 +-----
>> 1 file changed, 1 insertion(+), 5 deletions(-)
>>
>> diff --git a/target/avr/helper.c b/target/avr/helper.c
>> index 35e10195940..981c29da453 100644
>> --- a/target/avr/helper.c
>> +++ b/target/avr/helper.c
>> @@ -188,11 +188,7 @@ void helper_break(CPUAVRState *env)
>> void helper_wdr(CPUAVRState *env)
>> {
>> - CPUState *cs = env_cpu(env);
>> -
>> - /* WD is not implemented yet, placeholder */
>> - cs->exception_index = EXCP_DEBUG;
>> - cpu_loop_exit(cs);
>> + qemu_log_mask(LOG_UNIMP, "WDG reset (not implemented)\n");
>> }
>
> Seems ok to me, at least better than having a segfault.
>
> Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
>
>> /*
>>
>
Le 13/05/2021 à 19:04, Philippe Mathieu-Daudé a écrit :
> Cc'ing qemu-trivial@
Applied to my trivial-patches branch.
Thanks,
Laurent
> On 5/5/21 3:35 PM, Fred Konrad wrote:
>> Le 5/2/21 à 9:09 PM, Philippe Mathieu-Daudé a écrit :
>>> Running the WDR opcode triggers a segfault:
>>>
>>> $ cat > foo.S << EOF
>>> > __start:
>>> > wdr
>>> > EOF
>>> $ avr-gcc -nostdlib -nostartfiles -mmcu=avr6 foo.S -o foo.elf
>>> $ qemu-system-avr -serial mon:stdio -nographic -no-reboot \
>>> -M mega -bios foo.elf -d in_asm --singlestep
>>> IN:
>>> 0x00000000: WDR
>>> Segmentation fault (core dumped)
>>>
>>> (gdb) bt
>>> #0 0x00005555add0b23a in gdb_get_cpu_pid (cpu=0x5555af5a4af0)
>>> at ../gdbstub.c:718
>>> #1 0x00005555add0b2dd in gdb_get_cpu_process
>>> (cpu=0x5555af5a4af0) at ../gdbstub.c:743
>>> #2 0x00005555add0e477 in gdb_set_stop_cpu (cpu=0x5555af5a4af0)
>>> at ../gdbstub.c:2742
>>> #3 0x00005555adc99b96 in cpu_handle_guest_debug
>>> (cpu=0x5555af5a4af0) at ../softmmu/cpus.c:306
>>> #4 0x00005555adcc66ab in rr_cpu_thread_fn (arg=0x5555af5a4af0)
>>> at ../accel/tcg/tcg-accel-ops-rr.c:224
>>> #5 0x00005555adefaf12 in qemu_thread_start
>>> (args=0x5555af5d9870) at ../util/qemu-thread-posix.c:521
>>> #6 0x00007f692d940ea5 in start_thread () from
>>> /lib64/libpthread.so.0
>>> #7 0x00007f692d6699fd in clone () from /lib64/libc.so.6
>>>
>>> Since the watchdog peripheral is not implemented, simply
>>> log the opcode as unimplemented and keep going.
>>>
>>> Reported-by: Fred Konrad <konrad@adacore.com>
>>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>> ---
>>> target/avr/helper.c | 6 +-----
>>> 1 file changed, 1 insertion(+), 5 deletions(-)
>>>
>>> diff --git a/target/avr/helper.c b/target/avr/helper.c
>>> index 35e10195940..981c29da453 100644
>>> --- a/target/avr/helper.c
>>> +++ b/target/avr/helper.c
>>> @@ -188,11 +188,7 @@ void helper_break(CPUAVRState *env)
>>> void helper_wdr(CPUAVRState *env)
>>> {
>>> - CPUState *cs = env_cpu(env);
>>> -
>>> - /* WD is not implemented yet, placeholder */
>>> - cs->exception_index = EXCP_DEBUG;
>>> - cpu_loop_exit(cs);
>>> + qemu_log_mask(LOG_UNIMP, "WDG reset (not implemented)\n");
>>> }
>>
>> Seems ok to me, at least better than having a segfault.
>>
>> Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
>>
>>> /*
>>>
>>
>
© 2016 - 2026 Red Hat, Inc.