sparc64: add custom adjtimex/clock_adjtime functions
sparc64 is the only architecture on Linux that has a 'timeval' definition with a 32-bit tv_usec but a 64-bit tv_sec. This causes problems for sparc32 compat mode when we convert it to use the new __kernel_timex type that has the same layout as all other 64-bit architectures. To avoid adding sparc64 specific code into the generic adjtimex implementation, this adds a wrapper in the sparc64 system call handling that converts the sparc64 'timex' into the new '__kernel_timex'. At this point, the two structures are defined to be identical, but that will change in the next step once we convert sparc32. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -1047,22 +1047,28 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock,
|
||||
struct timex __user *, utx)
|
||||
int do_clock_adjtime(const clockid_t which_clock, struct timex * ktx)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timex ktx;
|
||||
int err;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
if (!kc->clock_adj)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return kc->clock_adj(which_clock, ktx);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock,
|
||||
struct timex __user *, utx)
|
||||
{
|
||||
struct timex ktx;
|
||||
int err;
|
||||
|
||||
if (copy_from_user(&ktx, utx, sizeof(ktx)))
|
||||
return -EFAULT;
|
||||
|
||||
err = kc->clock_adj(which_clock, &ktx);
|
||||
err = do_clock_adjtime(which_clock, &ktx);
|
||||
|
||||
if (err >= 0 && copy_to_user(utx, &ktx, sizeof(ktx)))
|
||||
return -EFAULT;
|
||||
@@ -1126,20 +1132,14 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||
COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
|
||||
struct old_timex32 __user *, utp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timex ktx;
|
||||
int err;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
if (!kc->clock_adj)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = get_old_timex32(&ktx, utp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = kc->clock_adj(which_clock, &ktx);
|
||||
err = do_clock_adjtime(which_clock, &ktx);
|
||||
|
||||
if (err >= 0)
|
||||
err = put_old_timex32(utp, &ktx);
|
||||
|
Reference in New Issue
Block a user