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(<s, &tp); 213161304Snetchild 214235063Snetchild error = copyout(<s, 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, <s, 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, <s); 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(<s, &ts); 291161304Snetchild 292235063Snetchild error = copyout(<s, 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