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>
29#include <cobalt/uapi/kernel/types.h>
31#define __xn_copy_from_user(dstP, srcP, n) raw_copy_from_user(dstP, srcP, n)
32#define __xn_copy_to_user(dstP, srcP, n) raw_copy_to_user(dstP, srcP, n)
33#define __xn_put_user(src, dstP) __put_user(src, dstP)
34#define __xn_get_user(dst, srcP) __get_user(dst, srcP)
35#define __xn_strncpy_from_user(dstP, srcP, n) strncpy_from_user(dstP, srcP, n)
37static inline int cobalt_copy_from_user(
void *dst,
const void __user *src,
40 size_t remaining = size;
42 if (likely(access_ok(src, size)))
43 remaining = __xn_copy_from_user(dst, src, size);
45 if (unlikely(remaining > 0)) {
46 memset(dst + (size - remaining), 0, remaining);
52static inline int cobalt_copy_to_user(
void __user *dst,
const void *src,
55 if (unlikely(!access_ok(dst, size) ||
56 __xn_copy_to_user(dst, src, size)))
61static inline int cobalt_strncpy_from_user(
char *dst,
const char __user *src,
64 if (unlikely(!access_ok(src, 1)))
67 return __xn_strncpy_from_user(dst, src, count);
77cobalt_get_old_timespec(
struct timespec64 *dst,
78 const struct __kernel_old_timespec __user *src)
80 struct __kernel_old_timespec u_ts;
83 ret = cobalt_copy_from_user(&u_ts, src,
sizeof(u_ts));
87 dst->tv_sec = u_ts.tv_sec;
88 dst->tv_nsec = u_ts.tv_nsec;
94cobalt_put_old_timespec(
struct __kernel_old_timespec __user *dst,
95 const struct timespec64 *src)
97 struct __kernel_old_timespec u_ts;
100 u_ts.tv_sec = src->tv_sec;
101 u_ts.tv_nsec = src->tv_nsec;
103 ret = cobalt_copy_to_user(dst, &u_ts,
sizeof(*dst));
111cobalt_get_itimerspec32(
struct itimerspec64 *dst,
112 const struct old_itimerspec32 __user *src)
114 struct old_itimerspec32 u_its;
117 ret = cobalt_copy_from_user(&u_its, src,
sizeof(u_its));
121 dst->it_interval.tv_sec = u_its.it_interval.tv_sec;
122 dst->it_interval.tv_nsec = u_its.it_interval.tv_nsec;
123 dst->it_value.tv_sec = u_its.it_value.tv_sec;
124 dst->it_value.tv_nsec = u_its.it_value.tv_nsec;
129static inline int cobalt_put_itimerspec32(
struct old_itimerspec32 __user *dst,
130 const struct itimerspec64 *src)
132 struct old_itimerspec32 u_its;
134 u_its.it_interval.tv_sec = src->it_interval.tv_sec;
135 u_its.it_interval.tv_nsec = src->it_interval.tv_nsec;
136 u_its.it_value.tv_sec = src->it_value.tv_sec;
137 u_its.it_value.tv_nsec = src->it_value.tv_nsec;
139 return cobalt_copy_to_user(dst, &u_its,
sizeof(*dst));
142static inline struct timespec64
143cobalt_timeval_to_timespec64(const struct __kernel_old_timeval *src)
145 struct timespec64 ts;
147 ts.tv_sec = src->tv_sec + (src->tv_usec / USEC_PER_SEC);
148 ts.tv_nsec = (src->tv_usec % USEC_PER_SEC) * NSEC_PER_USEC;
153static inline struct __kernel_old_timeval
154cobalt_timespec64_to_timeval(const struct timespec64 *src)
156 struct __kernel_old_timeval tv;
158 tv.tv_sec = src->tv_sec + (src->tv_nsec / NSEC_PER_SEC);
159 tv.tv_usec = (src->tv_nsec % NSEC_PER_SEC) / NSEC_PER_USEC;
165#define __COBALT_COMPAT_BIT 0x1
167#define __COBALT_COMPATX_BIT 0x2