tools headers UAPI: Sync linux/prctl.h with the kernel sources
[linux-2.6-microblaze.git] / kernel / time / timeconst.bc
1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 scale=0
4
5 define gcd(a,b) {
6         auto t;
7         while (b) {
8                 t = b;
9                 b = a % b;
10                 a = t;
11         }
12         return a;
13 }
14
15 /* Division by reciprocal multiplication. */
16 define fmul(b,n,d) {
17        return (2^b*n+d-1)/d;
18 }
19
20 /* Adjustment factor when a ceiling value is used.  Use as:
21    (imul * n) + (fmulxx * n + fadjxx) >> xx) */
22 define fadj(b,n,d) {
23         auto v;
24         d = d/gcd(n,d);
25         v = 2^b*(d-1)/d;
26         return v;
27 }
28
29 /* Compute the appropriate mul/adj values as well as a shift count,
30    which brings the mul value into the range 2^b-1 <= x < 2^b.  Such
31    a shift value will be correct in the signed integer range and off
32    by at most one in the upper half of the unsigned range. */
33 define fmuls(b,n,d) {
34         auto s, m;
35         for (s = 0; 1; s++) {
36                 m = fmul(s,n,d);
37                 if (m >= 2^(b-1))
38                         return s;
39         }
40         return 0;
41 }
42
43 define timeconst(hz) {
44         print "/* Automatically generated by kernel/time/timeconst.bc */\n"
45         print "/* Time conversion constants for HZ == ", hz, " */\n"
46         print "\n"
47
48         print "#ifndef KERNEL_TIMECONST_H\n"
49         print "#define KERNEL_TIMECONST_H\n\n"
50
51         print "#include <linux/param.h>\n"
52         print "#include <linux/types.h>\n\n"
53
54         print "#if HZ != ", hz, "\n"
55         print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n"
56         print "#endif\n\n"
57
58         if (hz < 2) {
59                 print "#error Totally bogus HZ value!\n"
60         } else {
61                 s=fmuls(32,1000,hz)
62                 obase=16
63                 print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
64                 print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
65                 obase=10
66                 print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
67
68                 s=fmuls(32,hz,1000)
69                 obase=16
70                 print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
71                 print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
72                 obase=10
73                 print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
74
75                 obase=10
76                 cd=gcd(hz,1000)
77                 print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
78                 print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
79                 print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
80                 print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
81                 print "\n"
82
83                 s=fmuls(32,1000000,hz)
84                 obase=16
85                 print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
86                 print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
87                 obase=10
88                 print "#define HZ_TO_USEC_SHR32\t", s, "\n"
89
90                 s=fmuls(32,hz,1000000)
91                 obase=16
92                 print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
93                 print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
94                 obase=10
95                 print "#define USEC_TO_HZ_SHR32\t", s, "\n"
96
97                 obase=10
98                 cd=gcd(hz,1000000)
99                 print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
100                 print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
101                 print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
102                 print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
103
104                 cd=gcd(hz,1000000000)
105                 print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n"
106                 print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n"
107                 print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
108                 print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n"
109                 print "\n"
110
111                 print "#endif /* KERNEL_TIMECONST_H */\n"
112         }
113         halt
114 }
115
116 hz = read();
117 timeconst(hz)