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 - 2024 Red Hat, Inc.