162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef __ASM_COMPAT_H
362306a36Sopenharmony_ci#define __ASM_COMPAT_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#define COMPAT_UTS_MACHINE	"riscv\0\0"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * Architecture specific compatibility types
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci#include <linux/sched.h>
1262306a36Sopenharmony_ci#include <linux/sched/task_stack.h>
1362306a36Sopenharmony_ci#include <asm-generic/compat.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic inline int is_compat_task(void)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	return test_thread_flag(TIF_32BIT);
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct compat_user_regs_struct {
2162306a36Sopenharmony_ci	compat_ulong_t pc;
2262306a36Sopenharmony_ci	compat_ulong_t ra;
2362306a36Sopenharmony_ci	compat_ulong_t sp;
2462306a36Sopenharmony_ci	compat_ulong_t gp;
2562306a36Sopenharmony_ci	compat_ulong_t tp;
2662306a36Sopenharmony_ci	compat_ulong_t t0;
2762306a36Sopenharmony_ci	compat_ulong_t t1;
2862306a36Sopenharmony_ci	compat_ulong_t t2;
2962306a36Sopenharmony_ci	compat_ulong_t s0;
3062306a36Sopenharmony_ci	compat_ulong_t s1;
3162306a36Sopenharmony_ci	compat_ulong_t a0;
3262306a36Sopenharmony_ci	compat_ulong_t a1;
3362306a36Sopenharmony_ci	compat_ulong_t a2;
3462306a36Sopenharmony_ci	compat_ulong_t a3;
3562306a36Sopenharmony_ci	compat_ulong_t a4;
3662306a36Sopenharmony_ci	compat_ulong_t a5;
3762306a36Sopenharmony_ci	compat_ulong_t a6;
3862306a36Sopenharmony_ci	compat_ulong_t a7;
3962306a36Sopenharmony_ci	compat_ulong_t s2;
4062306a36Sopenharmony_ci	compat_ulong_t s3;
4162306a36Sopenharmony_ci	compat_ulong_t s4;
4262306a36Sopenharmony_ci	compat_ulong_t s5;
4362306a36Sopenharmony_ci	compat_ulong_t s6;
4462306a36Sopenharmony_ci	compat_ulong_t s7;
4562306a36Sopenharmony_ci	compat_ulong_t s8;
4662306a36Sopenharmony_ci	compat_ulong_t s9;
4762306a36Sopenharmony_ci	compat_ulong_t s10;
4862306a36Sopenharmony_ci	compat_ulong_t s11;
4962306a36Sopenharmony_ci	compat_ulong_t t3;
5062306a36Sopenharmony_ci	compat_ulong_t t4;
5162306a36Sopenharmony_ci	compat_ulong_t t5;
5262306a36Sopenharmony_ci	compat_ulong_t t6;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic inline void regs_to_cregs(struct compat_user_regs_struct *cregs,
5662306a36Sopenharmony_ci				 struct pt_regs *regs)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	cregs->pc	= (compat_ulong_t) regs->epc;
5962306a36Sopenharmony_ci	cregs->ra	= (compat_ulong_t) regs->ra;
6062306a36Sopenharmony_ci	cregs->sp	= (compat_ulong_t) regs->sp;
6162306a36Sopenharmony_ci	cregs->gp	= (compat_ulong_t) regs->gp;
6262306a36Sopenharmony_ci	cregs->tp	= (compat_ulong_t) regs->tp;
6362306a36Sopenharmony_ci	cregs->t0	= (compat_ulong_t) regs->t0;
6462306a36Sopenharmony_ci	cregs->t1	= (compat_ulong_t) regs->t1;
6562306a36Sopenharmony_ci	cregs->t2	= (compat_ulong_t) regs->t2;
6662306a36Sopenharmony_ci	cregs->s0	= (compat_ulong_t) regs->s0;
6762306a36Sopenharmony_ci	cregs->s1	= (compat_ulong_t) regs->s1;
6862306a36Sopenharmony_ci	cregs->a0	= (compat_ulong_t) regs->a0;
6962306a36Sopenharmony_ci	cregs->a1	= (compat_ulong_t) regs->a1;
7062306a36Sopenharmony_ci	cregs->a2	= (compat_ulong_t) regs->a2;
7162306a36Sopenharmony_ci	cregs->a3	= (compat_ulong_t) regs->a3;
7262306a36Sopenharmony_ci	cregs->a4	= (compat_ulong_t) regs->a4;
7362306a36Sopenharmony_ci	cregs->a5	= (compat_ulong_t) regs->a5;
7462306a36Sopenharmony_ci	cregs->a6	= (compat_ulong_t) regs->a6;
7562306a36Sopenharmony_ci	cregs->a7	= (compat_ulong_t) regs->a7;
7662306a36Sopenharmony_ci	cregs->s2	= (compat_ulong_t) regs->s2;
7762306a36Sopenharmony_ci	cregs->s3	= (compat_ulong_t) regs->s3;
7862306a36Sopenharmony_ci	cregs->s4	= (compat_ulong_t) regs->s4;
7962306a36Sopenharmony_ci	cregs->s5	= (compat_ulong_t) regs->s5;
8062306a36Sopenharmony_ci	cregs->s6	= (compat_ulong_t) regs->s6;
8162306a36Sopenharmony_ci	cregs->s7	= (compat_ulong_t) regs->s7;
8262306a36Sopenharmony_ci	cregs->s8	= (compat_ulong_t) regs->s8;
8362306a36Sopenharmony_ci	cregs->s9	= (compat_ulong_t) regs->s9;
8462306a36Sopenharmony_ci	cregs->s10	= (compat_ulong_t) regs->s10;
8562306a36Sopenharmony_ci	cregs->s11	= (compat_ulong_t) regs->s11;
8662306a36Sopenharmony_ci	cregs->t3	= (compat_ulong_t) regs->t3;
8762306a36Sopenharmony_ci	cregs->t4	= (compat_ulong_t) regs->t4;
8862306a36Sopenharmony_ci	cregs->t5	= (compat_ulong_t) regs->t5;
8962306a36Sopenharmony_ci	cregs->t6	= (compat_ulong_t) regs->t6;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic inline void cregs_to_regs(struct compat_user_regs_struct *cregs,
9362306a36Sopenharmony_ci				 struct pt_regs *regs)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	regs->epc	= (unsigned long) cregs->pc;
9662306a36Sopenharmony_ci	regs->ra	= (unsigned long) cregs->ra;
9762306a36Sopenharmony_ci	regs->sp	= (unsigned long) cregs->sp;
9862306a36Sopenharmony_ci	regs->gp	= (unsigned long) cregs->gp;
9962306a36Sopenharmony_ci	regs->tp	= (unsigned long) cregs->tp;
10062306a36Sopenharmony_ci	regs->t0	= (unsigned long) cregs->t0;
10162306a36Sopenharmony_ci	regs->t1	= (unsigned long) cregs->t1;
10262306a36Sopenharmony_ci	regs->t2	= (unsigned long) cregs->t2;
10362306a36Sopenharmony_ci	regs->s0	= (unsigned long) cregs->s0;
10462306a36Sopenharmony_ci	regs->s1	= (unsigned long) cregs->s1;
10562306a36Sopenharmony_ci	regs->a0	= (unsigned long) cregs->a0;
10662306a36Sopenharmony_ci	regs->a1	= (unsigned long) cregs->a1;
10762306a36Sopenharmony_ci	regs->a2	= (unsigned long) cregs->a2;
10862306a36Sopenharmony_ci	regs->a3	= (unsigned long) cregs->a3;
10962306a36Sopenharmony_ci	regs->a4	= (unsigned long) cregs->a4;
11062306a36Sopenharmony_ci	regs->a5	= (unsigned long) cregs->a5;
11162306a36Sopenharmony_ci	regs->a6	= (unsigned long) cregs->a6;
11262306a36Sopenharmony_ci	regs->a7	= (unsigned long) cregs->a7;
11362306a36Sopenharmony_ci	regs->s2	= (unsigned long) cregs->s2;
11462306a36Sopenharmony_ci	regs->s3	= (unsigned long) cregs->s3;
11562306a36Sopenharmony_ci	regs->s4	= (unsigned long) cregs->s4;
11662306a36Sopenharmony_ci	regs->s5	= (unsigned long) cregs->s5;
11762306a36Sopenharmony_ci	regs->s6	= (unsigned long) cregs->s6;
11862306a36Sopenharmony_ci	regs->s7	= (unsigned long) cregs->s7;
11962306a36Sopenharmony_ci	regs->s8	= (unsigned long) cregs->s8;
12062306a36Sopenharmony_ci	regs->s9	= (unsigned long) cregs->s9;
12162306a36Sopenharmony_ci	regs->s10	= (unsigned long) cregs->s10;
12262306a36Sopenharmony_ci	regs->s11	= (unsigned long) cregs->s11;
12362306a36Sopenharmony_ci	regs->t3	= (unsigned long) cregs->t3;
12462306a36Sopenharmony_ci	regs->t4	= (unsigned long) cregs->t4;
12562306a36Sopenharmony_ci	regs->t5	= (unsigned long) cregs->t5;
12662306a36Sopenharmony_ci	regs->t6	= (unsigned long) cregs->t6;
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#endif /* __ASM_COMPAT_H */
130