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:
parent
e36ca7ff41
commit
82f12b6237
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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_
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user