|
@@ -257,6 +257,47 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
|
|
return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_COMPAT
|
|
|
+COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
|
|
|
+ struct timezone __user *, tz)
|
|
|
+{
|
|
|
+ if (tv) {
|
|
|
+ struct timeval ktv;
|
|
|
+
|
|
|
+ do_gettimeofday(&ktv);
|
|
|
+ if (compat_put_timeval(&ktv, tv))
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+ if (tz) {
|
|
|
+ if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
|
|
|
+ struct timezone __user *, tz)
|
|
|
+{
|
|
|
+ struct timespec64 new_ts;
|
|
|
+ struct timeval user_tv;
|
|
|
+ struct timezone new_tz;
|
|
|
+
|
|
|
+ if (tv) {
|
|
|
+ if (compat_get_timeval(&user_tv, tv))
|
|
|
+ return -EFAULT;
|
|
|
+ new_ts.tv_sec = user_tv.tv_sec;
|
|
|
+ new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
|
|
|
+ }
|
|
|
+ if (tz) {
|
|
|
+ if (copy_from_user(&new_tz, tz, sizeof(*tz)))
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ return do_sys_settimeofday64(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
|
|
|
{
|
|
|
struct timex txc; /* Local copy of parameter */
|