Linux Audio

Check our new training course

Loading...
v6.8
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 * Dummy stubs used when CONFIG_POSIX_TIMERS=n
  4 *
  5 * Created by:  Nicolas Pitre, July 2016
  6 * Copyright:   (C) 2016 Linaro Limited
 
 
 
 
  7 */
  8
  9#include <linux/linkage.h>
 10#include <linux/kernel.h>
 11#include <linux/sched.h>
 12#include <linux/errno.h>
 13#include <linux/syscalls.h>
 14#include <linux/ktime.h>
 15#include <linux/timekeeping.h>
 16#include <linux/posix-timers.h>
 17#include <linux/time_namespace.h>
 18#include <linux/compat.h>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 19
 20/*
 21 * We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
 22 * as it is easy to remain compatible with little code. CLOCK_BOOTTIME
 23 * is also included for convenience as at least systemd uses it.
 24 */
 25
 26SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
 27		const struct __kernel_timespec __user *, tp)
 28{
 29	struct timespec64 new_tp;
 30
 31	if (which_clock != CLOCK_REALTIME)
 32		return -EINVAL;
 33	if (get_timespec64(&new_tp, tp))
 34		return -EFAULT;
 35
 36	return do_sys_settimeofday64(&new_tp, NULL);
 37}
 38
 39static int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp)
 40{
 41	switch (which_clock) {
 42	case CLOCK_REALTIME:
 43		ktime_get_real_ts64(tp);
 44		break;
 45	case CLOCK_MONOTONIC:
 46		ktime_get_ts64(tp);
 47		timens_add_monotonic(tp);
 48		break;
 49	case CLOCK_BOOTTIME:
 50		ktime_get_boottime_ts64(tp);
 51		timens_add_boottime(tp);
 52		break;
 53	default:
 54		return -EINVAL;
 55	}
 56
 57	return 0;
 58}
 59
 60SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
 61		struct __kernel_timespec __user *, tp)
 62{
 63	int ret;
 64	struct timespec64 kernel_tp;
 65
 66	ret = do_clock_gettime(which_clock, &kernel_tp);
 67	if (ret)
 68		return ret;
 69
 70	if (put_timespec64(&kernel_tp, tp))
 
 
 71		return -EFAULT;
 72	return 0;
 73}
 74
 75SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct __kernel_timespec __user *, tp)
 76{
 77	struct timespec64 rtn_tp = {
 78		.tv_sec = 0,
 79		.tv_nsec = hrtimer_resolution,
 80	};
 81
 82	switch (which_clock) {
 83	case CLOCK_REALTIME:
 84	case CLOCK_MONOTONIC:
 85	case CLOCK_BOOTTIME:
 86		if (put_timespec64(&rtn_tp, tp))
 87			return -EFAULT;
 88		return 0;
 89	default:
 90		return -EINVAL;
 91	}
 92}
 93
 94SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
 95		const struct __kernel_timespec __user *, rqtp,
 96		struct __kernel_timespec __user *, rmtp)
 97{
 98	struct timespec64 t;
 99	ktime_t texp;
100
101	switch (which_clock) {
102	case CLOCK_REALTIME:
103	case CLOCK_MONOTONIC:
104	case CLOCK_BOOTTIME:
105		break;
106	default:
107		return -EINVAL;
108	}
109
110	if (get_timespec64(&t, rqtp))
111		return -EFAULT;
112	if (!timespec64_valid(&t))
113		return -EINVAL;
114	if (flags & TIMER_ABSTIME)
115		rmtp = NULL;
116	current->restart_block.fn = do_no_restart_syscall;
117	current->restart_block.nanosleep.type = rmtp ? TT_NATIVE : TT_NONE;
118	current->restart_block.nanosleep.rmtp = rmtp;
119	texp = timespec64_to_ktime(t);
120	if (flags & TIMER_ABSTIME)
121		texp = timens_ktime_to_host(which_clock, texp);
122	return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
123				 HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
124				 which_clock);
125}
126
127#ifdef CONFIG_COMPAT_32BIT_TIME
128
129SYSCALL_DEFINE2(clock_settime32, const clockid_t, which_clock,
130		struct old_timespec32 __user *, tp)
131{
132	struct timespec64 new_tp;
133
134	if (which_clock != CLOCK_REALTIME)
135		return -EINVAL;
136	if (get_old_timespec32(&new_tp, tp))
137		return -EFAULT;
138
139	return do_sys_settimeofday64(&new_tp, NULL);
140}
141
142SYSCALL_DEFINE2(clock_gettime32, clockid_t, which_clock,
143		struct old_timespec32 __user *, tp)
144{
145	int ret;
146	struct timespec64 kernel_tp;
147
148	ret = do_clock_gettime(which_clock, &kernel_tp);
149	if (ret)
150		return ret;
151
152	if (put_old_timespec32(&kernel_tp, tp))
153		return -EFAULT;
154	return 0;
155}
156
157SYSCALL_DEFINE2(clock_getres_time32, clockid_t, which_clock,
158		struct old_timespec32 __user *, tp)
159{
160	struct timespec64 rtn_tp = {
161		.tv_sec = 0,
162		.tv_nsec = hrtimer_resolution,
163	};
164
165	switch (which_clock) {
166	case CLOCK_REALTIME:
167	case CLOCK_MONOTONIC:
168	case CLOCK_BOOTTIME:
169		if (put_old_timespec32(&rtn_tp, tp))
170			return -EFAULT;
171		return 0;
 
 
 
 
172	default:
173		return -EINVAL;
174	}
175}
176
177SYSCALL_DEFINE4(clock_nanosleep_time32, clockid_t, which_clock, int, flags,
178		struct old_timespec32 __user *, rqtp,
179		struct old_timespec32 __user *, rmtp)
180{
181	struct timespec64 t;
182	ktime_t texp;
183
184	switch (which_clock) {
185	case CLOCK_REALTIME:
186	case CLOCK_MONOTONIC:
187	case CLOCK_BOOTTIME:
188		break;
189	default:
190		return -EINVAL;
191	}
192
193	if (get_old_timespec32(&t, rqtp))
194		return -EFAULT;
195	if (!timespec64_valid(&t))
196		return -EINVAL;
197	if (flags & TIMER_ABSTIME)
198		rmtp = NULL;
199	current->restart_block.fn = do_no_restart_syscall;
200	current->restart_block.nanosleep.type = rmtp ? TT_COMPAT : TT_NONE;
201	current->restart_block.nanosleep.compat_rmtp = rmtp;
202	texp = timespec64_to_ktime(t);
203	if (flags & TIMER_ABSTIME)
204		texp = timens_ktime_to_host(which_clock, texp);
205	return hrtimer_nanosleep(texp, flags & TIMER_ABSTIME ?
206				 HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
207				 which_clock);
208}
209#endif
v4.10.11
 
  1/*
  2 * Dummy stubs used when CONFIG_POSIX_TIMERS=n
  3 *
  4 * Created by:  Nicolas Pitre, July 2016
  5 * Copyright:   (C) 2016 Linaro Limited
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License version 2 as
  9 * published by the Free Software Foundation.
 10 */
 11
 12#include <linux/linkage.h>
 13#include <linux/kernel.h>
 14#include <linux/sched.h>
 15#include <linux/errno.h>
 16#include <linux/syscalls.h>
 17#include <linux/ktime.h>
 18#include <linux/timekeeping.h>
 19#include <linux/posix-timers.h>
 20
 21asmlinkage long sys_ni_posix_timers(void)
 22{
 23	pr_err_once("process %d (%s) attempted a POSIX timer syscall "
 24		    "while CONFIG_POSIX_TIMERS is not set\n",
 25		    current->pid, current->comm);
 26	return -ENOSYS;
 27}
 28
 29#define SYS_NI(name)  SYSCALL_ALIAS(sys_##name, sys_ni_posix_timers)
 30
 31SYS_NI(timer_create);
 32SYS_NI(timer_gettime);
 33SYS_NI(timer_getoverrun);
 34SYS_NI(timer_settime);
 35SYS_NI(timer_delete);
 36SYS_NI(clock_adjtime);
 37SYS_NI(getitimer);
 38SYS_NI(setitimer);
 39#ifdef __ARCH_WANT_SYS_ALARM
 40SYS_NI(alarm);
 41#endif
 42
 43/*
 44 * We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
 45 * as it is easy to remain compatible with little code. CLOCK_BOOTTIME
 46 * is also included for convenience as at least systemd uses it.
 47 */
 48
 49SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
 50		const struct timespec __user *, tp)
 51{
 52	struct timespec new_tp;
 53
 54	if (which_clock != CLOCK_REALTIME)
 55		return -EINVAL;
 56	if (copy_from_user(&new_tp, tp, sizeof (*tp)))
 57		return -EFAULT;
 58	return do_sys_settimeofday(&new_tp, NULL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 59}
 60
 61SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
 62		struct timespec __user *,tp)
 63{
 64	struct timespec kernel_tp;
 
 65
 66	switch (which_clock) {
 67	case CLOCK_REALTIME: ktime_get_real_ts(&kernel_tp); break;
 68	case CLOCK_MONOTONIC: ktime_get_ts(&kernel_tp); break;
 69	case CLOCK_BOOTTIME: get_monotonic_boottime(&kernel_tp); break;
 70	default: return -EINVAL;
 71	}
 72	if (copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
 73		return -EFAULT;
 74	return 0;
 75}
 76
 77SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp)
 78{
 79	struct timespec rtn_tp = {
 80		.tv_sec = 0,
 81		.tv_nsec = hrtimer_resolution,
 82	};
 83
 84	switch (which_clock) {
 85	case CLOCK_REALTIME:
 86	case CLOCK_MONOTONIC:
 87	case CLOCK_BOOTTIME:
 88		if (copy_to_user(tp, &rtn_tp, sizeof(rtn_tp)))
 89			return -EFAULT;
 90		return 0;
 91	default:
 92		return -EINVAL;
 93	}
 94}
 95
 96SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
 97		const struct timespec __user *, rqtp,
 98		struct timespec __user *, rmtp)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 99{
100	struct timespec t;
 
 
 
101
102	switch (which_clock) {
103	case CLOCK_REALTIME:
104	case CLOCK_MONOTONIC:
105	case CLOCK_BOOTTIME:
106		if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
107			return -EFAULT;
108		if (!timespec_valid(&t))
109			return -EINVAL;
110		return hrtimer_nanosleep(&t, rmtp, flags & TIMER_ABSTIME ?
111					 HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
112					 which_clock);
113	default:
114		return -EINVAL;
115	}
116}
117
118#ifdef CONFIG_COMPAT
119long clock_nanosleep_restart(struct restart_block *restart_block)
 
120{
121	return hrtimer_nanosleep_restart(restart_block);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122}
123#endif