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