qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC] AVR watchdog


From: Philippe Mathieu-Daudé
Subject: Re: [RFC] AVR watchdog
Date: Thu, 29 Apr 2021 08:44:57 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1

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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]