1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "defs.h" 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <sys/ioctl.h> 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <linux/ptp_clock.h> 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "xlat/ptp_flags_options.h" 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint ptp_ioctl(struct tcb *tcp, long code, long arg) 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{ 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (!verbose(tcp)) 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org switch (code) { 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case PTP_CLOCK_GETCAPS: /* decode on exit */ 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org { 15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org struct ptp_clock_caps caps; 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (entering(tcp) || syserror(tcp) || 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org umove(tcp, arg, &caps) < 0) 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", {max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d}", 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org caps.max_adj, caps.n_alarm, caps.n_ext_ts, 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org caps.n_per_out, caps.pps); 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case PTP_EXTTS_REQUEST: /* decode on enter */ 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org { 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org struct ptp_extts_request extts; 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (exiting(tcp)) 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (umove(tcp, arg, &extts) < 0) { 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", %#lx", arg); 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", {index=%d, flags=", extts.index); 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org printflags(ptp_flags_options, extts.flags, "PTP_???"); 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprints("}"); 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case PTP_PEROUT_REQUEST: /* decode on enter */ 443c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com { 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org struct ptp_perout_request perout; 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (exiting(tcp)) 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (umove(tcp, arg, &perout) < 0) { 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", %#lx", arg); 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", {start={%" PRId64 ", %" PRIu32 "}" 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ", period={%" PRId64 ", %" PRIu32 "}" 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ", index=%d, flags=", 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (int64_t)perout.start.sec, perout.start.nsec, 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (int64_t)perout.period.sec, perout.period.nsec, 59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org perout.index); 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org printflags(ptp_flags_options, perout.flags, "PTP_???"); 61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprints("}"); 62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case PTP_ENABLE_PPS: /* decode on enter */ 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (entering(tcp)) 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", %ld", arg); 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org case PTP_SYS_OFFSET: /* decode on exit */ 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org { 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org struct ptp_sys_offset sysoff; 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org unsigned int i; 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (entering(tcp) || umove(tcp, arg, &sysoff) < 0) 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", {n_samples=%u, ts={", sysoff.n_samples); 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (syserror(tcp)) { 80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprints("...}}"); 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org if (sysoff.n_samples > PTP_MAX_SAMPLES) 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org sysoff.n_samples = PTP_MAX_SAMPLES; 85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf("{%" PRId64 ", %" PRIu32 "}", 86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (int64_t)sysoff.ts[0].sec, sysoff.ts[0].nsec); 87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org for (i = 1; i < 2*sysoff.n_samples+1; ++i) 88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprintf(", {%" PRId64 ", %" PRIu32 "}", 89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org (int64_t)sysoff.ts[i].sec, sysoff.ts[i].nsec); 90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org tprints("}}"); 91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 1; 92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org default: /* decode on exit */ 95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org return 0; 96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org } 97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org} 98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org