Skip to content

Commit 06d0e37

Browse files
guoren83palmer-dabbelt
authored andcommitted
riscv: compat: Add basic compat data type implementation
Implement riscv asm/compat.h for struct compat_xxx, is_compat_task, compat_user_regset, regset convert. The rv64 compat.h has inherited most of the structs from the generic one. Signed-off-by: Guo Ren <guoren@linux.alibaba.com> Signed-off-by: Guo Ren <guoren@kernel.org> Tested-by: Heiko Stuebner <heiko@sntech.de> Link: https://lore.kernel.org/r/20220405071314.3225832-10-guoren@kernel.org Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
1 parent 72f045d commit 06d0e37

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

arch/riscv/include/asm/compat.h

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
#ifndef __ASM_COMPAT_H
3+
#define __ASM_COMPAT_H
4+
5+
#define COMPAT_UTS_MACHINE "riscv\0\0"
6+
7+
/*
8+
* Architecture specific compatibility types
9+
*/
10+
#include <linux/types.h>
11+
#include <linux/sched.h>
12+
#include <linux/sched/task_stack.h>
13+
#include <asm-generic/compat.h>
14+
15+
static inline int is_compat_task(void)
16+
{
17+
return test_thread_flag(TIF_32BIT);
18+
}
19+
20+
struct compat_user_regs_struct {
21+
compat_ulong_t pc;
22+
compat_ulong_t ra;
23+
compat_ulong_t sp;
24+
compat_ulong_t gp;
25+
compat_ulong_t tp;
26+
compat_ulong_t t0;
27+
compat_ulong_t t1;
28+
compat_ulong_t t2;
29+
compat_ulong_t s0;
30+
compat_ulong_t s1;
31+
compat_ulong_t a0;
32+
compat_ulong_t a1;
33+
compat_ulong_t a2;
34+
compat_ulong_t a3;
35+
compat_ulong_t a4;
36+
compat_ulong_t a5;
37+
compat_ulong_t a6;
38+
compat_ulong_t a7;
39+
compat_ulong_t s2;
40+
compat_ulong_t s3;
41+
compat_ulong_t s4;
42+
compat_ulong_t s5;
43+
compat_ulong_t s6;
44+
compat_ulong_t s7;
45+
compat_ulong_t s8;
46+
compat_ulong_t s9;
47+
compat_ulong_t s10;
48+
compat_ulong_t s11;
49+
compat_ulong_t t3;
50+
compat_ulong_t t4;
51+
compat_ulong_t t5;
52+
compat_ulong_t t6;
53+
};
54+
55+
static inline void regs_to_cregs(struct compat_user_regs_struct *cregs,
56+
struct pt_regs *regs)
57+
{
58+
cregs->pc = (compat_ulong_t) regs->epc;
59+
cregs->ra = (compat_ulong_t) regs->ra;
60+
cregs->sp = (compat_ulong_t) regs->sp;
61+
cregs->gp = (compat_ulong_t) regs->gp;
62+
cregs->tp = (compat_ulong_t) regs->tp;
63+
cregs->t0 = (compat_ulong_t) regs->t0;
64+
cregs->t1 = (compat_ulong_t) regs->t1;
65+
cregs->t2 = (compat_ulong_t) regs->t2;
66+
cregs->s0 = (compat_ulong_t) regs->s0;
67+
cregs->s1 = (compat_ulong_t) regs->s1;
68+
cregs->a0 = (compat_ulong_t) regs->a0;
69+
cregs->a1 = (compat_ulong_t) regs->a1;
70+
cregs->a2 = (compat_ulong_t) regs->a2;
71+
cregs->a3 = (compat_ulong_t) regs->a3;
72+
cregs->a4 = (compat_ulong_t) regs->a4;
73+
cregs->a5 = (compat_ulong_t) regs->a5;
74+
cregs->a6 = (compat_ulong_t) regs->a6;
75+
cregs->a7 = (compat_ulong_t) regs->a7;
76+
cregs->s2 = (compat_ulong_t) regs->s2;
77+
cregs->s3 = (compat_ulong_t) regs->s3;
78+
cregs->s4 = (compat_ulong_t) regs->s4;
79+
cregs->s5 = (compat_ulong_t) regs->s5;
80+
cregs->s6 = (compat_ulong_t) regs->s6;
81+
cregs->s7 = (compat_ulong_t) regs->s7;
82+
cregs->s8 = (compat_ulong_t) regs->s8;
83+
cregs->s9 = (compat_ulong_t) regs->s9;
84+
cregs->s10 = (compat_ulong_t) regs->s10;
85+
cregs->s11 = (compat_ulong_t) regs->s11;
86+
cregs->t3 = (compat_ulong_t) regs->t3;
87+
cregs->t4 = (compat_ulong_t) regs->t4;
88+
cregs->t5 = (compat_ulong_t) regs->t5;
89+
cregs->t6 = (compat_ulong_t) regs->t6;
90+
};
91+
92+
static inline void cregs_to_regs(struct compat_user_regs_struct *cregs,
93+
struct pt_regs *regs)
94+
{
95+
regs->epc = (unsigned long) cregs->pc;
96+
regs->ra = (unsigned long) cregs->ra;
97+
regs->sp = (unsigned long) cregs->sp;
98+
regs->gp = (unsigned long) cregs->gp;
99+
regs->tp = (unsigned long) cregs->tp;
100+
regs->t0 = (unsigned long) cregs->t0;
101+
regs->t1 = (unsigned long) cregs->t1;
102+
regs->t2 = (unsigned long) cregs->t2;
103+
regs->s0 = (unsigned long) cregs->s0;
104+
regs->s1 = (unsigned long) cregs->s1;
105+
regs->a0 = (unsigned long) cregs->a0;
106+
regs->a1 = (unsigned long) cregs->a1;
107+
regs->a2 = (unsigned long) cregs->a2;
108+
regs->a3 = (unsigned long) cregs->a3;
109+
regs->a4 = (unsigned long) cregs->a4;
110+
regs->a5 = (unsigned long) cregs->a5;
111+
regs->a6 = (unsigned long) cregs->a6;
112+
regs->a7 = (unsigned long) cregs->a7;
113+
regs->s2 = (unsigned long) cregs->s2;
114+
regs->s3 = (unsigned long) cregs->s3;
115+
regs->s4 = (unsigned long) cregs->s4;
116+
regs->s5 = (unsigned long) cregs->s5;
117+
regs->s6 = (unsigned long) cregs->s6;
118+
regs->s7 = (unsigned long) cregs->s7;
119+
regs->s8 = (unsigned long) cregs->s8;
120+
regs->s9 = (unsigned long) cregs->s9;
121+
regs->s10 = (unsigned long) cregs->s10;
122+
regs->s11 = (unsigned long) cregs->s11;
123+
regs->t3 = (unsigned long) cregs->t3;
124+
regs->t4 = (unsigned long) cregs->t4;
125+
regs->t5 = (unsigned long) cregs->t5;
126+
regs->t6 = (unsigned long) cregs->t6;
127+
};
128+
129+
#endif /* __ASM_COMPAT_H */

arch/riscv/include/asm/thread_info.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ struct thread_info {
9797
#define TIF_SECCOMP 8 /* syscall secure computing */
9898
#define TIF_NOTIFY_SIGNAL 9 /* signal notifications exist */
9999
#define TIF_UPROBE 10 /* uprobe breakpoint or singlestep */
100+
#define TIF_32BIT 11 /* compat-mode 32bit process */
100101

101102
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
102103
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)

0 commit comments

Comments
 (0)