[PATCH] target/avr: Ignore unimplemented WDR opcode

Philippe Mathieu-Daudé posted 1 patch 3 years ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210502190900.604292-1-f4bug@amsat.org
target/avr/helper.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
[PATCH] target/avr: Ignore unimplemented WDR opcode
Posted by Philippe Mathieu-Daudé 3 years ago
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

Re: [PATCH] target/avr: Ignore unimplemented WDR opcode
Posted by Fred Konrad 2 years, 12 months ago

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>

>   
>   /*
> 

Re: [PATCH] target/avr: Ignore unimplemented WDR opcode
Posted by Philippe Mathieu-Daudé 2 years, 11 months ago
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>
> 
>>     /*
>>
> 

Re: [PATCH] target/avr: Ignore unimplemented WDR opcode
Posted by Laurent Vivier 2 years, 11 months ago
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>
>>
>>>     /*
>>>
>>
>