Skip to content

Commit b1edae0

Browse files
committed
Merge tag 'arc-5.13-rc7-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
Pull ARC fixes from Vineet Gupta: - ARCv2 userspace ABI not populating a few registers - Unbork CONFIG_HARDENED_USERCOPY for ARC * tag 'arc-5.13-rc7-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc: ARC: fix CONFIG_HARDENED_USERCOPY ARCv2: save ABI registers across signal handling
2 parents 89fec74 + 110febc commit b1edae0

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

arch/arc/include/uapi/asm/sigcontext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
struct sigcontext {
2020
struct user_regs_struct regs;
21+
struct user_regs_arcv2 v2abi;
2122
};
2223

2324
#endif /* _ASM_ARC_SIGCONTEXT_H */

arch/arc/kernel/signal.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,41 @@ struct rt_sigframe {
6161
unsigned int sigret_magic;
6262
};
6363

64+
static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
65+
{
66+
int err = 0;
67+
#ifndef CONFIG_ISA_ARCOMPACT
68+
struct user_regs_arcv2 v2abi;
69+
70+
v2abi.r30 = regs->r30;
71+
#ifdef CONFIG_ARC_HAS_ACCL_REGS
72+
v2abi.r58 = regs->r58;
73+
v2abi.r59 = regs->r59;
74+
#else
75+
v2abi.r58 = v2abi.r59 = 0;
76+
#endif
77+
err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi));
78+
#endif
79+
return err;
80+
}
81+
82+
static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
83+
{
84+
int err = 0;
85+
#ifndef CONFIG_ISA_ARCOMPACT
86+
struct user_regs_arcv2 v2abi;
87+
88+
err = __copy_from_user(&v2abi, &mctx->v2abi, sizeof(v2abi));
89+
90+
regs->r30 = v2abi.r30;
91+
#ifdef CONFIG_ARC_HAS_ACCL_REGS
92+
regs->r58 = v2abi.r58;
93+
regs->r59 = v2abi.r59;
94+
#endif
95+
#endif
96+
return err;
97+
}
98+
6499
static int
65100
stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
66101
sigset_t *set)
@@ -94,6 +129,10 @@ stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
94129

95130
err = __copy_to_user(&(sf->uc.uc_mcontext.regs.scratch), &uregs.scratch,
96131
sizeof(sf->uc.uc_mcontext.regs.scratch));
132+
133+
if (is_isa_arcv2())
134+
err |= save_arcv2_regs(&(sf->uc.uc_mcontext), regs);
135+
97136
err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t));
98137

99138
return err ? -EFAULT : 0;
@@ -109,6 +148,10 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
109148
err |= __copy_from_user(&uregs.scratch,
110149
&(sf->uc.uc_mcontext.regs.scratch),
111150
sizeof(sf->uc.uc_mcontext.regs.scratch));
151+
152+
if (is_isa_arcv2())
153+
err |= restore_arcv2_regs(&(sf->uc.uc_mcontext), regs);
154+
112155
if (err)
113156
return -EFAULT;
114157

arch/arc/kernel/vmlinux.lds.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ SECTIONS
5757
.init.ramfs : { INIT_RAM_FS }
5858

5959
. = ALIGN(PAGE_SIZE);
60-
_stext = .;
6160

6261
HEAD_TEXT_SECTION
6362
INIT_TEXT_SECTION(L1_CACHE_BYTES)
@@ -83,6 +82,7 @@ SECTIONS
8382

8483
.text : {
8584
_text = .;
85+
_stext = .;
8686
TEXT_TEXT
8787
SCHED_TEXT
8888
CPUIDLE_TEXT

0 commit comments

Comments
 (0)