linux-headers/arch/e2k/include/uapi/asm/e2k_api.h

354 lines
11 KiB
C

#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__
typedef unsigned long __e2k_syscall_arg_t;
#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_ */