diff options
Diffstat (limited to 'arch/arc/kernel/disasm.c')
| -rw-r--r-- | arch/arc/kernel/disasm.c | 64 | 
1 files changed, 62 insertions, 2 deletions
diff --git a/arch/arc/kernel/disasm.c b/arch/arc/kernel/disasm.c index 1e1db51b6941..ccc7e8c39eb3 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 = ®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  }  /*  | 
