1161304Snetchild/*	$NetBSD: linux_time.c,v 1.14 2006/05/14 03:40:54 christos Exp $ */
2161304Snetchild
3161304Snetchild/*-
4161304Snetchild * Copyright (c) 2001 The NetBSD Foundation, Inc.
5161304Snetchild * All rights reserved.
6161304Snetchild *
7161304Snetchild * This code is derived from software contributed to The NetBSD Foundation
8161304Snetchild * by Emmanuel Dreyfus.
9161304Snetchild *
10161304Snetchild * Redistribution and use in source and binary forms, with or without
11161304Snetchild * modification, are permitted provided that the following conditions
12161304Snetchild * are met:
13161304Snetchild * 1. Redistributions of source code must retain the above copyright
14161304Snetchild *    notice, this list of conditions and the following disclaimer.
15161304Snetchild * 2. Redistributions in binary form must reproduce the above copyright
16161304Snetchild *    notice, this list of conditions and the following disclaimer in the
17161304Snetchild *    documentation and/or other materials provided with the distribution.
18161304Snetchild *
19161304Snetchild * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20161304Snetchild * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21161304Snetchild * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22161304Snetchild * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23161304Snetchild * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24161304Snetchild * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25161304Snetchild * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26161304Snetchild * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27161304Snetchild * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28161304Snetchild * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29161304Snetchild * POSSIBILITY OF SUCH DAMAGE.
30161304Snetchild */
31161304Snetchild
32161304Snetchild#include <sys/cdefs.h>
33161304Snetchild__FBSDID("$FreeBSD$");
34161304Snetchild#if 0
35161304Snetchild__KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.14 2006/05/14 03:40:54 christos Exp $");
36161304Snetchild#endif
37161304Snetchild
38161304Snetchild#include "opt_compat.h"
39235063Snetchild#include "opt_kdtrace.h"
40161304Snetchild
41161304Snetchild#include <sys/param.h>
42235063Snetchild#include <sys/kernel.h>
43161304Snetchild#include <sys/ucred.h>
44161304Snetchild#include <sys/mount.h>
45235063Snetchild#include <sys/sdt.h>
46161304Snetchild#include <sys/signal.h>
47161304Snetchild#include <sys/stdint.h>
48161304Snetchild#include <sys/syscallsubr.h>
49161304Snetchild#include <sys/sysproto.h>
50161304Snetchild#include <sys/time.h>
51161304Snetchild#include <sys/systm.h>
52161304Snetchild#include <sys/proc.h>
53161304Snetchild
54161304Snetchild#ifdef COMPAT_LINUX32
55161304Snetchild#include <machine/../linux32/linux.h>
56161304Snetchild#include <machine/../linux32/linux32_proto.h>
57161304Snetchild#else
58161304Snetchild#include <machine/../linux/linux.h>
59161304Snetchild#include <machine/../linux/linux_proto.h>
60161304Snetchild#endif
61161304Snetchild
62235063Snetchild#include <compat/linux/linux_dtrace.h>
63246085Sjhb#include <compat/linux/linux_misc.h>
64235063Snetchild
65235063Snetchild/* DTrace init */
66235063SnetchildLIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE);
67235063Snetchild
68235063Snetchild/**
69235063Snetchild * DTrace probes in this module.
70235063Snetchild */
71235063SnetchildLIN_SDT_PROBE_DEFINE2(time, native_to_linux_timespec, entry,
72235063Snetchild    "struct l_timespec *", "struct timespec *");
73235063SnetchildLIN_SDT_PROBE_DEFINE0(time, native_to_linux_timespec, return);
74235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_to_native_timespec, entry,
75235063Snetchild    "struct timespec *", "struct l_timespec *");
76235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_to_native_timespec, return, "int");
77235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_to_native_clockid, entry, "clockid_t *",
78235063Snetchild    "clockid_t");
79235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, unsupported_clockid,
80235063Snetchild    "clockid_t");
81235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, unknown_clockid,
82235063Snetchild    "clockid_t");
83235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_to_native_clockid, return, "int");
84235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_clock_gettime, entry, "clockid_t",
85235063Snetchild    "struct l_timespec *");
86235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, conversion_error, "int");
87235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, gettime_error, "int");
88235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, copyout_error, "int");
89235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_gettime, return, "int");
90235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_clock_settime, entry, "clockid_t",
91235063Snetchild    "struct l_timespec *");
92235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, conversion_error, "int");
93235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, settime_error, "int");
94235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, copyin_error, "int");
95235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_settime, return, "int");
96235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_clock_getres, entry, "clockid_t",
97235063Snetchild    "struct l_timespec *");
98235063SnetchildLIN_SDT_PROBE_DEFINE0(time, linux_clock_getres, nullcall);
99235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, conversion_error, "int");
100235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, getres_error, "int");
101235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, copyout_error, "int");
102235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_getres, return, "int");
103235063SnetchildLIN_SDT_PROBE_DEFINE2(time, linux_nanosleep, entry, "const struct l_timespec *",
104235063Snetchild    "struct l_timespec *");
105235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, conversion_error, "int");
106235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, nanosleep_error, "int");
107235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, copyout_error, "int");
108235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, copyin_error, "int");
109235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_nanosleep, return, "int");
110235063SnetchildLIN_SDT_PROBE_DEFINE4(time, linux_clock_nanosleep, entry, "clockid_t", "int",
111235063Snetchild    "struct l_timespec *", "struct l_timespec *");
112235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, conversion_error, "int");
113235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, nanosleep_error, "int");
114235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, copyout_error, "int");
115235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, copyin_error, "int");
116235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, unsupported_flags, "int");
117235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, unsupported_clockid, "int");
118235063SnetchildLIN_SDT_PROBE_DEFINE1(time, linux_clock_nanosleep, return, "int");
119235063Snetchild
120161304Snetchildstatic void native_to_linux_timespec(struct l_timespec *,
121161304Snetchild				     struct timespec *);
122165408Sjkimstatic int linux_to_native_timespec(struct timespec *,
123161304Snetchild				     struct l_timespec *);
124161304Snetchildstatic int linux_to_native_clockid(clockid_t *, clockid_t);
125161304Snetchild
126161304Snetchildstatic void
127161304Snetchildnative_to_linux_timespec(struct l_timespec *ltp, struct timespec *ntp)
128161304Snetchild{
129235063Snetchild
130235063Snetchild	LIN_SDT_PROBE2(time, native_to_linux_timespec, entry, ltp, ntp);
131235063Snetchild
132161304Snetchild	ltp->tv_sec = ntp->tv_sec;
133161304Snetchild	ltp->tv_nsec = ntp->tv_nsec;
134235063Snetchild
135235063Snetchild	LIN_SDT_PROBE0(time, native_to_linux_timespec, return);
136161304Snetchild}
137161304Snetchild
138165408Sjkimstatic int
139161304Snetchildlinux_to_native_timespec(struct timespec *ntp, struct l_timespec *ltp)
140161304Snetchild{
141235063Snetchild
142235063Snetchild	LIN_SDT_PROBE2(time, linux_to_native_timespec, entry, ntp, ltp);
143235063Snetchild
144235063Snetchild	if (ltp->tv_sec < 0 || ltp->tv_nsec > (l_long)999999999L) {
145235063Snetchild		LIN_SDT_PROBE1(time, linux_to_native_timespec, return, EINVAL);
146165408Sjkim		return (EINVAL);
147235063Snetchild	}
148161304Snetchild	ntp->tv_sec = ltp->tv_sec;
149161304Snetchild	ntp->tv_nsec = ltp->tv_nsec;
150165408Sjkim
151235063Snetchild	LIN_SDT_PROBE1(time, linux_to_native_timespec, return, 0);
152165408Sjkim	return (0);
153161304Snetchild}
154161304Snetchild
155161304Snetchildstatic int
156161304Snetchildlinux_to_native_clockid(clockid_t *n, clockid_t l)
157161304Snetchild{
158235063Snetchild
159235063Snetchild	LIN_SDT_PROBE2(time, linux_to_native_clockid, entry, n, l);
160235063Snetchild
161161304Snetchild	switch (l) {
162161304Snetchild	case LINUX_CLOCK_REALTIME:
163161304Snetchild		*n = CLOCK_REALTIME;
164161304Snetchild		break;
165161304Snetchild	case LINUX_CLOCK_MONOTONIC:
166161304Snetchild		*n = CLOCK_MONOTONIC;
167161304Snetchild		break;
168161304Snetchild	case LINUX_CLOCK_PROCESS_CPUTIME_ID:
169161304Snetchild	case LINUX_CLOCK_THREAD_CPUTIME_ID:
170161304Snetchild	case LINUX_CLOCK_REALTIME_HR:
171161304Snetchild	case LINUX_CLOCK_MONOTONIC_HR:
172235063Snetchild		LIN_SDT_PROBE1(time, linux_to_native_clockid,
173235063Snetchild		    unsupported_clockid, l);
174235063Snetchild		LIN_SDT_PROBE1(time, linux_to_native_clockid, return, EINVAL);
175235063Snetchild		return (EINVAL);
176235063Snetchild		break;
177165408Sjkim	default:
178235063Snetchild		LIN_SDT_PROBE1(time, linux_to_native_clockid,
179235063Snetchild		    unknown_clockid, l);
180235063Snetchild		LIN_SDT_PROBE1(time, linux_to_native_clockid, return, EINVAL);
181165408Sjkim		return (EINVAL);
182165408Sjkim		break;
183161304Snetchild	}
184161304Snetchild
185235063Snetchild	LIN_SDT_PROBE1(time, linux_to_native_clockid, return, 0);
186165408Sjkim	return (0);
187161304Snetchild}
188161304Snetchild
189161304Snetchildint
190161304Snetchildlinux_clock_gettime(struct thread *td, struct linux_clock_gettime_args *args)
191161304Snetchild{
192161304Snetchild	struct l_timespec lts;
193161304Snetchild	int error;
194161304Snetchild	clockid_t nwhich = 0;	/* XXX: GCC */
195161304Snetchild	struct timespec tp;
196161304Snetchild
197235063Snetchild	LIN_SDT_PROBE2(time, linux_clock_gettime, entry, args->which, args->tp);
198235063Snetchild
199161304Snetchild	error = linux_to_native_clockid(&nwhich, args->which);
200235063Snetchild	if (error != 0) {
201235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_gettime, conversion_error,
202235063Snetchild		    error);
203235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_gettime, return, error);
204165408Sjkim		return (error);
205235063Snetchild	}
206161304Snetchild	error = kern_clock_gettime(td, nwhich, &tp);
207235063Snetchild	if (error != 0) {
208235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_gettime, gettime_error, error);
209235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_gettime, return, error);
210165408Sjkim		return (error);
211235063Snetchild	}
212161304Snetchild	native_to_linux_timespec(&lts, &tp);
213161304Snetchild
214235063Snetchild	error = copyout(&lts, args->tp, sizeof lts);
215235063Snetchild	if (error != 0)
216235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_gettime, copyout_error, error);
217235063Snetchild
218235063Snetchild	LIN_SDT_PROBE1(time, linux_clock_gettime, return, error);
219235063Snetchild	return (error);
220161304Snetchild}
221161304Snetchild
222161304Snetchildint
223161304Snetchildlinux_clock_settime(struct thread *td, struct linux_clock_settime_args *args)
224161304Snetchild{
225161304Snetchild	struct timespec ts;
226161304Snetchild	struct l_timespec lts;
227161304Snetchild	int error;
228161304Snetchild	clockid_t nwhich = 0;	/* XXX: GCC */
229161304Snetchild
230235063Snetchild	LIN_SDT_PROBE2(time, linux_clock_settime, entry, args->which, args->tp);
231235063Snetchild
232161304Snetchild	error = linux_to_native_clockid(&nwhich, args->which);
233235063Snetchild	if (error != 0) {
234235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, conversion_error,
235235063Snetchild		    error);
236235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, return, error);
237165408Sjkim		return (error);
238235063Snetchild	}
239161304Snetchild	error = copyin(args->tp, &lts, sizeof lts);
240235063Snetchild	if (error != 0) {
241235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, copyin_error, error);
242235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, return, error);
243165408Sjkim		return (error);
244235063Snetchild	}
245165408Sjkim	error = linux_to_native_timespec(&ts, &lts);
246235063Snetchild	if (error != 0) {
247235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, conversion_error,
248235063Snetchild		    error);
249235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, return, error);
250165408Sjkim		return (error);
251235063Snetchild	}
252161304Snetchild
253235063Snetchild	error = kern_clock_settime(td, nwhich, &ts);
254235063Snetchild	if (error != 0)
255235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_settime, settime_error, error);
256235063Snetchild
257235063Snetchild	LIN_SDT_PROBE1(time, linux_clock_settime, return, error);
258235063Snetchild	return (error);
259161304Snetchild}
260161304Snetchild
261161304Snetchildint
262161304Snetchildlinux_clock_getres(struct thread *td, struct linux_clock_getres_args *args)
263161304Snetchild{
264161304Snetchild	struct timespec ts;
265161304Snetchild	struct l_timespec lts;
266161304Snetchild	int error;
267161304Snetchild	clockid_t nwhich = 0;	/* XXX: GCC */
268161304Snetchild
269235063Snetchild	LIN_SDT_PROBE2(time, linux_clock_getres, entry, args->which, args->tp);
270235063Snetchild
271235063Snetchild	if (args->tp == NULL) {
272235063Snetchild		LIN_SDT_PROBE0(time, linux_clock_getres, nullcall);
273235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, return, 0);
274165408Sjkim	  	return (0);
275235063Snetchild	}
276161304Snetchild
277161304Snetchild	error = linux_to_native_clockid(&nwhich, args->which);
278235063Snetchild	if (error != 0) {
279235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, conversion_error,
280235063Snetchild		    error);
281235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, return, error);
282165408Sjkim		return (error);
283235063Snetchild	}
284161304Snetchild	error = kern_clock_getres(td, nwhich, &ts);
285235063Snetchild	if (error != 0) {
286235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, getres_error, error);
287235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, return, error);
288165408Sjkim		return (error);
289235063Snetchild	}
290165408Sjkim	native_to_linux_timespec(&lts, &ts);
291161304Snetchild
292235063Snetchild	error = copyout(&lts, args->tp, sizeof lts);
293235063Snetchild	if (error != 0)
294235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_getres, copyout_error, error);
295235063Snetchild
296235063Snetchild	LIN_SDT_PROBE1(time, linux_clock_getres, return, error);
297235063Snetchild	return (error);
298161304Snetchild}
299161304Snetchild
300161304Snetchildint
301165408Sjkimlinux_nanosleep(struct thread *td, struct linux_nanosleep_args *args)
302165408Sjkim{
303165408Sjkim	struct timespec *rmtp;
304165408Sjkim	struct l_timespec lrqts, lrmts;
305165408Sjkim	struct timespec rqts, rmts;
306165408Sjkim	int error;
307165408Sjkim
308235063Snetchild	LIN_SDT_PROBE2(time, linux_nanosleep, entry, args->rqtp, args->rmtp);
309235063Snetchild
310165408Sjkim	error = copyin(args->rqtp, &lrqts, sizeof lrqts);
311235063Snetchild	if (error != 0) {
312235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, copyin_error, error);
313235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, return, error);
314165408Sjkim		return (error);
315235063Snetchild	}
316165408Sjkim
317165408Sjkim	if (args->rmtp != NULL)
318165408Sjkim	   	rmtp = &rmts;
319165408Sjkim	else
320165408Sjkim	   	rmtp = NULL;
321165408Sjkim
322165408Sjkim	error = linux_to_native_timespec(&rqts, &lrqts);
323235063Snetchild	if (error != 0) {
324235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, conversion_error, error);
325235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, return, error);
326165408Sjkim		return (error);
327235063Snetchild	}
328165408Sjkim	error = kern_nanosleep(td, &rqts, rmtp);
329235063Snetchild	if (error != 0) {
330235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, nanosleep_error, error);
331235063Snetchild		LIN_SDT_PROBE1(time, linux_nanosleep, return, error);
332165408Sjkim		return (error);
333235063Snetchild	}
334165408Sjkim
335165408Sjkim	if (args->rmtp != NULL) {
336165408Sjkim	   	native_to_linux_timespec(&lrmts, rmtp);
337165408Sjkim	   	error = copyout(&lrmts, args->rmtp, sizeof(lrmts));
338235063Snetchild		if (error != 0) {
339235063Snetchild			LIN_SDT_PROBE1(time, linux_nanosleep, copyout_error,
340235063Snetchild			    error);
341235063Snetchild			LIN_SDT_PROBE1(time, linux_nanosleep, return, error);
342165408Sjkim		   	return (error);
343235063Snetchild		}
344165408Sjkim	}
345165408Sjkim
346235063Snetchild	LIN_SDT_PROBE1(time, linux_nanosleep, return, 0);
347165408Sjkim	return (0);
348165408Sjkim}
349165408Sjkim
350165408Sjkimint
351161304Snetchildlinux_clock_nanosleep(struct thread *td, struct linux_clock_nanosleep_args *args)
352161304Snetchild{
353161304Snetchild	struct timespec *rmtp;
354161304Snetchild	struct l_timespec lrqts, lrmts;
355161304Snetchild	struct timespec rqts, rmts;
356161304Snetchild	int error;
357161304Snetchild
358235063Snetchild	LIN_SDT_PROBE4(time, linux_clock_nanosleep, entry, args->which,
359235063Snetchild	    args->flags, args->rqtp, args->rmtp);
360235063Snetchild
361235063Snetchild	if (args->flags != 0) {
362235063Snetchild		/* XXX deal with TIMER_ABSTIME */
363235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, unsupported_flags,
364235063Snetchild		    args->flags);
365235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, EINVAL);
366165408Sjkim		return (EINVAL);	/* XXX deal with TIMER_ABSTIME */
367235063Snetchild	}
368161304Snetchild
369235063Snetchild	if (args->which != LINUX_CLOCK_REALTIME) {
370235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, unsupported_clockid,
371235063Snetchild		    args->which);
372235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, EINVAL);
373165408Sjkim		return (EINVAL);
374235063Snetchild	}
375161304Snetchild
376161304Snetchild	error = copyin(args->rqtp, &lrqts, sizeof lrqts);
377235063Snetchild	if (error != 0) {
378235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, copyin_error,
379235063Snetchild		    error);
380235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error);
381165408Sjkim		return (error);
382235063Snetchild	}
383161304Snetchild
384161304Snetchild	if (args->rmtp != NULL)
385161304Snetchild	   	rmtp = &rmts;
386161304Snetchild	else
387161304Snetchild	   	rmtp = NULL;
388161304Snetchild
389165408Sjkim	error = linux_to_native_timespec(&rqts, &lrqts);
390235063Snetchild	if (error != 0) {
391235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, conversion_error,
392235063Snetchild		    error);
393235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error);
394165408Sjkim		return (error);
395235063Snetchild	}
396161304Snetchild	error = kern_nanosleep(td, &rqts, rmtp);
397235063Snetchild	if (error != 0) {
398235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, nanosleep_error,
399235063Snetchild		    error);
400235063Snetchild		LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, error);
401165408Sjkim		return (error);
402235063Snetchild	}
403165408Sjkim
404161304Snetchild	if (args->rmtp != NULL) {
405161304Snetchild	   	native_to_linux_timespec(&lrmts, rmtp);
406161304Snetchild	   	error = copyout(&lrmts, args->rmtp, sizeof lrmts );
407235063Snetchild		if (error != 0) {
408235063Snetchild			LIN_SDT_PROBE1(time, linux_clock_nanosleep,
409235063Snetchild			    copyout_error, error);
410235063Snetchild			LIN_SDT_PROBE1(time, linux_nanosleep, return, error);
411165408Sjkim		   	return (error);
412235063Snetchild		}
413161304Snetchild	}
414161304Snetchild
415235063Snetchild	LIN_SDT_PROBE1(time, linux_clock_nanosleep, return, 0);
416165408Sjkim	return (0);
417161304Snetchild}
418