@@ -86,6 +86,11 @@ notrace static long vdso_fallback_gettimeofday(struct __kernel_old_timeval *tv,
86
86
}
87
87
88
88
#ifdef CONFIG_SPARC64
89
+ notrace static __always_inline u64 __shr64 (u64 val , int amt )
90
+ {
91
+ return val >> amt ;
92
+ }
93
+
89
94
notrace static __always_inline u64 vread_tick (void )
90
95
{
91
96
u64 ret ;
@@ -102,6 +107,21 @@ notrace static __always_inline u64 vread_tick_stick(void)
102
107
return ret ;
103
108
}
104
109
#else
110
+ notrace static __always_inline u64 __shr64 (u64 val , int amt )
111
+ {
112
+ u64 ret ;
113
+
114
+ __asm__ __volatile__("sllx %H1, 32, %%g1\n\t"
115
+ "srl %L1, 0, %L1\n\t"
116
+ "or %%g1, %L1, %%g1\n\t"
117
+ "srlx %%g1, %2, %L0\n\t"
118
+ "srlx %L0, 32, %H0"
119
+ : "=r" (ret )
120
+ : "r" (val ), "r" (amt )
121
+ : "g1" );
122
+ return ret ;
123
+ }
124
+
105
125
notrace static __always_inline u64 vread_tick (void )
106
126
{
107
127
register unsigned long long ret asm("o4" );
@@ -154,7 +174,7 @@ notrace static __always_inline int do_realtime(struct vvar_data *vvar,
154
174
ts -> tv_sec = vvar -> wall_time_sec ;
155
175
ns = vvar -> wall_time_snsec ;
156
176
ns += vgetsns (vvar );
157
- ns >>= vvar -> clock .shift ;
177
+ ns = __shr64 ( ns , vvar -> clock .shift ) ;
158
178
} while (unlikely (vvar_read_retry (vvar , seq )));
159
179
160
180
ts -> tv_sec += __iter_div_u64_rem (ns , NSEC_PER_SEC , & ns );
@@ -174,7 +194,7 @@ notrace static __always_inline int do_realtime_stick(struct vvar_data *vvar,
174
194
ts -> tv_sec = vvar -> wall_time_sec ;
175
195
ns = vvar -> wall_time_snsec ;
176
196
ns += vgetsns_stick (vvar );
177
- ns >>= vvar -> clock .shift ;
197
+ ns = __shr64 ( ns , vvar -> clock .shift ) ;
178
198
} while (unlikely (vvar_read_retry (vvar , seq )));
179
199
180
200
ts -> tv_sec += __iter_div_u64_rem (ns , NSEC_PER_SEC , & ns );
@@ -194,7 +214,7 @@ notrace static __always_inline int do_monotonic(struct vvar_data *vvar,
194
214
ts -> tv_sec = vvar -> monotonic_time_sec ;
195
215
ns = vvar -> monotonic_time_snsec ;
196
216
ns += vgetsns (vvar );
197
- ns >>= vvar -> clock .shift ;
217
+ ns = __shr64 ( ns , vvar -> clock .shift ) ;
198
218
} while (unlikely (vvar_read_retry (vvar , seq )));
199
219
200
220
ts -> tv_sec += __iter_div_u64_rem (ns , NSEC_PER_SEC , & ns );
@@ -214,7 +234,7 @@ notrace static __always_inline int do_monotonic_stick(struct vvar_data *vvar,
214
234
ts -> tv_sec = vvar -> monotonic_time_sec ;
215
235
ns = vvar -> monotonic_time_snsec ;
216
236
ns += vgetsns_stick (vvar );
217
- ns >>= vvar -> clock .shift ;
237
+ ns = __shr64 ( ns , vvar -> clock .shift ) ;
218
238
} while (unlikely (vvar_read_retry (vvar , seq )));
219
239
220
240
ts -> tv_sec += __iter_div_u64_rem (ns , NSEC_PER_SEC , & ns );
0 commit comments