diff mbox series

[v2] target/arm: fix exception syndrome for AArch32 bkpt insn

Message ID 20240127202758.3326381-1-jan.kloetzke@kernkonzept.com (mailing list archive)
State New, archived
Headers show
Series [v2] target/arm: fix exception syndrome for AArch32 bkpt insn | expand

Commit Message

Jan Klötzke Jan. 27, 2024, 8:27 p.m. UTC
Debug exceptions that target AArch32 Hyp mode are reported differently
than on AAarch64. Internally, Qemu uses the AArch64 syndromes. Therefore
such exceptions need to be either converted to a prefetch abort
(breakpoints, vector catch) or a data abort (watchpoints).

Signed-off-by: Jan Klötzke <jan.kloetzke@kernkonzept.com>
---
v2:
 * Refactor watchpoint syndrome rewriting
 * Drop ARM_EL_ISV from watchpoint syndrome

 target/arm/helper.c   | 18 ++++++++++++++++++
 target/arm/syndrome.h |  8 ++++++++
 2 files changed, 26 insertions(+)

Comments

Richard Henderson Jan. 27, 2024, 10:09 p.m. UTC | #1
On 1/28/24 06:27, Jan Klötzke wrote:
> Debug exceptions that target AArch32 Hyp mode are reported differently
> than on AAarch64. Internally, Qemu uses the AArch64 syndromes. Therefore
> such exceptions need to be either converted to a prefetch abort
> (breakpoints, vector catch) or a data abort (watchpoints).
> 
> Signed-off-by: Jan Klötzke<jan.kloetzke@kernkonzept.com>
> ---
> v2:
>   * Refactor watchpoint syndrome rewriting
>   * Drop ARM_EL_ISV from watchpoint syndrome
> 
>   target/arm/helper.c   | 18 ++++++++++++++++++
>   target/arm/syndrome.h |  8 ++++++++
>   2 files changed, 26 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
Michael Tokarev Jan. 28, 2024, 6:48 a.m. UTC | #2
On 27.01.2024 23:27, Jan Klötzke wrote:
> Debug exceptions that target AArch32 Hyp mode are reported differently
> than on AAarch64. Internally, Qemu uses the AArch64 syndromes. Therefore
> such exceptions need to be either converted to a prefetch abort
> (breakpoints, vector catch) or a data abort (watchpoints).

This seems to be a -stable matherial.  Please let me know if it is not.
Please Cc: qemu-stable@nongnu.org for other fixes suitable for stable
series.

Thanks,

/mjt
Peter Maydell Jan. 30, 2024, 4:48 p.m. UTC | #3
On Sat, 27 Jan 2024 at 20:30, Jan Klötzke <jan.kloetzke@kernkonzept.com> wrote:
>
> Debug exceptions that target AArch32 Hyp mode are reported differently
> than on AAarch64. Internally, Qemu uses the AArch64 syndromes. Therefore
> such exceptions need to be either converted to a prefetch abort
> (breakpoints, vector catch) or a data abort (watchpoints).
>
> Signed-off-by: Jan Klötzke <jan.kloetzke@kernkonzept.com>
> ---
> v2:
>  * Refactor watchpoint syndrome rewriting
>  * Drop ARM_EL_ISV from watchpoint syndrome
>
>  target/arm/helper.c   | 18 ++++++++++++++++++
>  target/arm/syndrome.h |  8 ++++++++
>  2 files changed, 26 insertions(+)
>

Applied to target-arm.next, thanks (with a cc: qemu-stable header added).

By the way, if you're interested in incorrect syndromes with
AArch32 Hyp mode, the other one I know about is
https://gitlab.com/qemu-project/qemu/-/issues/1153
which describes some issues with the syndrome for traps
of VFP or Neon instructions. I don't know if that affects
your use-case.

thanks
-- PMM
diff mbox series

Patch

diff --git a/target/arm/helper.c b/target/arm/helper.c
index 945d8571a6..a0041aa0ec 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -11015,6 +11015,24 @@  static void arm_cpu_do_interrupt_aarch32(CPUState *cs)
     }
 
     if (env->exception.target_el == 2) {
+        /* Debug exceptions are reported differently on AArch32 */
+        switch (syn_get_ec(env->exception.syndrome)) {
+        case EC_BREAKPOINT:
+        case EC_BREAKPOINT_SAME_EL:
+        case EC_AA32_BKPT:
+        case EC_VECTORCATCH:
+            env->exception.syndrome = syn_insn_abort(arm_current_el(env) == 2,
+                                                     0, 0, 0x22);
+            break;
+        case EC_WATCHPOINT:
+            env->exception.syndrome = syn_set_ec(env->exception.syndrome,
+                                                 EC_DATAABORT);
+            break;
+        case EC_WATCHPOINT_SAME_EL:
+            env->exception.syndrome = syn_set_ec(env->exception.syndrome,
+                                                 EC_DATAABORT_SAME_EL);
+            break;
+        }
         arm_cpu_do_interrupt_aarch32_hyp(cs);
         return;
     }
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
index 1a49767479..3244e0740d 100644
--- a/target/arm/syndrome.h
+++ b/target/arm/syndrome.h
@@ -25,6 +25,8 @@ 
 #ifndef TARGET_ARM_SYNDROME_H
 #define TARGET_ARM_SYNDROME_H
 
+#include "qemu/bitops.h"
+
 /* Valid Syndrome Register EC field values */
 enum arm_exception_class {
     EC_UNCATEGORIZED          = 0x00,
@@ -80,6 +82,7 @@  typedef enum {
     SME_ET_InactiveZA,
 } SMEExceptionType;
 
+#define ARM_EL_EC_LENGTH 6
 #define ARM_EL_EC_SHIFT 26
 #define ARM_EL_IL_SHIFT 25
 #define ARM_EL_ISV_SHIFT 24
@@ -94,6 +97,11 @@  static inline uint32_t syn_get_ec(uint32_t syn)
     return syn >> ARM_EL_EC_SHIFT;
 }
 
+static inline uint32_t syn_set_ec(uint32_t syn, uint32_t ec)
+{
+    return deposit32(syn, ARM_EL_EC_SHIFT, ARM_EL_EC_LENGTH, ec);
+}
+
 /*
  * Utility functions for constructing various kinds of syndrome value.
  * Note that in general we follow the AArch64 syndrome values; in a