138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/* 238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2014 Stefan Sørensen <stefan.sorensen@spectralink.com> 338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org> 439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2014-2017 The strace developers. 538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved. 638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions 938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met: 1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * documentation and/or other materials provided with the distribution. 1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * derived from this software without specific prior written permission. 1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */ 2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin 30b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen#include "defs.h" 31b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 32b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes#ifdef HAVE_STRUCT_PTP_SYS_OFFSET 33b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes 34b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes# include <linux/ioctl.h> 35b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes# include <linux/ptp_clock.h> 36b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes 37b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes# include "xlat/ptp_flags_options.h" 38b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 39c7afb4881f14e44968f3a78ae5988f04ecc66b68Dmitry V. Levinint 40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesptp_ioctl(struct tcb *const tcp, const unsigned int code, 41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg) 42b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen{ 43b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen if (!verbose(tcp)) 44317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin return RVAL_DECODED; 45b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 46b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen switch (code) { 47317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin case PTP_EXTTS_REQUEST: { 48317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin struct ptp_extts_request extts; 49b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 50317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 51317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (umove_or_printaddr(tcp, arg, &extts)) 52317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 53b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 54317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprintf("{index=%d, flags=", extts.index); 55317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin printflags(ptp_flags_options, extts.flags, "PTP_???"); 56317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("}"); 57317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 58317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 59b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 60317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin case PTP_PEROUT_REQUEST: { 61317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin struct ptp_perout_request perout; 62b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 63317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 64317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (umove_or_printaddr(tcp, arg, &perout)) 65317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 66b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 67317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprintf("{start={%" PRId64 ", %" PRIu32 "}" 68317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin ", period={%" PRId64 ", %" PRIu32 "}" 69317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin ", index=%d, flags=", 70317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin (int64_t)perout.start.sec, perout.start.nsec, 71317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin (int64_t)perout.period.sec, perout.period.nsec, 72317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin perout.index); 73317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin printflags(ptp_flags_options, perout.flags, "PTP_???"); 74317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("}"); 75317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 76317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 77b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 78317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin case PTP_ENABLE_PPS: 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprintf(", %" PRI_kld, arg); 80317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 81b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 82317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin case PTP_SYS_OFFSET: { 83317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin struct ptp_sys_offset sysoff; 84317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin 85317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (entering(tcp)) { 86317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 87317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (umove_or_printaddr(tcp, arg, &sysoff)) 88317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 89b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 90317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprintf("{n_samples=%u", sysoff.n_samples); 9177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes return 0; 92317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } else { 93317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin unsigned int n_samples, i; 94b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 95317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (syserror(tcp)) { 96317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("}"); 97317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 98317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 99b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 100317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 101317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (umove(tcp, arg, &sysoff) < 0) { 102317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("???}"); 103317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 104317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 105b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 106317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("ts=["); 107317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin n_samples = sysoff.n_samples > PTP_MAX_SAMPLES ? 108317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin PTP_MAX_SAMPLES : sysoff.n_samples; 109317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin for (i = 0; i < 2 * n_samples + 1; ++i) { 110317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (i > 0) 111317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 112317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprintf("{%" PRId64 ", %" PRIu32 "}", 113317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin (int64_t)sysoff.ts[i].sec, 114317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin sysoff.ts[i].nsec); 115b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen } 116b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen if (sysoff.n_samples > PTP_MAX_SAMPLES) 117317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", ..."); 118317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints("]}"); 119317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 120b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen } 121317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 122317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin case PTP_CLOCK_GETCAPS: { 123317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin struct ptp_clock_caps caps; 124b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen 125317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (entering(tcp)) 126b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen return 0; 127317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin 128317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprints(", "); 129317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin if (umove_or_printaddr(tcp, arg, &caps)) 130317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 131317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin 132317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin tprintf("{max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d}", 133317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin caps.max_adj, caps.n_alarm, caps.n_ext_ts, 134317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin caps.n_per_out, caps.pps); 135317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin break; 136b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen } 137317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin 138317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin default: 139317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin return RVAL_DECODED; 140317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin } 141317d19e8e99d16173b900f98c81e9a95a465b5bbDmitry V. Levin 14277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes return RVAL_IOCTL_DECODED; 143b88a6f877eb08e6d45130374fc1a1867371db703Stefan Sørensen} 144b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes 145b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes#endif /* HAVE_STRUCT_PTP_SYS_OFFSET */ 146