]> granicus.if.org Git - strace/blob - rtc.c
rtc.c: decode RTC_PLL_GET and RTC_PLL_SET
[strace] / rtc.c
1 /*
2  * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
3  * Copyright (c) 2004 Dmitry V. Levin <ldv@altlinux.org>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "defs.h"
30 #include <linux/ioctl.h>
31 #include <linux/rtc.h>
32
33 static void
34 print_rtc_time(struct tcb *tcp, const struct rtc_time *rt)
35 {
36         tprintf("{tm_sec=%d, tm_min=%d, tm_hour=%d, "
37                 "tm_mday=%d, tm_mon=%d, tm_year=%d, ",
38                 rt->tm_sec, rt->tm_min, rt->tm_hour,
39                 rt->tm_mday, rt->tm_mon, rt->tm_year);
40         if (!abbrev(tcp))
41                 tprintf("tm_wday=%d, tm_yday=%d, tm_isdst=%d}",
42                         rt->tm_wday, rt->tm_yday, rt->tm_isdst);
43         else
44                 tprints("...}");
45 }
46
47 static void
48 decode_rtc_time(struct tcb *tcp, const long addr)
49 {
50         struct rtc_time rt;
51
52         if (!umove_or_printaddr(tcp, addr, &rt))
53                 print_rtc_time(tcp, &rt);
54 }
55
56 static void
57 decode_rtc_wkalrm(struct tcb *tcp, const long addr)
58 {
59         struct rtc_wkalrm wk;
60
61         if (!umove_or_printaddr(tcp, addr, &wk)) {
62                 tprintf("{enabled=%d, pending=%d, ", wk.enabled, wk.pending);
63                 print_rtc_time(tcp, &wk.time);
64                 tprints("}");
65         }
66 }
67
68 static void
69 decode_rtc_pll_info(struct tcb *tcp, const long addr)
70 {
71         struct rtc_pll_info pll;
72
73         if (!umove_or_printaddr(tcp, addr, &pll))
74                 tprintf("{pll_ctrl=%d, pll_value=%d, pll_max=%d, pll_min=%d"
75                         ", pll_posmult=%d, pll_negmult=%d, pll_clock=%ld}",
76                         pll.pll_ctrl, pll.pll_value, pll.pll_max, pll.pll_min,
77                         pll.pll_posmult, pll.pll_negmult, pll.pll_clock);
78 }
79
80 int
81 rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
82 {
83         switch (code) {
84         case RTC_ALM_READ:
85         case RTC_RD_TIME:
86                 if (entering(tcp))
87                         return 0;
88                 /* fall through */
89         case RTC_ALM_SET:
90         case RTC_SET_TIME:
91                 tprints(", ");
92                 decode_rtc_time(tcp, arg);
93                 break;
94         case RTC_IRQP_SET:
95         case RTC_EPOCH_SET:
96                 tprintf(", %lu", arg);
97                 break;
98         case RTC_IRQP_READ:
99         case RTC_EPOCH_READ:
100                 if (entering(tcp))
101                         return 0;
102                 tprints(", ");
103                 printnum_ulong(tcp, arg);
104                 break;
105         case RTC_WKALM_RD:
106                 if (entering(tcp))
107                         return 0;
108                 /* fall through */
109         case RTC_WKALM_SET:
110                 tprints(", ");
111                 decode_rtc_wkalrm(tcp, arg);
112                 break;
113         case RTC_PLL_GET:
114                 if (entering(tcp))
115                         return 0;
116                 /* fall through */
117         case RTC_PLL_SET:
118                 tprints(", ");
119                 decode_rtc_pll_info(tcp, arg);
120                 break;
121 #ifdef RTC_VL_READ
122         case RTC_VL_READ:
123                 if (entering(tcp))
124                         return 0;
125                 tprints(", ");
126                 printnum_int(tcp, arg, "%d");
127                 break;
128 #endif
129         default:
130                 return RVAL_DECODED;
131         }
132
133         return RVAL_DECODED | 1;
134 }