/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef __ASM_COMPAT_H #define __ASM_COMPAT_H #define COMPAT_UTS_MACHINE "riscv\0\0" /* * Architecture specific compatibility types */ #include #include #include #include static inline int is_compat_task(void) { if (!IS_ENABLED(CONFIG_COMPAT)) return 0; return test_thread_flag(TIF_32BIT); } static inline int is_compat_thread(struct thread_info *thread) { if (!IS_ENABLED(CONFIG_COMPAT)) return 0; return test_ti_thread_flag(thread, TIF_32BIT); } static inline void set_compat_task(bool is_compat) { if (is_compat) set_thread_flag(TIF_32BIT); else clear_thread_flag(TIF_32BIT); } struct compat_user_regs_struct { compat_ulong_t pc; compat_ulong_t ra; compat_ulong_t sp; compat_ulong_t gp; compat_ulong_t tp; compat_ulong_t t0; compat_ulong_t t1; compat_ulong_t t2; compat_ulong_t s0; compat_ulong_t s1; compat_ulong_t a0; compat_ulong_t a1; compat_ulong_t a2; compat_ulong_t a3; compat_ulong_t a4; compat_ulong_t a5; compat_ulong_t a6; compat_ulong_t a7; compat_ulong_t s2; compat_ulong_t s3; compat_ulong_t s4; compat_ulong_t s5; compat_ulong_t s6; compat_ulong_t s7; compat_ulong_t s8; compat_ulong_t s9; compat_ulong_t s10; compat_ulong_t s11; compat_ulong_t t3; compat_ulong_t t4; compat_ulong_t t5; compat_ulong_t t6; }; static inline void regs_to_cregs(struct compat_user_regs_struct *cregs, struct pt_regs *regs) { cregs->pc = (compat_ulong_t) regs->epc; cregs->ra = (compat_ulong_t) regs->ra; cregs->sp = (compat_ulong_t) regs->sp; cregs->gp = (compat_ulong_t) regs->gp; cregs->tp = (compat_ulong_t) regs->tp; cregs->t0 = (compat_ulong_t) regs->t0; cregs->t1 = (compat_ulong_t) regs->t1; cregs->t2 = (compat_ulong_t) regs->t2; cregs->s0 = (compat_ulong_t) regs->s0; cregs->s1 = (compat_ulong_t) regs->s1; cregs->a0 = (compat_ulong_t) regs->a0; cregs->a1 = (compat_ulong_t) regs->a1; cregs->a2 = (compat_ulong_t) regs->a2; cregs->a3 = (compat_ulong_t) regs->a3; cregs->a4 = (compat_ulong_t) regs->a4; cregs->a5 = (compat_ulong_t) regs->a5; cregs->a6 = (compat_ulong_t) regs->a6; cregs->a7 = (compat_ulong_t) regs->a7; cregs->s2 = (compat_ulong_t) regs->s2; cregs->s3 = (compat_ulong_t) regs->s3; cregs->s4 = (compat_ulong_t) regs->s4; cregs->s5 = (compat_ulong_t) regs->s5; cregs->s6 = (compat_ulong_t) regs->s6; cregs->s7 = (compat_ulong_t) regs->s7; cregs->s8 = (compat_ulong_t) regs->s8; cregs->s9 = (compat_ulong_t) regs->s9; cregs->s10 = (compat_ulong_t) regs->s10; cregs->s11 = (compat_ulong_t) regs->s11; cregs->t3 = (compat_ulong_t) regs->t3; cregs->t4 = (compat_ulong_t) regs->t4; cregs->t5 = (compat_ulong_t) regs->t5; cregs->t6 = (compat_ulong_t) regs->t6; }; static inline void cregs_to_regs(struct compat_user_regs_struct *cregs, struct pt_regs *regs) { regs->epc = (unsigned long) cregs->pc; regs->ra = (unsigned long) cregs->ra; regs->sp = (unsigned long) cregs->sp; regs->gp = (unsigned long) cregs->gp; regs->tp = (unsigned long) cregs->tp; regs->t0 = (unsigned long) cregs->t0; regs->t1 = (unsigned long) cregs->t1; regs->t2 = (unsigned long) cregs->t2; regs->s0 = (unsigned long) cregs->s0; regs->s1 = (unsigned long) cregs->s1; regs->a0 = (unsigned long) cregs->a0; regs->a1 = (unsigned long) cregs->a1; regs->a2 = (unsigned long) cregs->a2; regs->a3 = (unsigned long) cregs->a3; regs->a4 = (unsigned long) cregs->a4; regs->a5 = (unsigned long) cregs->a5; regs->a6 = (unsigned long) cregs->a6; regs->a7 = (unsigned long) cregs->a7; regs->s2 = (unsigned long) cregs->s2; regs->s3 = (unsigned long) cregs->s3; regs->s4 = (unsigned long) cregs->s4; regs->s5 = (unsigned long) cregs->s5; regs->s6 = (unsigned long) cregs->s6; regs->s7 = (unsigned long) cregs->s7; regs->s8 = (unsigned long) cregs->s8; regs->s9 = (unsigned long) cregs->s9; regs->s10 = (unsigned long) cregs->s10; regs->s11 = (unsigned long) cregs->s11; regs->t3 = (unsigned long) cregs->t3; regs->t4 = (unsigned long) cregs->t4; regs->t5 = (unsigned long) cregs->t5; regs->t6 = (unsigned long) cregs->t6; }; #endif /* __ASM_COMPAT_H */