Commit 9a78a8a8 authored by Sergey Matyukevich's avatar Sergey Matyukevich Committed by Vineet Gupta
Browse files

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: default avatarkernel test robot <lkp@intel.com>
Signed-off-by: default avatarSergey Matyukevich <sergey.matyukevich@synopsys.com>
Signed-off-by: default avatarVineet Gupta <vgupta@kernel.org>
parent fb0b5490
Loading
Loading
Loading
Loading
+62 −2
Original line number Diff line number Diff line
@@ -434,11 +434,28 @@ 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];
@@ -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;
@@ -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
}

/*