1*c9945492SAndroid Build Coastguard Worker #include <sys/timex.h>
2*c9945492SAndroid Build Coastguard Worker #include <time.h>
3*c9945492SAndroid Build Coastguard Worker #include <errno.h>
4*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
5*c9945492SAndroid Build Coastguard Worker
6*c9945492SAndroid Build Coastguard Worker #define IS32BIT(x) !((x)+0x80000000ULL>>32)
7*c9945492SAndroid Build Coastguard Worker
8*c9945492SAndroid Build Coastguard Worker struct ktimex64 {
9*c9945492SAndroid Build Coastguard Worker unsigned modes;
10*c9945492SAndroid Build Coastguard Worker int :32;
11*c9945492SAndroid Build Coastguard Worker long long offset, freq, maxerror, esterror;
12*c9945492SAndroid Build Coastguard Worker int status;
13*c9945492SAndroid Build Coastguard Worker int :32;
14*c9945492SAndroid Build Coastguard Worker long long constant, precision, tolerance;
15*c9945492SAndroid Build Coastguard Worker long long time_sec, time_usec;
16*c9945492SAndroid Build Coastguard Worker long long tick, ppsfreq, jitter;
17*c9945492SAndroid Build Coastguard Worker int shift;
18*c9945492SAndroid Build Coastguard Worker int :32;
19*c9945492SAndroid Build Coastguard Worker long long stabil, jitcnt, calcnt, errcnt, stbcnt;
20*c9945492SAndroid Build Coastguard Worker int tai;
21*c9945492SAndroid Build Coastguard Worker int __padding[11];
22*c9945492SAndroid Build Coastguard Worker };
23*c9945492SAndroid Build Coastguard Worker
24*c9945492SAndroid Build Coastguard Worker struct ktimex {
25*c9945492SAndroid Build Coastguard Worker unsigned modes;
26*c9945492SAndroid Build Coastguard Worker long offset, freq, maxerror, esterror;
27*c9945492SAndroid Build Coastguard Worker int status;
28*c9945492SAndroid Build Coastguard Worker long constant, precision, tolerance;
29*c9945492SAndroid Build Coastguard Worker long time_sec, time_usec;
30*c9945492SAndroid Build Coastguard Worker long tick, ppsfreq, jitter;
31*c9945492SAndroid Build Coastguard Worker int shift;
32*c9945492SAndroid Build Coastguard Worker long stabil, jitcnt, calcnt, errcnt, stbcnt;
33*c9945492SAndroid Build Coastguard Worker int tai;
34*c9945492SAndroid Build Coastguard Worker int __padding[11];
35*c9945492SAndroid Build Coastguard Worker };
36*c9945492SAndroid Build Coastguard Worker
clock_adjtime(clockid_t clock_id,struct timex * utx)37*c9945492SAndroid Build Coastguard Worker int clock_adjtime (clockid_t clock_id, struct timex *utx)
38*c9945492SAndroid Build Coastguard Worker {
39*c9945492SAndroid Build Coastguard Worker int r = -ENOSYS;
40*c9945492SAndroid Build Coastguard Worker #ifdef SYS_clock_adjtime64
41*c9945492SAndroid Build Coastguard Worker struct ktimex64 ktx = {
42*c9945492SAndroid Build Coastguard Worker .modes = utx->modes,
43*c9945492SAndroid Build Coastguard Worker .offset = utx->offset,
44*c9945492SAndroid Build Coastguard Worker .freq = utx->freq,
45*c9945492SAndroid Build Coastguard Worker .maxerror = utx->maxerror,
46*c9945492SAndroid Build Coastguard Worker .esterror = utx->esterror,
47*c9945492SAndroid Build Coastguard Worker .status = utx->status,
48*c9945492SAndroid Build Coastguard Worker .constant = utx->constant,
49*c9945492SAndroid Build Coastguard Worker .precision = utx->precision,
50*c9945492SAndroid Build Coastguard Worker .tolerance = utx->tolerance,
51*c9945492SAndroid Build Coastguard Worker .time_sec = utx->time.tv_sec,
52*c9945492SAndroid Build Coastguard Worker .time_usec = utx->time.tv_usec,
53*c9945492SAndroid Build Coastguard Worker .tick = utx->tick,
54*c9945492SAndroid Build Coastguard Worker .ppsfreq = utx->ppsfreq,
55*c9945492SAndroid Build Coastguard Worker .jitter = utx->jitter,
56*c9945492SAndroid Build Coastguard Worker .shift = utx->shift,
57*c9945492SAndroid Build Coastguard Worker .stabil = utx->stabil,
58*c9945492SAndroid Build Coastguard Worker .jitcnt = utx->jitcnt,
59*c9945492SAndroid Build Coastguard Worker .calcnt = utx->calcnt,
60*c9945492SAndroid Build Coastguard Worker .errcnt = utx->errcnt,
61*c9945492SAndroid Build Coastguard Worker .stbcnt = utx->stbcnt,
62*c9945492SAndroid Build Coastguard Worker .tai = utx->tai,
63*c9945492SAndroid Build Coastguard Worker };
64*c9945492SAndroid Build Coastguard Worker r = __syscall(SYS_clock_adjtime64, clock_id, &ktx);
65*c9945492SAndroid Build Coastguard Worker if (r>=0) {
66*c9945492SAndroid Build Coastguard Worker utx->modes = ktx.modes;
67*c9945492SAndroid Build Coastguard Worker utx->offset = ktx.offset;
68*c9945492SAndroid Build Coastguard Worker utx->freq = ktx.freq;
69*c9945492SAndroid Build Coastguard Worker utx->maxerror = ktx.maxerror;
70*c9945492SAndroid Build Coastguard Worker utx->esterror = ktx.esterror;
71*c9945492SAndroid Build Coastguard Worker utx->status = ktx.status;
72*c9945492SAndroid Build Coastguard Worker utx->constant = ktx.constant;
73*c9945492SAndroid Build Coastguard Worker utx->precision = ktx.precision;
74*c9945492SAndroid Build Coastguard Worker utx->tolerance = ktx.tolerance;
75*c9945492SAndroid Build Coastguard Worker utx->time.tv_sec = ktx.time_sec;
76*c9945492SAndroid Build Coastguard Worker utx->time.tv_usec = ktx.time_usec;
77*c9945492SAndroid Build Coastguard Worker utx->tick = ktx.tick;
78*c9945492SAndroid Build Coastguard Worker utx->ppsfreq = ktx.ppsfreq;
79*c9945492SAndroid Build Coastguard Worker utx->jitter = ktx.jitter;
80*c9945492SAndroid Build Coastguard Worker utx->shift = ktx.shift;
81*c9945492SAndroid Build Coastguard Worker utx->stabil = ktx.stabil;
82*c9945492SAndroid Build Coastguard Worker utx->jitcnt = ktx.jitcnt;
83*c9945492SAndroid Build Coastguard Worker utx->calcnt = ktx.calcnt;
84*c9945492SAndroid Build Coastguard Worker utx->errcnt = ktx.errcnt;
85*c9945492SAndroid Build Coastguard Worker utx->stbcnt = ktx.stbcnt;
86*c9945492SAndroid Build Coastguard Worker utx->tai = ktx.tai;
87*c9945492SAndroid Build Coastguard Worker }
88*c9945492SAndroid Build Coastguard Worker if (SYS_clock_adjtime == SYS_clock_adjtime64 || r!=-ENOSYS)
89*c9945492SAndroid Build Coastguard Worker return __syscall_ret(r);
90*c9945492SAndroid Build Coastguard Worker if ((utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec))
91*c9945492SAndroid Build Coastguard Worker return __syscall_ret(-ENOTSUP);
92*c9945492SAndroid Build Coastguard Worker #endif
93*c9945492SAndroid Build Coastguard Worker if (sizeof(time_t) > sizeof(long)) {
94*c9945492SAndroid Build Coastguard Worker struct ktimex ktx = {
95*c9945492SAndroid Build Coastguard Worker .modes = utx->modes,
96*c9945492SAndroid Build Coastguard Worker .offset = utx->offset,
97*c9945492SAndroid Build Coastguard Worker .freq = utx->freq,
98*c9945492SAndroid Build Coastguard Worker .maxerror = utx->maxerror,
99*c9945492SAndroid Build Coastguard Worker .esterror = utx->esterror,
100*c9945492SAndroid Build Coastguard Worker .status = utx->status,
101*c9945492SAndroid Build Coastguard Worker .constant = utx->constant,
102*c9945492SAndroid Build Coastguard Worker .precision = utx->precision,
103*c9945492SAndroid Build Coastguard Worker .tolerance = utx->tolerance,
104*c9945492SAndroid Build Coastguard Worker .time_sec = utx->time.tv_sec,
105*c9945492SAndroid Build Coastguard Worker .time_usec = utx->time.tv_usec,
106*c9945492SAndroid Build Coastguard Worker .tick = utx->tick,
107*c9945492SAndroid Build Coastguard Worker .ppsfreq = utx->ppsfreq,
108*c9945492SAndroid Build Coastguard Worker .jitter = utx->jitter,
109*c9945492SAndroid Build Coastguard Worker .shift = utx->shift,
110*c9945492SAndroid Build Coastguard Worker .stabil = utx->stabil,
111*c9945492SAndroid Build Coastguard Worker .jitcnt = utx->jitcnt,
112*c9945492SAndroid Build Coastguard Worker .calcnt = utx->calcnt,
113*c9945492SAndroid Build Coastguard Worker .errcnt = utx->errcnt,
114*c9945492SAndroid Build Coastguard Worker .stbcnt = utx->stbcnt,
115*c9945492SAndroid Build Coastguard Worker .tai = utx->tai,
116*c9945492SAndroid Build Coastguard Worker };
117*c9945492SAndroid Build Coastguard Worker #ifdef SYS_adjtimex
118*c9945492SAndroid Build Coastguard Worker if (clock_id==CLOCK_REALTIME) r = __syscall(SYS_adjtimex, &ktx);
119*c9945492SAndroid Build Coastguard Worker else
120*c9945492SAndroid Build Coastguard Worker #endif
121*c9945492SAndroid Build Coastguard Worker r = __syscall(SYS_clock_adjtime, clock_id, &ktx);
122*c9945492SAndroid Build Coastguard Worker if (r>=0) {
123*c9945492SAndroid Build Coastguard Worker utx->modes = ktx.modes;
124*c9945492SAndroid Build Coastguard Worker utx->offset = ktx.offset;
125*c9945492SAndroid Build Coastguard Worker utx->freq = ktx.freq;
126*c9945492SAndroid Build Coastguard Worker utx->maxerror = ktx.maxerror;
127*c9945492SAndroid Build Coastguard Worker utx->esterror = ktx.esterror;
128*c9945492SAndroid Build Coastguard Worker utx->status = ktx.status;
129*c9945492SAndroid Build Coastguard Worker utx->constant = ktx.constant;
130*c9945492SAndroid Build Coastguard Worker utx->precision = ktx.precision;
131*c9945492SAndroid Build Coastguard Worker utx->tolerance = ktx.tolerance;
132*c9945492SAndroid Build Coastguard Worker utx->time.tv_sec = ktx.time_sec;
133*c9945492SAndroid Build Coastguard Worker utx->time.tv_usec = ktx.time_usec;
134*c9945492SAndroid Build Coastguard Worker utx->tick = ktx.tick;
135*c9945492SAndroid Build Coastguard Worker utx->ppsfreq = ktx.ppsfreq;
136*c9945492SAndroid Build Coastguard Worker utx->jitter = ktx.jitter;
137*c9945492SAndroid Build Coastguard Worker utx->shift = ktx.shift;
138*c9945492SAndroid Build Coastguard Worker utx->stabil = ktx.stabil;
139*c9945492SAndroid Build Coastguard Worker utx->jitcnt = ktx.jitcnt;
140*c9945492SAndroid Build Coastguard Worker utx->calcnt = ktx.calcnt;
141*c9945492SAndroid Build Coastguard Worker utx->errcnt = ktx.errcnt;
142*c9945492SAndroid Build Coastguard Worker utx->stbcnt = ktx.stbcnt;
143*c9945492SAndroid Build Coastguard Worker utx->tai = ktx.tai;
144*c9945492SAndroid Build Coastguard Worker }
145*c9945492SAndroid Build Coastguard Worker return __syscall_ret(r);
146*c9945492SAndroid Build Coastguard Worker }
147*c9945492SAndroid Build Coastguard Worker #ifdef SYS_adjtimex
148*c9945492SAndroid Build Coastguard Worker if (clock_id==CLOCK_REALTIME) return syscall(SYS_adjtimex, utx);
149*c9945492SAndroid Build Coastguard Worker #endif
150*c9945492SAndroid Build Coastguard Worker return syscall(SYS_clock_adjtime, clock_id, utx);
151*c9945492SAndroid Build Coastguard Worker }
152