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