hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
 * Written by Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
#ifndef _COBALT_POSIX_CLOCK_H
#define _COBALT_POSIX_CLOCK_H
 
#include <linux/types.h>
#include <linux/time.h>
#include <linux/cpumask.h>
#include <cobalt/uapi/time.h>
#include <xenomai/posix/syscall.h>
 
#define ONE_BILLION             1000000000
 
struct xnclock;
 
static inline void ns2ts(struct timespec64 *ts, xnticks_t nsecs)
{
   ts->tv_sec = xnclock_divrem_billion(nsecs, &ts->tv_nsec);
}
 
static inline void u_ns2ts(struct __user_old_timespec *ts, xnticks_t nsecs)
{
   ts->tv_sec = xnclock_divrem_billion(nsecs, &ts->tv_nsec);
}
 
static inline xnticks_t ts2ns(const struct timespec64 *ts)
{
   xnticks_t nsecs = ts->tv_nsec;
 
   if (ts->tv_sec)
       nsecs += (xnticks_t)ts->tv_sec * ONE_BILLION;
 
   return nsecs;
}
 
static inline xnticks_t u_ts2ns(const struct __user_old_timespec *ts)
{
   xnticks_t nsecs = ts->tv_nsec;
 
   if (ts->tv_sec)
       nsecs += (xnticks_t)ts->tv_sec * ONE_BILLION;
 
   return nsecs;
}
 
static inline xnticks_t tv2ns(const struct __kernel_old_timeval *tv)
{
   xnticks_t nsecs = tv->tv_usec * 1000;
 
   if (tv->tv_sec)
       nsecs += (xnticks_t)tv->tv_sec * ONE_BILLION;
 
   return nsecs;
}
 
static inline void ticks2tv(struct __kernel_old_timeval *tv, xnticks_t ticks)
{
   unsigned long nsecs;
 
   tv->tv_sec = xnclock_divrem_billion(ticks, &nsecs);
   tv->tv_usec = nsecs / 1000;
}
 
static inline xnticks_t clock_get_ticks(clockid_t clock_id)
{
   return clock_id == CLOCK_REALTIME ?
       xnclock_read_realtime(&nkclock) :
       xnclock_read_monotonic(&nkclock);
}
 
static inline int clock_flag(int flag, clockid_t clock_id)
{
   if ((flag & TIMER_ABSTIME) == 0)
       return XN_RELATIVE;
 
   if (clock_id == CLOCK_REALTIME)
       return XN_REALTIME;
 
   return XN_ABSOLUTE;
}
 
int __cobalt_clock_getres(clockid_t clock_id,
             struct timespec64 *ts);
 
int __cobalt_clock_getres64(clockid_t clock_id,
           struct __kernel_timespec __user *u_ts);
 
int __cobalt_clock_gettime(clockid_t clock_id,
              struct timespec64 *ts);
 
int __cobalt_clock_gettime64(clockid_t clock_id,
           struct __kernel_timespec __user *u_ts);
 
int __cobalt_clock_settime(clockid_t clock_id,
              const struct timespec64 *ts);
 
int __cobalt_clock_settime64(clockid_t clock_id,
           const struct __kernel_timespec __user *u_ts);
 
int __cobalt_clock_adjtime(clockid_t clock_id,
              struct __kernel_timex *tx);
 
int __cobalt_clock_adjtime64(clockid_t clock_id,
           struct __kernel_timex __user *u_tx);
 
int __cobalt_clock_nanosleep(clockid_t clock_id, int flags,
                const struct timespec64 *rqt,
                struct timespec64 *rmt);
 
int __cobalt_clock_nanosleep64(clockid_t clock_id, int flags,
       const struct __kernel_timespec __user *u_rqt,
       struct __kernel_timespec __user *u_rmt);
 
COBALT_SYSCALL_DECL(clock_getres,
           (clockid_t clock_id, struct __user_old_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_getres64,
           (clockid_t clock_id, struct __kernel_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_gettime,
           (clockid_t clock_id, struct __user_old_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_gettime64,
           (clockid_t clock_id, struct __kernel_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_settime,
           (clockid_t clock_id, const struct __user_old_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_settime64,
           (clockid_t clock_id,
            const struct __kernel_timespec __user *u_ts));
 
COBALT_SYSCALL_DECL(clock_adjtime,
           (clockid_t clock_id, struct __user_old_timex __user *u_tx));
 
COBALT_SYSCALL_DECL(clock_adjtime64,
           (clockid_t clock_id, struct __kernel_timex __user *u_tx));
 
COBALT_SYSCALL_DECL(clock_nanosleep,
           (clockid_t clock_id, int flags,
            const struct __user_old_timespec __user *u_rqt,
            struct __user_old_timespec __user *u_rmt));
 
COBALT_SYSCALL_DECL(clock_nanosleep64,
           (clockid_t clock_id, int flags,
            const struct __kernel_timespec __user *u_rqt,
            struct __kernel_timespec __user *u_rmt));
 
int cobalt_clock_register(struct xnclock *clock,
             const cpumask_t *affinity,
             clockid_t *clk_id);
 
void cobalt_clock_deregister(struct xnclock *clock);
 
struct xnclock *cobalt_clock_find(clockid_t clock_id);
 
extern DECLARE_BITMAP(cobalt_clock_extids, COBALT_MAX_EXTCLOCKS);
 
#endif /* !_COBALT_POSIX_CLOCK_H */