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