From: Sergey Matyukevich <sergey.matyukev...@synopsys.com>

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.

Signed-off-by: Sergey Matyukevich <geoma...@gmail.com>
---
 arch/arc/kernel/disasm.c | 64 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 2 deletions(-)

diff --git a/arch/arc/kernel/disasm.c b/arch/arc/kernel/disasm.c
index 03f8b1be0c3a..38f5f8325322 100644
--- a/arch/arc/kernel/disasm.c
+++ b/arch/arc/kernel/disasm.c
@@ -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,37 @@ 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:
+               regs->gp = val;
+               break;
+       case 27:
+               regs->fp = val;
+               break;
+       case 28:
+               regs->sp = val;
+               break;
+       case 31:
+               regs->blink = val;
+               break;
+       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:
@@ -481,12 +529,24 @@ void __kprobes set_reg(int reg, long val, struct pt_regs 
*regs,
        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
 }
 
 /*
-- 
2.35.1


_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to