Skip to content

Commit bfb98ad

Browse files
author
Sergey Matyukevich
committed
ARC: disasm: fix kprobe get/set functions
Layout of pt_regs structure differs between ARCompact/ARCv2/ARCv3. Fix set_reg/get_reg functions to handle proper registers. Signed-off-by: Sergey Matyukevich <sergey.matyukevich@synopsys.com>
1 parent 5c7be9a commit bfb98ad

File tree

1 file changed

+96
-2
lines changed

1 file changed

+96
-2
lines changed

arch/arc/kernel/disasm.c

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,18 +434,52 @@ 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
}
441442

442443
if (cregs && (reg <= 25)) {
443444
p = &cregs->r13;
444-
return p[13-reg];
445+
return p[13 - reg];
445446
}
446447

447448
if (reg == 26)
448449
return regs->gp;
450+
451+
#elif defined(CONFIG_ISA_ARCV2)
452+
if (reg <= 11) {
453+
p = &regs->r0;
454+
return p[reg];
455+
}
456+
457+
if (reg == 12)
458+
return regs->r12;
459+
460+
if (cregs && (reg <= 25)) {
461+
p = &cregs->r13;
462+
return p[13 - reg];
463+
}
464+
465+
if (reg == 26)
466+
return regs->gp;
467+
468+
#else /* CONFIG_ISA_ARCV3 */
469+
if (reg <= 13) {
470+
p = &regs->r0;
471+
return p[reg];
472+
}
473+
474+
if (cregs && (reg <= 26)) {
475+
p = &cregs->r14;
476+
return p[reg - 14];
477+
}
478+
479+
if (reg == 30)
480+
return regs->gp;
481+
#endif
482+
449483
if (reg == 27)
450484
return regs->fp;
451485
if (reg == 28)
@@ -461,6 +495,7 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
461495
{
462496
long *p;
463497

498+
#if defined(CONFIG_ISA_ARCOMPACT)
464499
switch (reg) {
465500
case 0 ... 12:
466501
p = &regs->r0;
@@ -469,7 +504,37 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
469504
case 13 ... 25:
470505
if (cregs) {
471506
p = &cregs->r13;
472-
p[13-reg] = val;
507+
p[13 - reg] = val;
508+
}
509+
break;
510+
case 26:
511+
regs->gp = val;
512+
break;
513+
case 27:
514+
regs->fp = val;
515+
break;
516+
case 28:
517+
regs->sp = val;
518+
break;
519+
case 31:
520+
regs->blink = val;
521+
break;
522+
default:
523+
break;
524+
}
525+
#elif defined(CONFIG_ISA_ARCV2)
526+
switch (reg) {
527+
case 0 ... 11:
528+
p = &regs->r0;
529+
p[reg] = val;
530+
break;
531+
case 12:
532+
regs->r12 = val;
533+
break;
534+
case 13 ... 25:
535+
if (cregs) {
536+
p = &cregs->r13;
537+
p[13 - reg] = val;
473538
}
474539
break;
475540
case 26:
@@ -487,6 +552,35 @@ void __kprobes set_reg(int reg, long val, struct pt_regs *regs,
487552
default:
488553
break;
489554
}
555+
#else /* CONFIG_ISA_ARCV3 */
556+
switch (reg) {
557+
case 0 ... 13:
558+
p = &regs->r0;
559+
p[reg] = val;
560+
break;
561+
case 14 ... 26:
562+
if (cregs) {
563+
p = &cregs->r14;
564+
p[reg - 14] = val;
565+
}
566+
break;
567+
case 27:
568+
regs->fp = val;
569+
break;
570+
case 28:
571+
regs->sp = val;
572+
break;
573+
case 30:
574+
regs->gp = val;
575+
break;
576+
case 31:
577+
regs->blink = val;
578+
break;
579+
default:
580+
break;
581+
}
582+
583+
#endif
490584
}
491585

492586
/*

0 commit comments

Comments
 (0)