root/arch/riscv/include/asm/compat.h
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __ASM_COMPAT_H
#define __ASM_COMPAT_H

#define COMPAT_UTS_MACHINE      "riscv32\0\0"

/*
 * Architecture specific compatibility types
 */
#include <linux/types.h>
#include <linux/sched.h>
#include <asm-generic/compat.h>

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 */