svn commit: r253494 - in head/sys: compat/freebsd32 kern sys

Konstantin Belousov kib at FreeBSD.org
Sat Jul 20 13:39:42 UTC 2013


Author: kib
Date: Sat Jul 20 13:39:41 2013
New Revision: 253494
URL: http://svnweb.freebsd.org/changeset/base/253494

Log:
  id_t is 64bit, provide the compat32 wrapper for clock_getcpuclockid2(2).
  
  Reported and tested by:	Petr Salinger <Petr.Salinger at seznam.cz>
  PR:	threads/180652
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/compat/freebsd32/freebsd32_misc.c
  head/sys/compat/freebsd32/syscalls.master
  head/sys/kern/kern_time.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- head/sys/compat/freebsd32/freebsd32_misc.c	Sat Jul 20 13:14:59 2013	(r253493)
+++ head/sys/compat/freebsd32/freebsd32_misc.c	Sat Jul 20 13:39:41 2013	(r253494)
@@ -2332,6 +2332,20 @@ freebsd32_clock_getres(struct thread *td
 }
 
 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)
 {

Modified: head/sys/compat/freebsd32/syscalls.master
==============================================================================
--- head/sys/compat/freebsd32/syscalls.master	Sat Jul 20 13:14:59 2013	(r253493)
+++ head/sys/compat/freebsd32/syscalls.master	Sat Jul 20 13:39:41 2013	(r253494)
@@ -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

Modified: head/sys/kern/kern_time.c
==============================================================================
--- head/sys/kern/kern_time.c	Sat Jul 20 13:14:59 2013	(r253493)
+++ head/sys/kern/kern_time.c	Sat Jul 20 13:39:41 2013	(r253494)
@@ -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_

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h	Sat Jul 20 13:14:59 2013	(r253493)
+++ head/sys/sys/syscallsubr.h	Sat Jul 20 13:39:41 2013	(r253494)
@@ -76,6 +76,8 @@ int	kern_chmod(struct thread *td, char *
 	    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,


More information about the svn-src-all mailing list