[PATCH v7 08/25] target/hppa: call plugin trap callbacks

Julian Ganz posted 25 patches 4 months ago
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, Alexandre Iooss <erdnaxe@crans.org>, Mahmoud Mandour <ma.mandourr@gmail.com>, Pierrick Bouvier <pierrick.bouvier@linaro.org>, Richard Henderson <richard.henderson@linaro.org>, Peter Maydell <peter.maydell@linaro.org>, Michael Rolnik <mrolnik@gmail.com>, Helge Deller <deller@gmx.de>, Paolo Bonzini <pbonzini@redhat.com>, Eduardo Habkost <eduardo@habkost.net>, Song Gao <gaosong@loongson.cn>, Laurent Vivier <laurent@vivier.eu>, "Edgar E. Iglesias" <edgar.iglesias@gmail.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Aurelien Jarno <aurelien@aurel32.net>, Jiaxun Yang <jiaxun.yang@flygoat.com>, Aleksandar Rikalo <arikalo@gmail.com>, Stafford Horne <shorne@gmail.com>, Nicholas Piggin <npiggin@gmail.com>, Chinmay Rath <rathc@linux.ibm.com>, Palmer Dabbelt <palmer@dabbelt.com>, Alistair Francis <alistair.francis@wdc.com>, Weiwei Li <liwei1518@gmail.com>, Daniel Henrique Barboza <dbarboza@ventanamicro.com>, Liu Zhiwei <zhiwei_liu@linux.alibaba.com>, Yoshinori Sato <yoshinori.sato@nifty.com>, David Hildenbrand <david@redhat.com>, Ilya Leoshkevich <iii@linux.ibm.com>, Thomas Huth <thuth@redhat.com>, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>, Artyom Tarasenko <atar4qemu@gmail.com>, Bastian Koppelmann <kbastian@mail.uni-paderborn.de>, Max Filippov <jcmvbkbc@gmail.com>
There is a newer version of this series
[PATCH v7 08/25] target/hppa: call plugin trap callbacks
Posted by Julian Ganz 4 months ago
We identified a number of exceptions as interrupts, and we assume
exceptions that are not explicitly listed do exist and should be
regarded as interrupts. This unfortunately forces us to list all
(syncroneous) exceptions. We decided to also list every single
known interrupt as they are few and we prefer to complete an almost
complete list, partially as a visual aid to confirm that we did not miss
any named exception index.

PA-RISC appears to not have any form of host-call.

This change places the hook for PA-RISC targets.

Signed-off-by: Julian Ganz <neither@nut.email>
---
 target/hppa/int_helper.c | 44 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/target/hppa/int_helper.c b/target/hppa/int_helper.c
index 191ae19404..0742990c90 100644
--- a/target/hppa/int_helper.c
+++ b/target/hppa/int_helper.c
@@ -24,6 +24,7 @@
 #include "exec/helper-proto.h"
 #include "hw/core/cpu.h"
 #include "hw/hppa/hppa_hardware.h"
+#include "qemu/plugin.h"
 
 static void eval_interrupt(HPPACPU *cpu)
 {
@@ -95,6 +96,7 @@ void hppa_cpu_do_interrupt(CPUState *cs)
     CPUHPPAState *env = &cpu->env;
     int i = cs->exception_index;
     uint64_t old_psw, old_gva_offset_mask;
+    uint64_t last_pc = cs->cc->get_pc(cs);
 
     /* As documented in pa2.0 -- interruption handling.  */
     /* step 1 */
@@ -212,6 +214,48 @@ void hppa_cpu_do_interrupt(CPUState *cs)
     env->iasq_f = 0;
     env->iasq_b = 0;
 
+    switch (i) {
+    case EXCP_HPMC:
+    case EXCP_POWER_FAIL:
+    case EXCP_RC:
+    case EXCP_EXT_INTERRUPT:
+    case EXCP_LPMC:
+    case EXCP_PER_INTERRUPT:
+    case EXCP_TOC:
+        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
+        break;
+    case EXCP_ITLB_MISS:
+    case EXCP_IMP:
+    case EXCP_ILL:
+    case EXCP_BREAK:
+    case EXCP_PRIV_OPR:
+    case EXCP_PRIV_REG:
+    case EXCP_OVERFLOW:
+    case EXCP_COND:
+    case EXCP_ASSIST:
+    case EXCP_DTLB_MISS:
+    case EXCP_NA_ITLB_MISS:
+    case EXCP_NA_DTLB_MISS:
+    case EXCP_DMP:
+    case EXCP_DMB:
+    case EXCP_TLB_DIRTY:
+    case EXCP_PAGE_REF:
+    case EXCP_ASSIST_EMU:
+    case EXCP_HPT:
+    case EXCP_LPT:
+    case EXCP_TB:
+    case EXCP_DMAR:
+    case EXCP_DMPI:
+    case EXCP_UNALIGN:
+    case EXCP_SYSCALL:
+    case EXCP_SYSCALL_LWS:
+        qemu_plugin_vcpu_exception_cb(cs, last_pc);
+        break;
+    default:
+        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
+        break;
+    }
+
     if (qemu_loglevel_mask(CPU_LOG_INT)) {
         static const char * const names[] = {
             [EXCP_HPMC]          = "high priority machine check",
-- 
2.49.1
Re: [PATCH v7 08/25] target/hppa: call plugin trap callbacks
Posted by Richard Henderson 4 months ago
On 10/6/25 02:57, Julian Ganz wrote:
> @@ -212,6 +214,48 @@ void hppa_cpu_do_interrupt(CPUState *cs)
>       env->iasq_f = 0;
>       env->iasq_b = 0;
>   
> +    switch (i) {
> +    case EXCP_HPMC:
> +    case EXCP_POWER_FAIL:
> +    case EXCP_RC:
> +    case EXCP_EXT_INTERRUPT:
> +    case EXCP_LPMC:
> +    case EXCP_PER_INTERRUPT:
> +    case EXCP_TOC:
> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
> +        break;
> +    case EXCP_ITLB_MISS:
> +    case EXCP_IMP:
> +    case EXCP_ILL:
> +    case EXCP_BREAK:
> +    case EXCP_PRIV_OPR:
> +    case EXCP_PRIV_REG:
> +    case EXCP_OVERFLOW:
> +    case EXCP_COND:
> +    case EXCP_ASSIST:
> +    case EXCP_DTLB_MISS:
> +    case EXCP_NA_ITLB_MISS:
> +    case EXCP_NA_DTLB_MISS:
> +    case EXCP_DMP:
> +    case EXCP_DMB:
> +    case EXCP_TLB_DIRTY:
> +    case EXCP_PAGE_REF:
> +    case EXCP_ASSIST_EMU:
> +    case EXCP_HPT:
> +    case EXCP_LPT:
> +    case EXCP_TB:
> +    case EXCP_DMAR:
> +    case EXCP_DMPI:
> +    case EXCP_UNALIGN:
> +    case EXCP_SYSCALL:
> +    case EXCP_SYSCALL_LWS:

These last two are linux-user syscalls.  Don't you want hostcall?

> +        qemu_plugin_vcpu_exception_cb(cs, last_pc);
> +        break;
> +    default:
> +        qemu_plugin_vcpu_interrupt_cb(cs, last_pc);

g_assert_not_reached().


r~
Re: [PATCH v7 08/25] target/hppa: call plugin trap callbacks
Posted by Julian Ganz 4 months ago
Hello Richard,

October 7, 2025 at 12:38 AM, "Richard Henderson" wrote:
> On 10/6/25 02:57, Julian Ganz wrote:
> > @@ -212,6 +214,48 @@ void hppa_cpu_do_interrupt(CPUState *cs)
> >  env->iasq_f = 0;
> >  env->iasq_b = 0;
> >  > + switch (i) {
> >  + case EXCP_HPMC:
> >  + case EXCP_POWER_FAIL:
> >  + case EXCP_RC:
> >  + case EXCP_EXT_INTERRUPT:
> >  + case EXCP_LPMC:
> >  + case EXCP_PER_INTERRUPT:
> >  + case EXCP_TOC:
> >  + qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
> >  + break;
> >  + case EXCP_ITLB_MISS:
> >  + case EXCP_IMP:
> >  + case EXCP_ILL:
> >  + case EXCP_BREAK:
> >  + case EXCP_PRIV_OPR:
> >  + case EXCP_PRIV_REG:
> >  + case EXCP_OVERFLOW:
> >  + case EXCP_COND:
> >  + case EXCP_ASSIST:
> >  + case EXCP_DTLB_MISS:
> >  + case EXCP_NA_ITLB_MISS:
> >  + case EXCP_NA_DTLB_MISS:
> >  + case EXCP_DMP:
> >  + case EXCP_DMB:
> >  + case EXCP_TLB_DIRTY:
> >  + case EXCP_PAGE_REF:
> >  + case EXCP_ASSIST_EMU:
> >  + case EXCP_HPT:
> >  + case EXCP_LPT:
> >  + case EXCP_TB:
> >  + case EXCP_DMAR:
> >  + case EXCP_DMPI:
> >  + case EXCP_UNALIGN:
> >  + case EXCP_SYSCALL:
> >  + case EXCP_SYSCALL_LWS:
> > 
> These last two are linux-user syscalls. Don't you want hostcall?

Hostcalls only really exist in system emulation mode. For regular
syscalls, we do want to observe the exception in that mode since the
kernel code we switch to is also emulated. For consistency's sake, we
handle it the same for user mode. And there's already a syscall API for
user mode emulation, so it doesn't make much sense to handle them as
host calls.

> 
> > 
> > + qemu_plugin_vcpu_exception_cb(cs, last_pc);
> >  + break;
> >  + default:
> >  + qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
> > 
> g_assert_not_reached().

So that implies that there are no exceptions or interrupts that are not
represented by a EXCP_* constant/definition? In that case I'll rewrite
this with just the interrupts and a default case for all "proper"
syncroneous exceptions.

Regards,
Julian
Re: [PATCH v7 08/25] target/hppa: call plugin trap callbacks
Posted by Richard Henderson 4 months ago
On 10/7/25 06:29, Julian Ganz wrote:
> So that implies that there are no exceptions or interrupts that are not
> represented by a EXCP_* constant/definition?

Yes.


r~