2021-07-14 00:44:10 +02:00
|
|
|
#ifndef _UAPI_E2K_API_H_
|
|
|
|
#define _UAPI_E2K_API_H_
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
typedef unsigned char __e2k_u8_t;
|
|
|
|
typedef unsigned short int __e2k_u16_t;
|
|
|
|
typedef unsigned int __e2k_u32_t;
|
|
|
|
typedef unsigned long long __e2k_u64_t;
|
|
|
|
typedef void *__e2k_ptr_t;
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
|
|
|
|
#ifndef __KERNEL__
|
|
|
|
|
|
|
|
#define E2K_SET_REG(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("adds \t0x0, %0, %%r" #reg_no \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u32_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_DREG(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("addd \t0x0, %0, %%dr" #reg_no \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u64_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_DGREG(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("addd \t0x0, %0, %%dg" #reg_no \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u64_t) (val))); \
|
|
|
|
})
|
|
|
|
#define E2K_SET_DGREG_NV(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm ("addd \t%0, 0, %%dg" #reg_no \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u64_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
#define E2K_GET_BREG(reg_no) \
|
|
|
|
({ \
|
|
|
|
register __e2k_u32_t res; \
|
|
|
|
asm volatile ("adds \t0x0, %%b[" #reg_no "], %0" \
|
|
|
|
: "=r" (res)); \
|
|
|
|
res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_GET_DBREG(reg_no) \
|
|
|
|
({ \
|
|
|
|
register __e2k_u64_t res; \
|
|
|
|
asm volatile ("addd \t0x0, %%db[" #reg_no "], %0" \
|
|
|
|
: "=r" (res)); \
|
|
|
|
res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_BREG(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("adds \t0x0, %0, %%b[" #reg_no "]" \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u32_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_DBREG(reg_no, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("addd \t0x0, %0, %%db[" #reg_no "]" \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u64_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_GET_SREG(reg_mnemonic) \
|
|
|
|
({ \
|
|
|
|
register __e2k_u32_t res; \
|
|
|
|
asm volatile ("rrs \t%%" #reg_mnemonic ", %0" \
|
|
|
|
: "=r" (res)); \
|
|
|
|
res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_GET_DSREG(reg_mnemonic) \
|
|
|
|
({ \
|
|
|
|
register __e2k_u64_t res; \
|
|
|
|
asm volatile ("rrd \t%%" #reg_mnemonic ", %0" \
|
|
|
|
: "=r" (res)); \
|
|
|
|
res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_SREG(reg_mnemonic, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("rws \t%0, %%" #reg_mnemonic \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u32_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SET_DSREG(reg_mnemonic, val) \
|
|
|
|
({ \
|
|
|
|
asm volatile ("rwd \t%0, %%" #reg_mnemonic \
|
|
|
|
: \
|
|
|
|
: "ri" ((__e2k_u64_t) (val))); \
|
|
|
|
})
|
|
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
2021-08-26 00:47:50 +02:00
|
|
|
typedef unsigned long __e2k_syscall_arg_t;
|
2021-07-14 00:44:10 +02:00
|
|
|
|
|
|
|
#define E2K_SYSCALL_CLOBBERS \
|
|
|
|
"ctpr1", "ctpr2", "ctpr3", \
|
|
|
|
"b[0]", "b[1]", "b[2]", "b[3]", \
|
|
|
|
"b[4]", "b[5]", "b[6]", "b[7]"
|
|
|
|
|
|
|
|
/* Transaction operation transaction of argument type
|
|
|
|
* __e2k_syscall_arg_t */
|
|
|
|
#ifdef __ptr64__
|
|
|
|
#define __E2K_SYSCAL_ARG_ADD "addd,s"
|
|
|
|
#else
|
|
|
|
#define __E2K_SYSCAL_ARG_ADD "adds,s"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_0(_trap, _sys_num, _arg1) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_1(_trap, _sys_num, _arg1) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_2(_trap, _sys_num, _arg1, _arg2) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_3(_trap, _sys_num, _arg1, _arg2, _arg3) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_4(_trap, _sys_num, _arg1, _arg2, _arg3, _arg4) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg4], %%b[4]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)), \
|
|
|
|
[arg4] "ri" ((__e2k_syscall_arg_t) (_arg4)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_5(_trap, _sys_num, _arg1, _arg2, _arg3, _arg4, _arg5) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg4], %%b[4]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg5], %%b[5]\n\t" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)), \
|
|
|
|
[arg4] "ri" ((__e2k_syscall_arg_t) (_arg4)), \
|
|
|
|
[arg5] "ri" ((__e2k_syscall_arg_t) (_arg5)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_6(_trap, _sys_num, _arg1, \
|
|
|
|
_arg2, _arg3, _arg4, _arg5, _arg6) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg4], %%b[4]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg5], %%b[5]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg6], %%b[6]\n\t" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)), \
|
|
|
|
[arg4] "ri" ((__e2k_syscall_arg_t) (_arg4)), \
|
|
|
|
[arg5] "ri" ((__e2k_syscall_arg_t) (_arg5)), \
|
|
|
|
[arg6] "ri" ((__e2k_syscall_arg_t) (_arg6)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define __E2K_SYSCALL_7(_trap, _sys_num, _arg1, \
|
|
|
|
_arg2, _arg3, _arg4, _arg5, _arg6, _arg7) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ("{\n" \
|
|
|
|
"sdisp %%ctpr1, %[trap]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[sys_num], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg4], %%b[4]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg5], %%b[5]\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
"{\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg6], %%b[6]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg7], %%b[7]\n\t" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
"}\n" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]" \
|
|
|
|
: [res] "=r" (__res) \
|
|
|
|
: [trap] "i" ((int) (_trap)), \
|
|
|
|
[sys_num] "ri" ((__e2k_syscall_arg_t) (_sys_num)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)), \
|
|
|
|
[arg4] "ri" ((__e2k_syscall_arg_t) (_arg4)), \
|
|
|
|
[arg5] "ri" ((__e2k_syscall_arg_t) (_arg5)), \
|
|
|
|
[arg6] "ri" ((__e2k_syscall_arg_t) (_arg6)), \
|
|
|
|
[arg7] "ri" ((__e2k_syscall_arg_t) (_arg7)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#define E2K_SYSCALL(trap, sys_num, num_args, args...) \
|
|
|
|
__E2K_SYSCALL_##num_args(trap, sys_num, args)
|
|
|
|
|
|
|
|
#define ASM_CALL_8_ARGS(func_name_to_call, _arg0, _arg1, _arg2, _arg3, \
|
|
|
|
_arg4, _arg5, _arg6, _arg7) \
|
|
|
|
({ \
|
|
|
|
register __e2k_syscall_arg_t __res; \
|
|
|
|
asm volatile ( \
|
|
|
|
"{\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg0], %%b[0]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg1], %%b[1]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg2], %%b[2]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg3], %%b[3]\n\t" \
|
|
|
|
"disp %%ctpr1, " #func_name_to_call "\n\t" \
|
|
|
|
"}\n\t" \
|
|
|
|
"{\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg4], %%b[4]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg5], %%b[5]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg6], %%b[6]\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %[arg7], %%b[7]\n\t" \
|
|
|
|
"call %%ctpr1, wbs = %#\n\t" \
|
|
|
|
"}\n\t" \
|
|
|
|
__E2K_SYSCAL_ARG_ADD " 0x0, %%b[0], %[res]\n\t" \
|
|
|
|
: \
|
|
|
|
[res] "=r" (__res) \
|
|
|
|
: \
|
|
|
|
[arg0] "ri" ((__e2k_syscall_arg_t) (_arg0)), \
|
|
|
|
[arg1] "ri" ((__e2k_syscall_arg_t) (_arg1)), \
|
|
|
|
[arg2] "ri" ((__e2k_syscall_arg_t) (_arg2)), \
|
|
|
|
[arg3] "ri" ((__e2k_syscall_arg_t) (_arg3)), \
|
|
|
|
[arg4] "ri" ((__e2k_syscall_arg_t) (_arg4)), \
|
|
|
|
[arg5] "ri" ((__e2k_syscall_arg_t) (_arg5)), \
|
|
|
|
[arg6] "ri" ((__e2k_syscall_arg_t) (_arg6)), \
|
|
|
|
[arg7] "ri" ((__e2k_syscall_arg_t) (_arg7)) \
|
|
|
|
: E2K_SYSCALL_CLOBBERS); \
|
|
|
|
__res; \
|
|
|
|
})
|
|
|
|
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* _UAPI_E2K_API_H_ */
|