- if ((itvp = uap->itv) &&
- (error = copyin((caddr_t)itvp,
- (caddr_t)&aitv, sizeof (struct itimerval))))
- return (error);
- if ((uap->itv = uap->oitv) && (error = getitimer(p, uap, retval)))
+ if ((itvp = uap->itv)) {
+ if (IS_64BIT_PROCESS(p)) {
+ struct user_itimerval user_itv;
+ if ((error = copyin(itvp, (caddr_t)&user_itv, sizeof (struct user_itimerval))))
+ return (error);
+ aitv.it_interval.tv_sec = user_itv.it_interval.tv_sec;
+ aitv.it_interval.tv_usec = user_itv.it_interval.tv_usec;
+ aitv.it_value.tv_sec = user_itv.it_value.tv_sec;
+ aitv.it_value.tv_usec = user_itv.it_value.tv_usec;
+ } else {
+ if ((error = copyin(itvp, (caddr_t)&aitv, sizeof (struct itimerval))))
+ return (error);
+ }
+ }
+ if ((uap->itv = uap->oitv) && (error = getitimer(p, (struct getitimer_args *)uap, retval)))