Hi list,

I messed up the last messages From-address when drafting the mail by
hand. Sorry for the noise.

> Hi David,
>
> It appears you only replied to the qemu-devel list? I just saw this when
> informing a co-worker about this series.
>
>> On 11.05.25 15:14, Julian Ganz wrote:
>>> diff --git a/target/s390x/tcg/excp_helper.c b/target/s390x/tcg/excp_helper.c
>>> index e4c75d0ce0..b7e7a4deff 100644
>>> --- a/target/s390x/tcg/excp_helper.c
>>> +++ b/target/s390x/tcg/excp_helper.c
>>> @@ -34,6 +34,7 @@
>>>   #include "hw/s390x/s390_flic.h"
>>>   #include "hw/boards.h"
>>>   #endif
>>> +#include "qemu/plugin.h"
>>>   
>>>   G_NORETURN void tcg_s390_program_interrupt(CPUS390XState *env,
>>>                                              uint32_t code, uintptr_t ra)
>>> @@ -499,6 +500,7 @@ void s390_cpu_do_interrupt(CPUState *cs)
>>>       S390CPU *cpu = S390_CPU(cs);
>>>       CPUS390XState *env = &cpu->env;
>>>       bool stopped = false;
>>> +    uint64_t last_pc = cpu->env.psw.addr;
>>>   
>>>       qemu_log_mask(CPU_LOG_INT, "%s: %d at psw=%" PRIx64 ":%" PRIx64 "\n",
>>>                     __func__, cs->exception_index, env->psw.mask, 
>>> env->psw.addr);
>>> @@ -528,21 +530,27 @@ try_deliver:
>>>       switch (cs->exception_index) {
>>>       case EXCP_PGM:
>>>           do_program_interrupt(env);
>>> +        qemu_plugin_vcpu_exception_cb(cs, last_pc);
>>>           break;
>>>       case EXCP_SVC:
>>>           do_svc_interrupt(env);
>>> +        qemu_plugin_vcpu_exception_cb(cs, last_pc);
>>>           break;
>>>       case EXCP_EXT:
>>>           do_ext_interrupt(env);
>>> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
>>>           break;
>>>       case EXCP_IO:
>>>           do_io_interrupt(env);
>>> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
>>>           break;
>>>       case EXCP_MCHK:
>>>           do_mchk_interrupt(env);
>>> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
>>>           break;
>>>       case EXCP_RESTART:
>>>           do_restart_interrupt(env);
>>> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
>>
>> Might be easier to check for "if (cs->exception_index != EXCP_STOP)"
>> after that switch-case.
>
> I still need to differentiate between exceptions and interrupts, which
> would result in another switch-case.
>
>> But I'm curious about the semantics: are we supposed to call
>> qemu_plugin_vcpu_interrupt_cb() just after an interrupt got delivered?
>
> `qemu_plugin_vcpu_interrupt_cb` or `qemu_plugin_vcpu_exception_cb` need
> to be called after the CPU was set up (that is, after PC and any other
> relevant register was set) and before the next instruction is executed.
> So, yes, more or less.

Regards,
Julian

Reply via email to