Skip to content

Commit b3bebda

Browse files
xxkentpavelvkozlov
authored andcommitted
ARCv3: Skip r59 register for ARC64 processors when save/restore context
The r59 register is reserved for ARC64. Illegal operand exception will be raised if it referenced.
1 parent 77a7f1b commit b3bebda

File tree

4 files changed

+24
-2
lines changed

4 files changed

+24
-2
lines changed

arch/arc/include/asm/entry-cmn.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,12 @@
180180
STR r10, sp, PT_sp ; pt_regs->sp
181181

182182
#ifdef CONFIG_ARC_HAS_ACCL_REGS
183+
#ifdef CONFIG_ARC_CPU_HS6X
184+
STR r58, sp, PT_r58 ; r59 is reserved for ARC64
185+
#else
183186
STR2 r58, r59, sp, PT_r58
184187
#endif
188+
#endif
185189

186190
#ifdef CONFIG_ARC_CURR_IN_REG
187191
GET_CURR_TASK_ON_CPU gp
@@ -216,8 +220,12 @@
216220
DSP_RESTORE_REGFILE_IRQ
217221

218222
#ifdef CONFIG_ARC_HAS_ACCL_REGS
223+
#ifdef CONFIG_ARC_CPU_HS6X
224+
LDR r58, sp, PT_r58
225+
#else
219226
LDR2 r58, r59, sp, PT_r58
220227
#endif
228+
#endif
221229
.endm
222230

223231
/*------------------------------------------------------------------------*/

arch/arc/include/asm/ptrace.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ struct callee_regs {
104104
struct pt_regs {
105105

106106
unsigned long orig_r0;
107-
unsigned long r58, r59;
107+
#ifdef CONFIG_ARC_HAS_ACCL_REGS
108+
unsigned long r58;
109+
#ifndef CONFIG_ARC_CPU_HS6X
110+
unsigned long r59;
111+
#endif
112+
#endif
108113
ecr_reg ecr;
109114
unsigned long bta;
110115
unsigned long fp;

arch/arc/kernel/asm-offsets.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ int main(void)
7474
#endif
7575
#ifdef CONFIG_ARC_HAS_ACCL_REGS
7676
OFFSET(PT_r58, pt_regs, r58);
77+
#ifndef CONFIG_ARC_CPU_HS6X
7778
OFFSET(PT_r59, pt_regs, r59);
7879
#endif
80+
#endif
7981
#ifdef CONFIG_ARC_DSP_SAVE_RESTORE_REGS
8082
OFFSET(PT_DSP_CTRL, pt_regs, DSP_CTRL);
8183
#endif

arch/arc/kernel/signal.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,14 @@ static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
7272
#endif
7373
#ifdef CONFIG_ARC_HAS_ACCL_REGS
7474
v2abi.r58 = regs->r58;
75+
#ifndef CONFIG_ARC_CPU_HS6X
7576
v2abi.r59 = regs->r59;
77+
#endif
7678
#else
77-
v2abi.r58 = v2abi.r59 = 0;
79+
v2abi.r58 = 0;
80+
#ifndef CONFIG_ARC_CPU_HS6X
81+
v2abi.r59 = 0;
82+
#endif
7883
#endif
7984
err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi));
8085
#endif
@@ -94,8 +99,10 @@ static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
9499
#endif
95100
#ifdef CONFIG_ARC_HAS_ACCL_REGS
96101
regs->r58 = v2abi.r58;
102+
#ifndef CONFIG_ARC_CPU_HS6X
97103
regs->r59 = v2abi.r59;
98104
#endif
105+
#endif
99106
#endif
100107
return err;
101108
}

0 commit comments

Comments
 (0)