ARC: disasm: handle ARCv2 case in kprobe get/set functions
authorSergey Matyukevich <sergey.matyukevich@synopsys.com>
Thu, 14 Apr 2022 08:17:24 +0000 (11:17 +0300)
committerVineet Gupta <vgupta@kernel.org>
Tue, 26 Apr 2022 16:34:42 +0000 (09:34 -0700)
Current implementation of get_reg/set_reg implies ARCompact layout
of pt_regs structure. Meanwhile pt_regs structure differs between
ARCompact and ARCv2. Update those functions to handle ARCv2.

Tested-by: kernel test robot <lkp@intel.com>
Signed-off-by: Sergey Matyukevich <sergey.matyukevich@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@kernel.org>
arch/arc/kernel/disasm.c

index 1e1db51b69414362f67e62813df484a39f1690ec..ccc7e8c39eb3be14c294c6620af7a7b1d4c71853 100644 (file)
@@ -434,14 +434,31 @@ long __kprobes get_reg(int reg, struct pt_regs *regs,
 {
        long *p;
 
+#if defined(CONFIG_ISA_ARCOMPACT)
        if (reg <= 12) {
                p = &regs->r0;
                return p[-reg];
        }
+#else /* CONFIG_ISA_ARCV2 */
+       if (reg <= 11) {
+               p = &regs->r0;
+               return p[reg];
+       }
 
+       if (reg == 12)
+               return regs->r12;
+       if (reg == 30)
+               return regs->r30;
+#ifdef CONFIG_ARC_HAS_ACCL_REGS
+       if (reg == 58)
+               return regs->r58;
+       if (reg == 59)
+               return regs->r59;
+#endif
+#endif
        if (cregs && (reg <= 25)) {
                p = &cregs->r13;
-               return p[13-reg];
+               return p[13 - reg];
        }
 
        if (reg == 26)
@@ -461,6 +478,7 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
 {
        long *p;
 
+#if defined(CONFIG_ISA_ARCOMPACT)
        switch (reg) {
        case 0 ... 12:
                p = &regs->r0;
@@ -469,7 +487,7 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
        case 13 ... 25:
                if (cregs) {
                        p = &cregs->r13;
-                       p[13-reg] = val;
+                       p[13 - reg] = val;
                }
                break;
        case 26:
@@ -487,6 +505,48 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
        default:
                break;
        }
+#else /* CONFIG_ISA_ARCV2 */
+       switch (reg) {
+       case 0 ... 11:
+               p = &regs->r0;
+               p[reg] = val;
+               break;
+       case 12:
+               regs->r12 = val;
+               break;
+       case 13 ... 25:
+               if (cregs) {
+                       p = &cregs->r13;
+                       p[13 - reg] = val;
+               }
+               break;
+       case 26:
+               regs->r26 = val;
+               break;
+       case 27:
+               regs->fp = val;
+               break;
+       case 28:
+               regs->sp = val;
+               break;
+       case 30:
+               regs->r30 = val;
+               break;
+       case 31:
+               regs->blink = val;
+               break;
+#ifdef CONFIG_ARC_HAS_ACCL_REGS
+       case 58:
+               regs->r58 = val;
+               break;
+       case 59:
+               regs->r59 = val;
+               break;
+#endif
+       default:
+               break;
+       }
+#endif
 }
 
 /*