blob: 1d9cf247ca91f7f527fb31cad6abd00e8d69749b [file] [log] [blame]
Stefan Sørensenb88a6f82014-01-31 12:01:01 +01001#include "defs.h"
2#include <sys/ioctl.h>
3#include <linux/ptp_clock.h>
4
Dmitry V. Levin0ed617b2014-04-25 23:30:54 +00005#include "xlat/ptp_flags_options.h"
Stefan Sørensenb88a6f82014-01-31 12:01:01 +01006
Stefan Sørensenb88a6f82014-01-31 12:01:01 +01007int ptp_ioctl(struct tcb *tcp, long code, long arg)
8{
9 if (!verbose(tcp))
10 return 0;
11
12 switch (code) {
13 case PTP_CLOCK_GETCAPS: /* decode on exit */
14 {
15 struct ptp_clock_caps caps;
16
17 if (entering(tcp) || syserror(tcp) ||
18 umove(tcp, arg, &caps) < 0)
19 return 0;
20
21 tprintf(", {max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d}",
22 caps.max_adj, caps.n_alarm, caps.n_ext_ts,
23 caps.n_per_out, caps.pps);
24 return 1;
25 }
26
27 case PTP_EXTTS_REQUEST: /* decode on enter */
28 {
29 struct ptp_extts_request extts;
30
31 if (exiting(tcp))
32 return 1;
33 if (umove(tcp, arg, &extts) < 0) {
34 tprintf(", %#lx", arg);
35 return 0;
36 }
37 tprintf(", {index=%d, flags=", extts.index);
38 printflags(ptp_flags_options, extts.flags, "PTP_???");
39 tprints("}");
40 return 1;
41 }
42
43 case PTP_PEROUT_REQUEST: /* decode on enter */
44 {
45 struct ptp_perout_request perout;
46
47 if (exiting(tcp))
48 return 1;
49 if (umove(tcp, arg, &perout) < 0) {
50 tprintf(", %#lx", arg);
51 return 0;
52 }
53
54 tprintf(", {start={%" PRId64 ", %" PRIu32 "}"
55 ", period={%" PRId64 ", %" PRIu32 "}"
56 ", index=%d, flags=",
57 (int64_t)perout.start.sec, perout.start.nsec,
58 (int64_t)perout.period.sec, perout.period.nsec,
59 perout.index);
60 printflags(ptp_flags_options, perout.flags, "PTP_???");
61 tprints("}");
62 return 1;
63 }
64
65 case PTP_ENABLE_PPS: /* decode on enter */
66 if (entering(tcp))
67 tprintf(", %ld", arg);
68 return 1;
69
70 case PTP_SYS_OFFSET: /* decode on exit */
71 {
72 struct ptp_sys_offset sysoff;
73 unsigned int i;
74
75 if (entering(tcp) || umove(tcp, arg, &sysoff) < 0)
76 return 0;
77
78 tprintf(", {n_samples=%u, ts={", sysoff.n_samples);
79 if (syserror(tcp)) {
80 tprints("...}}");
81 return 1;
82 }
83 if (sysoff.n_samples > PTP_MAX_SAMPLES)
84 sysoff.n_samples = PTP_MAX_SAMPLES;
85 tprintf("{%" PRId64 ", %" PRIu32 "}",
86 (int64_t)sysoff.ts[0].sec, sysoff.ts[0].nsec);
87 for (i = 1; i < 2*sysoff.n_samples+1; ++i)
88 tprintf(", {%" PRId64 ", %" PRIu32 "}",
89 (int64_t)sysoff.ts[i].sec, sysoff.ts[i].nsec);
90 tprints("}}");
91 return 1;
92 }
93
94 default: /* decode on exit */
95 return 0;
96 }
97}