19 #ifndef _COBALT_ASM_GENERIC_SYSCALL_H
20 #define _COBALT_ASM_GENERIC_SYSCALL_H
22 #include <linux/types.h>
23 #include <linux/version.h>
24 #include <linux/uaccess.h>
25 #include <asm/xenomai/features.h>
26 #include <asm/xenomai/wrappers.h>
27 #include <asm/xenomai/machine.h>
28 #include <cobalt/uapi/asm-generic/syscall.h>
30 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
31 #define access_rok(addr, size) access_ok((addr), (size))
32 #define access_wok(addr, size) access_ok((addr), (size))
34 #define access_rok(addr, size) access_ok(VERIFY_READ, (addr), (size))
35 #define access_wok(addr, size) access_ok(VERIFY_WRITE, (addr), (size))
38 #define __xn_reg_arglist(regs) \
39 __xn_reg_arg1(regs), \
40 __xn_reg_arg2(regs), \
41 __xn_reg_arg3(regs), \
42 __xn_reg_arg4(regs), \
45 #define __xn_copy_from_user(dstP, srcP, n) raw_copy_from_user(dstP, srcP, n)
46 #define __xn_copy_to_user(dstP, srcP, n) raw_copy_to_user(dstP, srcP, n)
47 #define __xn_put_user(src, dstP) __put_user(src, dstP)
48 #define __xn_get_user(dst, srcP) __get_user(dst, srcP)
49 #define __xn_strncpy_from_user(dstP, srcP, n) strncpy_from_user(dstP, srcP, n)
51 static inline int cobalt_copy_from_user(
void *dst,
const void __user *src,
54 size_t remaining = size;
56 if (likely(access_rok(src, size)))
57 remaining = __xn_copy_from_user(dst, src, size);
59 if (unlikely(remaining > 0)) {
60 memset(dst + (size - remaining), 0, remaining);
66 static inline int cobalt_copy_to_user(
void __user *dst,
const void *src,
69 if (unlikely(!access_wok(dst, size) ||
70 __xn_copy_to_user(dst, src, size)))
75 static inline int cobalt_strncpy_from_user(
char *dst,
const char __user *src,
78 if (unlikely(!access_rok(src, 1)))
81 return __xn_strncpy_from_user(dst, src, count);
85 #define __COBALT_COMPAT_BIT 0x1
87 #define __COBALT_COMPATX_BIT 0x2