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