On 4/28/21 4:17 PM, Fred Konrad wrote: > Hi, > > I fall on a segfault while running the wdr instruction on AVR: > > (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 > > Wondering if there are some plan/on-going work to implement this watchdog? > > --- > > Also meanwhile I though about a workaround like that: > > diff --git a/target/avr/helper.c b/target/avr/helper.c > index 35e1019594..7944ed21f4 100644 > --- a/target/avr/helper.c > +++ b/target/avr/helper.c > @@ -24,6 +24,7 @@ > #include "exec/exec-all.h" > #include "exec/address-spaces.h" > #include "exec/helper-proto.h" > +#include "sysemu/runstate.h" > > bool avr_cpu_exec_interrupt(CPUState *cs, int interrupt_request) > { > @@ -191,7 +192,7 @@ void helper_wdr(CPUAVRState *env) > CPUState *cs = env_cpu(env); > > /* WD is not implemented yet, placeholder */ > - cs->exception_index = EXCP_DEBUG; > + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
Eh, this is the opposite... This opcode kicks the watchdog, it does not trigger it. > cpu_loop_exit(cs); > } > > In the case the guest wants to reset the board through the watchdog, > would that > make sense to swap to that? Why not simply log the opcode and keep going? -- >8 -- 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 @@ -190,7 +190,3 @@ 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, "Watchdog Timer Reset\n"); } --- Regards, Phil.