Skip to content

Commit 9a78a8a

Browse files
Sergey Matyukevichvineetgarc
authored andcommitted
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 <[email protected]> Signed-off-by: Sergey Matyukevich <[email protected]> Signed-off-by: Vineet Gupta <[email protected]>
1 parent fb0b549 commit 9a78a8a

File tree

1 file changed

+62
-2
lines changed

1 file changed

+62
-2
lines changed

arch/arc/kernel/disasm.c

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,14 +434,31 @@ long __kprobes get_reg(int reg, struct pt_regs *regs,
434434
{
435435
long *p;
436436

437+
#if defined(CONFIG_ISA_ARCOMPACT)
437438
if (reg <= 12) {
438439
p = &regs->r0;
439440
return p[-reg];
440441
}
442+
#else /* CONFIG_ISA_ARCV2 */
443+
if (reg <= 11) {
444+
p = &regs->r0;
445+
return p[reg];
446+
}
441447

448+
if (reg == 12)
449+
return regs->r12;
450+
if (reg == 30)
451+
return regs->r30;
452+
#ifdef CONFIG_ARC_HAS_ACCL_REGS
453+
if (reg == 58)
454+
return regs->r58;
455+
if (reg == 59)
456+
return regs->r59;
457+
#endif
458+
#endif
442459
if (cregs && (reg <= 25)) {
443460
p = &cregs->r13;
444-
return p[13-reg];
461+
return p[13 - reg];
445462
}
446463

447464
if (reg == 26)
@@ -461,6 +478,7 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
461478
{
462479
long *p;
463480

481+
#if defined(CONFIG_ISA_ARCOMPACT)
464482
switch (reg) {
465483
case 0 ... 12:
466484
p = &regs->r0;
@@ -469,7 +487,7 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
469487
case 13 ... 25:
470488
if (cregs) {
471489
p = &cregs->r13;
472-
p[13-reg] = val;
490+
p[13 - reg] = val;
473491
}
474492
break;
475493
case 26:
@@ -487,6 +505,48 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
487505
default:
488506
break;
489507
}
508+
#else /* CONFIG_ISA_ARCV2 */
509+
switch (reg) {
510+
case 0 ... 11:
511+
p = &regs->r0;
512+
p[reg] = val;
513+
break;
514+
case 12:
515+
regs->r12 = val;
516+
break;
517+
case 13 ... 25:
518+
if (cregs) {
519+
p = &cregs->r13;
520+
p[13 - reg] = val;
521+
}
522+
break;
523+
case 26:
524+
regs->r26 = val;
525+
break;
526+
case 27:
527+
regs->fp = val;
528+
break;
529+
case 28:
530+
regs->sp = val;
531+
break;
532+
case 30:
533+
regs->r30 = val;
534+
break;
535+
case 31:
536+
regs->blink = val;
537+
break;
538+
#ifdef CONFIG_ARC_HAS_ACCL_REGS
539+
case 58:
540+
regs->r58 = val;
541+
break;
542+
case 59:
543+
regs->r59 = val;
544+
break;
545+
#endif
546+
default:
547+
break;
548+
}
549+
#endif
490550
}
491551

492552
/*

0 commit comments

Comments
 (0)