qemu-stable
[Top][All Lists]
Advanced

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

Re: [PATCH v2] target/m68k: Handle EXCP_SEMIHOSTING for m68k class CPU


From: Alex Bennée
Subject: Re: [PATCH v2] target/m68k: Handle EXCP_SEMIHOSTING for m68k class CPU
Date: Sun, 29 Dec 2024 16:52:10 +0000
User-agent: mu4e 1.12.8; emacs 29.4

BALATON Zoltan <balaton@eik.bme.hu> writes:

> On Sun, 29 Dec 2024, Jiaxun Yang wrote:
>> EXCP_SEMIHOSTING can be generated by m68k class CPU with
>> HALT instruction, but it is never handled properly and cause
>> guest fall into deadlock.
>>
>> Moving EXCE_SEMIHOSTING handling code to common do_interrupt_all
>> routine to ensure it's handled for both CPU classes.
>>
>> Fixes: f161e723fdfd ("target/m68k: Perform the semihosting test during 
>> translate")
>> Cc: qemu-stable@nongnu.org
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> ---
>> Changes in v2:
>> - hoist both calls to do_interrupt_all (Richard)
>> - Link to v1: 
>> 20241229-m68k-semihosting-v1-1-db131e2b5212@flygoat.com">https://lore.kernel.org/r/20241229-m68k-semihosting-v1-1-db131e2b5212@flygoat.com
>> ---
>> target/m68k/op_helper.c | 12 +++++++++---
>> 1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
>> index 
>> 15bad5dd46518c6e86b6273d4a2b26b3b6f991de..9dd76f540b4871d3d0ab0e95747c85434e5d677d
>>  100644
>> --- a/target/m68k/op_helper.c
>> +++ b/target/m68k/op_helper.c
>> @@ -202,9 +202,6 @@ static void cf_interrupt_all(CPUM68KState *env, int 
>> is_hw)
>>             /* Return from an exception.  */
>>             cf_rte(env);
>>             return;
>> -        case EXCP_SEMIHOSTING:
>> -            do_m68k_semihosting(env, env->dregs[0]);
>> -            return;
>>         }
>>     }
>>
>> @@ -422,6 +419,15 @@ static void m68k_interrupt_all(CPUM68KState *env, int 
>> is_hw)
>>
>> static void do_interrupt_all(CPUM68KState *env, int is_hw)
>> {
>> +    CPUState *cs = env_cpu(env);
>
> This could be within the if block if not needed elsewhere.
>
>> +
>> +    if (!is_hw) {
>> +        switch (cs->exception_index) {
>> +        case EXCP_SEMIHOSTING:
>> +            do_m68k_semihosting(env, env->dregs[0]);
>> +            return;
>
> Also why use switch for a single case? Why not write
>
> if (!is_hw && cs->exception_index == EXCP_SEMIHOSTING)
>
> instead?

I'm getting confused at cs->exception_index already being looked at in
multiple places:

  -*- mode:grep; default-directory: "/home/alex/lsrc/qemu.git/target/m68k/" -*-


  12 candidates:
  ./op_helper.c:200:        switch (cs->exception_index) {
  ./op_helper.c:211:    vector = cs->exception_index << 2;
  ./op_helper.c:217:                 ++count, 
m68k_exception_name(cs->exception_index),
  ./op_helper.c:266:        cpu_stw_mmuidx_ra(env, *sp, (format << 12) + 
(cs->exception_index << 2),
  ./op_helper.c:283:        switch (cs->exception_index) {
  ./op_helper.c:291:    vector = cs->exception_index << 2;
  ./op_helper.c:297:                 ++count, 
m68k_exception_name(cs->exception_index),
  ./op_helper.c:322:    switch (cs->exception_index) {

So I'm not sure splitting a case makes it easier to follow. Exceptions
are under the control of the translator - is it possible to re-factor
the code to keep the switch of all cs->exception_index cases in one
place and assert if the translator has generated one it shouldn't have?


>
> Regards,
> BALATON Zoltan
>
>> +        }
>> +    }
>>     if (m68k_feature(env, M68K_FEATURE_M68K)) {
>>         m68k_interrupt_all(env, is_hw);
>>         return;
>>
>> ---
>> base-commit: 2b7a80e07a29074530a0ebc8005a418ee07b1faf
>> change-id: 20241229-m68k-semihosting-2c49c86d3e3c
>>
>> Best regards,
>>

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro



reply via email to

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