mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 17:25:38 +00:00
ARC: disasm: handle ARCv2 case in kprobe get/set functions
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>
This commit is contained in:
parent
fb0b54909b
commit
9a78a8a8bb
@ -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 = ®s->r0;
|
||||
return p[-reg];
|
||||
}
|
||||
#else /* CONFIG_ISA_ARCV2 */
|
||||
if (reg <= 11) {
|
||||
p = ®s->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 = ®s->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 = ®s->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
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user