1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* 239bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org> 3b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes * Copyright (c) 2016-2018 The strace developers. 4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved. 5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without 7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions 8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met: 9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright 10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer. 11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer in the 13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * documentation and/or other materials provided with the distribution. 14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * derived from this software without specific prior written permission. 16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "defs.h" 30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include DEF_MPERS_TYPE(timeval_t) 32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughestypedef struct timeval timeval_t; 34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include MPERS_DEFS 36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 37b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes#include "xstring.h" 38b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes 3939bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic const char timeval_fmt[] = "{tv_sec=%lld, tv_usec=%llu}"; 40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval_t(const timeval_t *t) 43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprintf(timeval_fmt, (long long) t->tv_sec, 4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t->tv_usec)); 4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes 4839bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void 4939bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval_t_utime(const timeval_t *t) 5039bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval_t(t); 5239bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprints_comment(sprinttime_usec(t->tv_sec, 5339bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t->tv_usec))); 54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_struct_timeval, const void *arg) 57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval_t(arg); 59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 61dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott HughesMPERS_PRINTER_DECL(bool, print_struct_timeval_data_size, 62dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes const void *arg, const size_t size) 63dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes{ 64dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes if (size < sizeof(timeval_t)) { 65dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes tprints("?"); 66dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return false; 67dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes } 68dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 69dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes print_timeval_t(arg); 70dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes return true; 71dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes} 72dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes 73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_timeval, 74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct tcb *const tcp, const kernel_ulong_t addr) 75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval_t t; 77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return; 80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval_t(&t); 82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 8439bac055674d23770b9a724221b728e443196ea7Elliott HughesMPERS_PRINTER_DECL(void, print_timeval_utimes, 85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct tcb *const tcp, const kernel_ulong_t addr) 86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 8739bac055674d23770b9a724221b728e443196ea7Elliott Hughes timeval_t t[2]; 88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 8939bac055674d23770b9a724221b728e443196ea7Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 9039bac055674d23770b9a724221b728e443196ea7Elliott Hughes return; 9139bac055674d23770b9a724221b728e443196ea7Elliott Hughes 9239bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprints("["); 9339bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval_t_utime(&t[0]); 9439bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprints(", "); 9539bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval_t_utime(&t[1]); 9639bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprints("]"); 97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(const char *, sprint_timeval, 100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct tcb *const tcp, const kernel_ulong_t addr) 101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval_t t; 103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)]; 104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!addr) { 106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes strcpy(buf, "NULL"); 107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) || 108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes umove(tcp, addr, &t)) { 109b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes xsprintf(buf, "%#" PRI_klx, addr); 110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else { 111b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes xsprintf(buf, timeval_fmt, 11239bac055674d23770b9a724221b728e443196ea7Elliott Hughes (long long) t.tv_sec, 11339bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t.tv_usec)); 114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return buf; 117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(void, print_itimerval, 120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct tcb *const tcp, const kernel_ulong_t addr) 121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval_t t[2]; 123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return; 126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("{it_interval="); 128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval_t(&t[0]); 129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(", it_value="); 130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval_t(&t[1]); 131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("}"); 132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef ALPHA 135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid 137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval32_t(const timeval32_t *t) 138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 13939bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprintf(timeval_fmt, (long long) t->tv_sec, 14039bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t->tv_usec)); 14139bac055674d23770b9a724221b728e443196ea7Elliott Hughes} 14239bac055674d23770b9a724221b728e443196ea7Elliott Hughes 14339bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic void 14439bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval32_t_utime(const timeval32_t *t) 14539bac055674d23770b9a724221b728e443196ea7Elliott Hughes{ 14639bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval32_t(t); 14739bac055674d23770b9a724221b728e443196ea7Elliott Hughes tprints_comment(sprinttime_usec(t->tv_sec, 14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t->tv_usec))); 149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid 152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_timeval32(struct tcb *const tcp, const kernel_ulong_t addr) 153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval32_t t; 155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return; 158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval32_t(&t); 160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid 16339bac055674d23770b9a724221b728e443196ea7Elliott Hughesprint_timeval32_utimes(struct tcb *const tcp, const kernel_ulong_t addr) 164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval32_t t[2]; 166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return; 169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("["); 17139bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval32_t_utime(&t[0]); 172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(", "); 17339bac055674d23770b9a724221b728e443196ea7Elliott Hughes print_timeval32_t_utime(&t[1]); 174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("]"); 175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesvoid 178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_itimerval32(struct tcb *const tcp, const kernel_ulong_t addr) 179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval32_t t[2]; 181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (umove_or_printaddr(tcp, addr, &t)) 183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return; 184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("{it_interval="); 186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval32_t(&t[0]); 187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints(", it_value="); 188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes print_timeval32_t(&t[1]); 189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes tprints("}"); 190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesconst char * 193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughessprint_timeval32(struct tcb *const tcp, const kernel_ulong_t addr) 194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes timeval32_t t; 196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static char buf[sizeof(timeval_fmt) + 3 * sizeof(t)]; 197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (!addr) { 199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes strcpy(buf, "NULL"); 200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) || 201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes umove(tcp, addr, &t)) { 202b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes xsprintf(buf, "%#" PRI_klx, addr); 203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } else { 204b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes xsprintf(buf, timeval_fmt, 20539bac055674d23770b9a724221b728e443196ea7Elliott Hughes (long long) t.tv_sec, 20639bac055674d23770b9a724221b728e443196ea7Elliott Hughes zero_extend_signed_to_ull(t.tv_usec)); 207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes } 208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return buf; 210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* ALPHA */ 213