id_t is 64bit, provide the compat32 wrapper for clock_getcpuclockid2(2).

Reported and tested by:	Petr Salinger <Petr.Salinger@seznam.cz>
PR:	threads/180652
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
kib 2013-07-20 13:39:41 +00:00
parent e36ca7ff41
commit 82f12b6237
4 changed files with 41 additions and 16 deletions

View File

@ -2331,6 +2331,20 @@ freebsd32_clock_getres(struct thread *td,
return (error);
}
int
freebsd32_clock_getcpuclockid2(struct thread *td,
struct freebsd32_clock_getcpuclockid2_args *uap)
{
clockid_t clk_id;
int error;
error = kern_clock_getcpuclockid2(td, PAIR32TO64(id_t, uap->id),
uap->which, &clk_id);
if (error == 0)
error = copyout(&clk_id, uap->clock_id, sizeof(clockid_t));
return (error);
}
int
freebsd32_thr_new(struct thread *td,
struct freebsd32_thr_new_args *uap)

View File

@ -457,8 +457,9 @@
244 AUE_NULL UNIMPL nosys
245 AUE_NULL UNIMPL nosys
246 AUE_NULL UNIMPL nosys
247 AUE_NULL NOPROTO { int clock_getcpuclockid2(id_t id,\
int which, clockid_t *clock_id); }
247 AUE_NULL STD { int freebsd32_clock_getcpuclockid2(\
uint32_t id1, uint32_t id2,\
int which, clockid_t *clock_id); }
248 AUE_NULL UNIMPL ntp_gettime
249 AUE_NULL UNIMPL nosys
; syscall numbers initially used in OpenBSD

View File

@ -183,38 +183,46 @@ int
sys_clock_getcpuclockid2(struct thread *td, struct clock_getcpuclockid2_args *uap)
{
clockid_t clk_id;
int error;
error = kern_clock_getcpuclockid2(td, uap->id, uap->which, &clk_id);
if (error == 0)
error = copyout(&clk_id, uap->clock_id, sizeof(clockid_t));
return (error);
}
int
kern_clock_getcpuclockid2(struct thread *td, id_t id, int which,
clockid_t *clk_id)
{
struct proc *p;
pid_t pid;
lwpid_t tid;
int error;
switch(uap->which) {
switch (which) {
case CPUCLOCK_WHICH_PID:
if (uap->id != 0) {
p = pfind(uap->id);
if (id != 0) {
p = pfind(id);
if (p == NULL)
return (ESRCH);
error = p_cansee(td, p);
PROC_UNLOCK(p);
if (error)
if (error != 0)
return (error);
pid = uap->id;
pid = id;
} else {
pid = td->td_proc->p_pid;
}
clk_id = MAKE_PROCESS_CPUCLOCK(pid);
break;
*clk_id = MAKE_PROCESS_CPUCLOCK(pid);
return (0);
case CPUCLOCK_WHICH_TID:
if (uap->id == 0)
tid = td->td_tid;
else
tid = uap->id;
clk_id = MAKE_THREAD_CPUCLOCK(tid);
break;
tid = id == 0 ? td->td_tid : id;
*clk_id = MAKE_THREAD_CPUCLOCK(tid);
return (0);
default:
return (EINVAL);
}
return (copyout(&clk_id, uap->clock_id, sizeof(clockid_t)));
}
#ifndef _SYS_SYSPROTO_H_

View File

@ -76,6 +76,8 @@ int kern_chmod(struct thread *td, char *path, enum uio_seg pathseg,
int mode);
int kern_chown(struct thread *td, char *path, enum uio_seg pathseg, int uid,
int gid);
int kern_clock_getcpuclockid2(struct thread *td, id_t id, int which,
clockid_t *clk_id);
int kern_clock_getres(struct thread *td, clockid_t clock_id,
struct timespec *ts);
int kern_clock_gettime(struct thread *td, clockid_t clock_id,