cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

alarmtimer.c (24222B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Alarmtimer interface
      4 *
      5 * This interface provides a timer which is similar to hrtimers,
      6 * but triggers a RTC alarm if the box is suspend.
      7 *
      8 * This interface is influenced by the Android RTC Alarm timer
      9 * interface.
     10 *
     11 * Copyright (C) 2010 IBM Corporation
     12 *
     13 * Author: John Stultz <john.stultz@linaro.org>
     14 */
     15#include <linux/time.h>
     16#include <linux/hrtimer.h>
     17#include <linux/timerqueue.h>
     18#include <linux/rtc.h>
     19#include <linux/sched/signal.h>
     20#include <linux/sched/debug.h>
     21#include <linux/alarmtimer.h>
     22#include <linux/mutex.h>
     23#include <linux/platform_device.h>
     24#include <linux/posix-timers.h>
     25#include <linux/workqueue.h>
     26#include <linux/freezer.h>
     27#include <linux/compat.h>
     28#include <linux/module.h>
     29#include <linux/time_namespace.h>
     30
     31#include "posix-timers.h"
     32
     33#define CREATE_TRACE_POINTS
     34#include <trace/events/alarmtimer.h>
     35
     36/**
     37 * struct alarm_base - Alarm timer bases
     38 * @lock:		Lock for syncrhonized access to the base
     39 * @timerqueue:		Timerqueue head managing the list of events
     40 * @get_ktime:		Function to read the time correlating to the base
     41 * @get_timespec:	Function to read the namespace time correlating to the base
     42 * @base_clockid:	clockid for the base
     43 */
     44static struct alarm_base {
     45	spinlock_t		lock;
     46	struct timerqueue_head	timerqueue;
     47	ktime_t			(*get_ktime)(void);
     48	void			(*get_timespec)(struct timespec64 *tp);
     49	clockid_t		base_clockid;
     50} alarm_bases[ALARM_NUMTYPE];
     51
     52#if defined(CONFIG_POSIX_TIMERS) || defined(CONFIG_RTC_CLASS)
     53/* freezer information to handle clock_nanosleep triggered wakeups */
     54static enum alarmtimer_type freezer_alarmtype;
     55static ktime_t freezer_expires;
     56static ktime_t freezer_delta;
     57static DEFINE_SPINLOCK(freezer_delta_lock);
     58#endif
     59
     60#ifdef CONFIG_RTC_CLASS
     61/* rtc timer and device for setting alarm wakeups at suspend */
     62static struct rtc_timer		rtctimer;
     63static struct rtc_device	*rtcdev;
     64static DEFINE_SPINLOCK(rtcdev_lock);
     65
     66/**
     67 * alarmtimer_get_rtcdev - Return selected rtcdevice
     68 *
     69 * This function returns the rtc device to use for wakealarms.
     70 */
     71struct rtc_device *alarmtimer_get_rtcdev(void)
     72{
     73	unsigned long flags;
     74	struct rtc_device *ret;
     75
     76	spin_lock_irqsave(&rtcdev_lock, flags);
     77	ret = rtcdev;
     78	spin_unlock_irqrestore(&rtcdev_lock, flags);
     79
     80	return ret;
     81}
     82EXPORT_SYMBOL_GPL(alarmtimer_get_rtcdev);
     83
     84static int alarmtimer_rtc_add_device(struct device *dev,
     85				struct class_interface *class_intf)
     86{
     87	unsigned long flags;
     88	struct rtc_device *rtc = to_rtc_device(dev);
     89	struct platform_device *pdev;
     90	int ret = 0;
     91
     92	if (rtcdev)
     93		return -EBUSY;
     94
     95	if (!test_bit(RTC_FEATURE_ALARM, rtc->features))
     96		return -1;
     97	if (!device_may_wakeup(rtc->dev.parent))
     98		return -1;
     99
    100	pdev = platform_device_register_data(dev, "alarmtimer",
    101					     PLATFORM_DEVID_AUTO, NULL, 0);
    102	if (!IS_ERR(pdev))
    103		device_init_wakeup(&pdev->dev, true);
    104
    105	spin_lock_irqsave(&rtcdev_lock, flags);
    106	if (!IS_ERR(pdev) && !rtcdev) {
    107		if (!try_module_get(rtc->owner)) {
    108			ret = -1;
    109			goto unlock;
    110		}
    111
    112		rtcdev = rtc;
    113		/* hold a reference so it doesn't go away */
    114		get_device(dev);
    115		pdev = NULL;
    116	} else {
    117		ret = -1;
    118	}
    119unlock:
    120	spin_unlock_irqrestore(&rtcdev_lock, flags);
    121
    122	platform_device_unregister(pdev);
    123
    124	return ret;
    125}
    126
    127static inline void alarmtimer_rtc_timer_init(void)
    128{
    129	rtc_timer_init(&rtctimer, NULL, NULL);
    130}
    131
    132static struct class_interface alarmtimer_rtc_interface = {
    133	.add_dev = &alarmtimer_rtc_add_device,
    134};
    135
    136static int alarmtimer_rtc_interface_setup(void)
    137{
    138	alarmtimer_rtc_interface.class = rtc_class;
    139	return class_interface_register(&alarmtimer_rtc_interface);
    140}
    141static void alarmtimer_rtc_interface_remove(void)
    142{
    143	class_interface_unregister(&alarmtimer_rtc_interface);
    144}
    145#else
    146static inline int alarmtimer_rtc_interface_setup(void) { return 0; }
    147static inline void alarmtimer_rtc_interface_remove(void) { }
    148static inline void alarmtimer_rtc_timer_init(void) { }
    149#endif
    150
    151/**
    152 * alarmtimer_enqueue - Adds an alarm timer to an alarm_base timerqueue
    153 * @base: pointer to the base where the timer is being run
    154 * @alarm: pointer to alarm being enqueued.
    155 *
    156 * Adds alarm to a alarm_base timerqueue
    157 *
    158 * Must hold base->lock when calling.
    159 */
    160static void alarmtimer_enqueue(struct alarm_base *base, struct alarm *alarm)
    161{
    162	if (alarm->state & ALARMTIMER_STATE_ENQUEUED)
    163		timerqueue_del(&base->timerqueue, &alarm->node);
    164
    165	timerqueue_add(&base->timerqueue, &alarm->node);
    166	alarm->state |= ALARMTIMER_STATE_ENQUEUED;
    167}
    168
    169/**
    170 * alarmtimer_dequeue - Removes an alarm timer from an alarm_base timerqueue
    171 * @base: pointer to the base where the timer is running
    172 * @alarm: pointer to alarm being removed
    173 *
    174 * Removes alarm to a alarm_base timerqueue
    175 *
    176 * Must hold base->lock when calling.
    177 */
    178static void alarmtimer_dequeue(struct alarm_base *base, struct alarm *alarm)
    179{
    180	if (!(alarm->state & ALARMTIMER_STATE_ENQUEUED))
    181		return;
    182
    183	timerqueue_del(&base->timerqueue, &alarm->node);
    184	alarm->state &= ~ALARMTIMER_STATE_ENQUEUED;
    185}
    186
    187
    188/**
    189 * alarmtimer_fired - Handles alarm hrtimer being fired.
    190 * @timer: pointer to hrtimer being run
    191 *
    192 * When a alarm timer fires, this runs through the timerqueue to
    193 * see which alarms expired, and runs those. If there are more alarm
    194 * timers queued for the future, we set the hrtimer to fire when
    195 * the next future alarm timer expires.
    196 */
    197static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)
    198{
    199	struct alarm *alarm = container_of(timer, struct alarm, timer);
    200	struct alarm_base *base = &alarm_bases[alarm->type];
    201	unsigned long flags;
    202	int ret = HRTIMER_NORESTART;
    203	int restart = ALARMTIMER_NORESTART;
    204
    205	spin_lock_irqsave(&base->lock, flags);
    206	alarmtimer_dequeue(base, alarm);
    207	spin_unlock_irqrestore(&base->lock, flags);
    208
    209	if (alarm->function)
    210		restart = alarm->function(alarm, base->get_ktime());
    211
    212	spin_lock_irqsave(&base->lock, flags);
    213	if (restart != ALARMTIMER_NORESTART) {
    214		hrtimer_set_expires(&alarm->timer, alarm->node.expires);
    215		alarmtimer_enqueue(base, alarm);
    216		ret = HRTIMER_RESTART;
    217	}
    218	spin_unlock_irqrestore(&base->lock, flags);
    219
    220	trace_alarmtimer_fired(alarm, base->get_ktime());
    221	return ret;
    222
    223}
    224
    225ktime_t alarm_expires_remaining(const struct alarm *alarm)
    226{
    227	struct alarm_base *base = &alarm_bases[alarm->type];
    228	return ktime_sub(alarm->node.expires, base->get_ktime());
    229}
    230EXPORT_SYMBOL_GPL(alarm_expires_remaining);
    231
    232#ifdef CONFIG_RTC_CLASS
    233/**
    234 * alarmtimer_suspend - Suspend time callback
    235 * @dev: unused
    236 *
    237 * When we are going into suspend, we look through the bases
    238 * to see which is the soonest timer to expire. We then
    239 * set an rtc timer to fire that far into the future, which
    240 * will wake us from suspend.
    241 */
    242static int alarmtimer_suspend(struct device *dev)
    243{
    244	ktime_t min, now, expires;
    245	int i, ret, type;
    246	struct rtc_device *rtc;
    247	unsigned long flags;
    248	struct rtc_time tm;
    249
    250	spin_lock_irqsave(&freezer_delta_lock, flags);
    251	min = freezer_delta;
    252	expires = freezer_expires;
    253	type = freezer_alarmtype;
    254	freezer_delta = 0;
    255	spin_unlock_irqrestore(&freezer_delta_lock, flags);
    256
    257	rtc = alarmtimer_get_rtcdev();
    258	/* If we have no rtcdev, just return */
    259	if (!rtc)
    260		return 0;
    261
    262	/* Find the soonest timer to expire*/
    263	for (i = 0; i < ALARM_NUMTYPE; i++) {
    264		struct alarm_base *base = &alarm_bases[i];
    265		struct timerqueue_node *next;
    266		ktime_t delta;
    267
    268		spin_lock_irqsave(&base->lock, flags);
    269		next = timerqueue_getnext(&base->timerqueue);
    270		spin_unlock_irqrestore(&base->lock, flags);
    271		if (!next)
    272			continue;
    273		delta = ktime_sub(next->expires, base->get_ktime());
    274		if (!min || (delta < min)) {
    275			expires = next->expires;
    276			min = delta;
    277			type = i;
    278		}
    279	}
    280	if (min == 0)
    281		return 0;
    282
    283	if (ktime_to_ns(min) < 2 * NSEC_PER_SEC) {
    284		pm_wakeup_event(dev, 2 * MSEC_PER_SEC);
    285		return -EBUSY;
    286	}
    287
    288	trace_alarmtimer_suspend(expires, type);
    289
    290	/* Setup an rtc timer to fire that far in the future */
    291	rtc_timer_cancel(rtc, &rtctimer);
    292	rtc_read_time(rtc, &tm);
    293	now = rtc_tm_to_ktime(tm);
    294	now = ktime_add(now, min);
    295
    296	/* Set alarm, if in the past reject suspend briefly to handle */
    297	ret = rtc_timer_start(rtc, &rtctimer, now, 0);
    298	if (ret < 0)
    299		pm_wakeup_event(dev, MSEC_PER_SEC);
    300	return ret;
    301}
    302
    303static int alarmtimer_resume(struct device *dev)
    304{
    305	struct rtc_device *rtc;
    306
    307	rtc = alarmtimer_get_rtcdev();
    308	if (rtc)
    309		rtc_timer_cancel(rtc, &rtctimer);
    310	return 0;
    311}
    312
    313#else
    314static int alarmtimer_suspend(struct device *dev)
    315{
    316	return 0;
    317}
    318
    319static int alarmtimer_resume(struct device *dev)
    320{
    321	return 0;
    322}
    323#endif
    324
    325static void
    326__alarm_init(struct alarm *alarm, enum alarmtimer_type type,
    327	     enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
    328{
    329	timerqueue_init(&alarm->node);
    330	alarm->timer.function = alarmtimer_fired;
    331	alarm->function = function;
    332	alarm->type = type;
    333	alarm->state = ALARMTIMER_STATE_INACTIVE;
    334}
    335
    336/**
    337 * alarm_init - Initialize an alarm structure
    338 * @alarm: ptr to alarm to be initialized
    339 * @type: the type of the alarm
    340 * @function: callback that is run when the alarm fires
    341 */
    342void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
    343		enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
    344{
    345	hrtimer_init(&alarm->timer, alarm_bases[type].base_clockid,
    346		     HRTIMER_MODE_ABS);
    347	__alarm_init(alarm, type, function);
    348}
    349EXPORT_SYMBOL_GPL(alarm_init);
    350
    351/**
    352 * alarm_start - Sets an absolute alarm to fire
    353 * @alarm: ptr to alarm to set
    354 * @start: time to run the alarm
    355 */
    356void alarm_start(struct alarm *alarm, ktime_t start)
    357{
    358	struct alarm_base *base = &alarm_bases[alarm->type];
    359	unsigned long flags;
    360
    361	spin_lock_irqsave(&base->lock, flags);
    362	alarm->node.expires = start;
    363	alarmtimer_enqueue(base, alarm);
    364	hrtimer_start(&alarm->timer, alarm->node.expires, HRTIMER_MODE_ABS);
    365	spin_unlock_irqrestore(&base->lock, flags);
    366
    367	trace_alarmtimer_start(alarm, base->get_ktime());
    368}
    369EXPORT_SYMBOL_GPL(alarm_start);
    370
    371/**
    372 * alarm_start_relative - Sets a relative alarm to fire
    373 * @alarm: ptr to alarm to set
    374 * @start: time relative to now to run the alarm
    375 */
    376void alarm_start_relative(struct alarm *alarm, ktime_t start)
    377{
    378	struct alarm_base *base = &alarm_bases[alarm->type];
    379
    380	start = ktime_add_safe(start, base->get_ktime());
    381	alarm_start(alarm, start);
    382}
    383EXPORT_SYMBOL_GPL(alarm_start_relative);
    384
    385void alarm_restart(struct alarm *alarm)
    386{
    387	struct alarm_base *base = &alarm_bases[alarm->type];
    388	unsigned long flags;
    389
    390	spin_lock_irqsave(&base->lock, flags);
    391	hrtimer_set_expires(&alarm->timer, alarm->node.expires);
    392	hrtimer_restart(&alarm->timer);
    393	alarmtimer_enqueue(base, alarm);
    394	spin_unlock_irqrestore(&base->lock, flags);
    395}
    396EXPORT_SYMBOL_GPL(alarm_restart);
    397
    398/**
    399 * alarm_try_to_cancel - Tries to cancel an alarm timer
    400 * @alarm: ptr to alarm to be canceled
    401 *
    402 * Returns 1 if the timer was canceled, 0 if it was not running,
    403 * and -1 if the callback was running
    404 */
    405int alarm_try_to_cancel(struct alarm *alarm)
    406{
    407	struct alarm_base *base = &alarm_bases[alarm->type];
    408	unsigned long flags;
    409	int ret;
    410
    411	spin_lock_irqsave(&base->lock, flags);
    412	ret = hrtimer_try_to_cancel(&alarm->timer);
    413	if (ret >= 0)
    414		alarmtimer_dequeue(base, alarm);
    415	spin_unlock_irqrestore(&base->lock, flags);
    416
    417	trace_alarmtimer_cancel(alarm, base->get_ktime());
    418	return ret;
    419}
    420EXPORT_SYMBOL_GPL(alarm_try_to_cancel);
    421
    422
    423/**
    424 * alarm_cancel - Spins trying to cancel an alarm timer until it is done
    425 * @alarm: ptr to alarm to be canceled
    426 *
    427 * Returns 1 if the timer was canceled, 0 if it was not active.
    428 */
    429int alarm_cancel(struct alarm *alarm)
    430{
    431	for (;;) {
    432		int ret = alarm_try_to_cancel(alarm);
    433		if (ret >= 0)
    434			return ret;
    435		hrtimer_cancel_wait_running(&alarm->timer);
    436	}
    437}
    438EXPORT_SYMBOL_GPL(alarm_cancel);
    439
    440
    441u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval)
    442{
    443	u64 overrun = 1;
    444	ktime_t delta;
    445
    446	delta = ktime_sub(now, alarm->node.expires);
    447
    448	if (delta < 0)
    449		return 0;
    450
    451	if (unlikely(delta >= interval)) {
    452		s64 incr = ktime_to_ns(interval);
    453
    454		overrun = ktime_divns(delta, incr);
    455
    456		alarm->node.expires = ktime_add_ns(alarm->node.expires,
    457							incr*overrun);
    458
    459		if (alarm->node.expires > now)
    460			return overrun;
    461		/*
    462		 * This (and the ktime_add() below) is the
    463		 * correction for exact:
    464		 */
    465		overrun++;
    466	}
    467
    468	alarm->node.expires = ktime_add_safe(alarm->node.expires, interval);
    469	return overrun;
    470}
    471EXPORT_SYMBOL_GPL(alarm_forward);
    472
    473u64 alarm_forward_now(struct alarm *alarm, ktime_t interval)
    474{
    475	struct alarm_base *base = &alarm_bases[alarm->type];
    476
    477	return alarm_forward(alarm, base->get_ktime(), interval);
    478}
    479EXPORT_SYMBOL_GPL(alarm_forward_now);
    480
    481#ifdef CONFIG_POSIX_TIMERS
    482
    483static void alarmtimer_freezerset(ktime_t absexp, enum alarmtimer_type type)
    484{
    485	struct alarm_base *base;
    486	unsigned long flags;
    487	ktime_t delta;
    488
    489	switch(type) {
    490	case ALARM_REALTIME:
    491		base = &alarm_bases[ALARM_REALTIME];
    492		type = ALARM_REALTIME_FREEZER;
    493		break;
    494	case ALARM_BOOTTIME:
    495		base = &alarm_bases[ALARM_BOOTTIME];
    496		type = ALARM_BOOTTIME_FREEZER;
    497		break;
    498	default:
    499		WARN_ONCE(1, "Invalid alarm type: %d\n", type);
    500		return;
    501	}
    502
    503	delta = ktime_sub(absexp, base->get_ktime());
    504
    505	spin_lock_irqsave(&freezer_delta_lock, flags);
    506	if (!freezer_delta || (delta < freezer_delta)) {
    507		freezer_delta = delta;
    508		freezer_expires = absexp;
    509		freezer_alarmtype = type;
    510	}
    511	spin_unlock_irqrestore(&freezer_delta_lock, flags);
    512}
    513
    514/**
    515 * clock2alarm - helper that converts from clockid to alarmtypes
    516 * @clockid: clockid.
    517 */
    518static enum alarmtimer_type clock2alarm(clockid_t clockid)
    519{
    520	if (clockid == CLOCK_REALTIME_ALARM)
    521		return ALARM_REALTIME;
    522	if (clockid == CLOCK_BOOTTIME_ALARM)
    523		return ALARM_BOOTTIME;
    524	return -1;
    525}
    526
    527/**
    528 * alarm_handle_timer - Callback for posix timers
    529 * @alarm: alarm that fired
    530 * @now: time at the timer expiration
    531 *
    532 * Posix timer callback for expired alarm timers.
    533 *
    534 * Return: whether the timer is to be restarted
    535 */
    536static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
    537							ktime_t now)
    538{
    539	struct k_itimer *ptr = container_of(alarm, struct k_itimer,
    540					    it.alarm.alarmtimer);
    541	enum alarmtimer_restart result = ALARMTIMER_NORESTART;
    542	unsigned long flags;
    543	int si_private = 0;
    544
    545	spin_lock_irqsave(&ptr->it_lock, flags);
    546
    547	ptr->it_active = 0;
    548	if (ptr->it_interval)
    549		si_private = ++ptr->it_requeue_pending;
    550
    551	if (posix_timer_event(ptr, si_private) && ptr->it_interval) {
    552		/*
    553		 * Handle ignored signals and rearm the timer. This will go
    554		 * away once we handle ignored signals proper.
    555		 */
    556		ptr->it_overrun += alarm_forward_now(alarm, ptr->it_interval);
    557		++ptr->it_requeue_pending;
    558		ptr->it_active = 1;
    559		result = ALARMTIMER_RESTART;
    560	}
    561	spin_unlock_irqrestore(&ptr->it_lock, flags);
    562
    563	return result;
    564}
    565
    566/**
    567 * alarm_timer_rearm - Posix timer callback for rearming timer
    568 * @timr:	Pointer to the posixtimer data struct
    569 */
    570static void alarm_timer_rearm(struct k_itimer *timr)
    571{
    572	struct alarm *alarm = &timr->it.alarm.alarmtimer;
    573
    574	timr->it_overrun += alarm_forward_now(alarm, timr->it_interval);
    575	alarm_start(alarm, alarm->node.expires);
    576}
    577
    578/**
    579 * alarm_timer_forward - Posix timer callback for forwarding timer
    580 * @timr:	Pointer to the posixtimer data struct
    581 * @now:	Current time to forward the timer against
    582 */
    583static s64 alarm_timer_forward(struct k_itimer *timr, ktime_t now)
    584{
    585	struct alarm *alarm = &timr->it.alarm.alarmtimer;
    586
    587	return alarm_forward(alarm, timr->it_interval, now);
    588}
    589
    590/**
    591 * alarm_timer_remaining - Posix timer callback to retrieve remaining time
    592 * @timr:	Pointer to the posixtimer data struct
    593 * @now:	Current time to calculate against
    594 */
    595static ktime_t alarm_timer_remaining(struct k_itimer *timr, ktime_t now)
    596{
    597	struct alarm *alarm = &timr->it.alarm.alarmtimer;
    598
    599	return ktime_sub(alarm->node.expires, now);
    600}
    601
    602/**
    603 * alarm_timer_try_to_cancel - Posix timer callback to cancel a timer
    604 * @timr:	Pointer to the posixtimer data struct
    605 */
    606static int alarm_timer_try_to_cancel(struct k_itimer *timr)
    607{
    608	return alarm_try_to_cancel(&timr->it.alarm.alarmtimer);
    609}
    610
    611/**
    612 * alarm_timer_wait_running - Posix timer callback to wait for a timer
    613 * @timr:	Pointer to the posixtimer data struct
    614 *
    615 * Called from the core code when timer cancel detected that the callback
    616 * is running. @timr is unlocked and rcu read lock is held to prevent it
    617 * from being freed.
    618 */
    619static void alarm_timer_wait_running(struct k_itimer *timr)
    620{
    621	hrtimer_cancel_wait_running(&timr->it.alarm.alarmtimer.timer);
    622}
    623
    624/**
    625 * alarm_timer_arm - Posix timer callback to arm a timer
    626 * @timr:	Pointer to the posixtimer data struct
    627 * @expires:	The new expiry time
    628 * @absolute:	Expiry value is absolute time
    629 * @sigev_none:	Posix timer does not deliver signals
    630 */
    631static void alarm_timer_arm(struct k_itimer *timr, ktime_t expires,
    632			    bool absolute, bool sigev_none)
    633{
    634	struct alarm *alarm = &timr->it.alarm.alarmtimer;
    635	struct alarm_base *base = &alarm_bases[alarm->type];
    636
    637	if (!absolute)
    638		expires = ktime_add_safe(expires, base->get_ktime());
    639	if (sigev_none)
    640		alarm->node.expires = expires;
    641	else
    642		alarm_start(&timr->it.alarm.alarmtimer, expires);
    643}
    644
    645/**
    646 * alarm_clock_getres - posix getres interface
    647 * @which_clock: clockid
    648 * @tp: timespec to fill
    649 *
    650 * Returns the granularity of underlying alarm base clock
    651 */
    652static int alarm_clock_getres(const clockid_t which_clock, struct timespec64 *tp)
    653{
    654	if (!alarmtimer_get_rtcdev())
    655		return -EINVAL;
    656
    657	tp->tv_sec = 0;
    658	tp->tv_nsec = hrtimer_resolution;
    659	return 0;
    660}
    661
    662/**
    663 * alarm_clock_get_timespec - posix clock_get_timespec interface
    664 * @which_clock: clockid
    665 * @tp: timespec to fill.
    666 *
    667 * Provides the underlying alarm base time in a tasks time namespace.
    668 */
    669static int alarm_clock_get_timespec(clockid_t which_clock, struct timespec64 *tp)
    670{
    671	struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
    672
    673	if (!alarmtimer_get_rtcdev())
    674		return -EINVAL;
    675
    676	base->get_timespec(tp);
    677
    678	return 0;
    679}
    680
    681/**
    682 * alarm_clock_get_ktime - posix clock_get_ktime interface
    683 * @which_clock: clockid
    684 *
    685 * Provides the underlying alarm base time in the root namespace.
    686 */
    687static ktime_t alarm_clock_get_ktime(clockid_t which_clock)
    688{
    689	struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
    690
    691	if (!alarmtimer_get_rtcdev())
    692		return -EINVAL;
    693
    694	return base->get_ktime();
    695}
    696
    697/**
    698 * alarm_timer_create - posix timer_create interface
    699 * @new_timer: k_itimer pointer to manage
    700 *
    701 * Initializes the k_itimer structure.
    702 */
    703static int alarm_timer_create(struct k_itimer *new_timer)
    704{
    705	enum  alarmtimer_type type;
    706
    707	if (!alarmtimer_get_rtcdev())
    708		return -EOPNOTSUPP;
    709
    710	if (!capable(CAP_WAKE_ALARM))
    711		return -EPERM;
    712
    713	type = clock2alarm(new_timer->it_clock);
    714	alarm_init(&new_timer->it.alarm.alarmtimer, type, alarm_handle_timer);
    715	return 0;
    716}
    717
    718/**
    719 * alarmtimer_nsleep_wakeup - Wakeup function for alarm_timer_nsleep
    720 * @alarm: ptr to alarm that fired
    721 * @now: time at the timer expiration
    722 *
    723 * Wakes up the task that set the alarmtimer
    724 *
    725 * Return: ALARMTIMER_NORESTART
    726 */
    727static enum alarmtimer_restart alarmtimer_nsleep_wakeup(struct alarm *alarm,
    728								ktime_t now)
    729{
    730	struct task_struct *task = (struct task_struct *)alarm->data;
    731
    732	alarm->data = NULL;
    733	if (task)
    734		wake_up_process(task);
    735	return ALARMTIMER_NORESTART;
    736}
    737
    738/**
    739 * alarmtimer_do_nsleep - Internal alarmtimer nsleep implementation
    740 * @alarm: ptr to alarmtimer
    741 * @absexp: absolute expiration time
    742 * @type: alarm type (BOOTTIME/REALTIME).
    743 *
    744 * Sets the alarm timer and sleeps until it is fired or interrupted.
    745 */
    746static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
    747				enum alarmtimer_type type)
    748{
    749	struct restart_block *restart;
    750	alarm->data = (void *)current;
    751	do {
    752		set_current_state(TASK_INTERRUPTIBLE);
    753		alarm_start(alarm, absexp);
    754		if (likely(alarm->data))
    755			schedule();
    756
    757		alarm_cancel(alarm);
    758	} while (alarm->data && !signal_pending(current));
    759
    760	__set_current_state(TASK_RUNNING);
    761
    762	destroy_hrtimer_on_stack(&alarm->timer);
    763
    764	if (!alarm->data)
    765		return 0;
    766
    767	if (freezing(current))
    768		alarmtimer_freezerset(absexp, type);
    769	restart = &current->restart_block;
    770	if (restart->nanosleep.type != TT_NONE) {
    771		struct timespec64 rmt;
    772		ktime_t rem;
    773
    774		rem = ktime_sub(absexp, alarm_bases[type].get_ktime());
    775
    776		if (rem <= 0)
    777			return 0;
    778		rmt = ktime_to_timespec64(rem);
    779
    780		return nanosleep_copyout(restart, &rmt);
    781	}
    782	return -ERESTART_RESTARTBLOCK;
    783}
    784
    785static void
    786alarm_init_on_stack(struct alarm *alarm, enum alarmtimer_type type,
    787		    enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
    788{
    789	hrtimer_init_on_stack(&alarm->timer, alarm_bases[type].base_clockid,
    790			      HRTIMER_MODE_ABS);
    791	__alarm_init(alarm, type, function);
    792}
    793
    794/**
    795 * alarm_timer_nsleep_restart - restartblock alarmtimer nsleep
    796 * @restart: ptr to restart block
    797 *
    798 * Handles restarted clock_nanosleep calls
    799 */
    800static long __sched alarm_timer_nsleep_restart(struct restart_block *restart)
    801{
    802	enum  alarmtimer_type type = restart->nanosleep.clockid;
    803	ktime_t exp = restart->nanosleep.expires;
    804	struct alarm alarm;
    805
    806	alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
    807
    808	return alarmtimer_do_nsleep(&alarm, exp, type);
    809}
    810
    811/**
    812 * alarm_timer_nsleep - alarmtimer nanosleep
    813 * @which_clock: clockid
    814 * @flags: determines abstime or relative
    815 * @tsreq: requested sleep time (abs or rel)
    816 *
    817 * Handles clock_nanosleep calls against _ALARM clockids
    818 */
    819static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
    820			      const struct timespec64 *tsreq)
    821{
    822	enum  alarmtimer_type type = clock2alarm(which_clock);
    823	struct restart_block *restart = &current->restart_block;
    824	struct alarm alarm;
    825	ktime_t exp;
    826	int ret = 0;
    827
    828	if (!alarmtimer_get_rtcdev())
    829		return -EOPNOTSUPP;
    830
    831	if (flags & ~TIMER_ABSTIME)
    832		return -EINVAL;
    833
    834	if (!capable(CAP_WAKE_ALARM))
    835		return -EPERM;
    836
    837	alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
    838
    839	exp = timespec64_to_ktime(*tsreq);
    840	/* Convert (if necessary) to absolute time */
    841	if (flags != TIMER_ABSTIME) {
    842		ktime_t now = alarm_bases[type].get_ktime();
    843
    844		exp = ktime_add_safe(now, exp);
    845	} else {
    846		exp = timens_ktime_to_host(which_clock, exp);
    847	}
    848
    849	ret = alarmtimer_do_nsleep(&alarm, exp, type);
    850	if (ret != -ERESTART_RESTARTBLOCK)
    851		return ret;
    852
    853	/* abs timers don't set remaining time or restart */
    854	if (flags == TIMER_ABSTIME)
    855		return -ERESTARTNOHAND;
    856
    857	restart->nanosleep.clockid = type;
    858	restart->nanosleep.expires = exp;
    859	set_restart_fn(restart, alarm_timer_nsleep_restart);
    860	return ret;
    861}
    862
    863const struct k_clock alarm_clock = {
    864	.clock_getres		= alarm_clock_getres,
    865	.clock_get_ktime	= alarm_clock_get_ktime,
    866	.clock_get_timespec	= alarm_clock_get_timespec,
    867	.timer_create		= alarm_timer_create,
    868	.timer_set		= common_timer_set,
    869	.timer_del		= common_timer_del,
    870	.timer_get		= common_timer_get,
    871	.timer_arm		= alarm_timer_arm,
    872	.timer_rearm		= alarm_timer_rearm,
    873	.timer_forward		= alarm_timer_forward,
    874	.timer_remaining	= alarm_timer_remaining,
    875	.timer_try_to_cancel	= alarm_timer_try_to_cancel,
    876	.timer_wait_running	= alarm_timer_wait_running,
    877	.nsleep			= alarm_timer_nsleep,
    878};
    879#endif /* CONFIG_POSIX_TIMERS */
    880
    881
    882/* Suspend hook structures */
    883static const struct dev_pm_ops alarmtimer_pm_ops = {
    884	.suspend = alarmtimer_suspend,
    885	.resume = alarmtimer_resume,
    886};
    887
    888static struct platform_driver alarmtimer_driver = {
    889	.driver = {
    890		.name = "alarmtimer",
    891		.pm = &alarmtimer_pm_ops,
    892	}
    893};
    894
    895static void get_boottime_timespec(struct timespec64 *tp)
    896{
    897	ktime_get_boottime_ts64(tp);
    898	timens_add_boottime(tp);
    899}
    900
    901/**
    902 * alarmtimer_init - Initialize alarm timer code
    903 *
    904 * This function initializes the alarm bases and registers
    905 * the posix clock ids.
    906 */
    907static int __init alarmtimer_init(void)
    908{
    909	int error;
    910	int i;
    911
    912	alarmtimer_rtc_timer_init();
    913
    914	/* Initialize alarm bases */
    915	alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
    916	alarm_bases[ALARM_REALTIME].get_ktime = &ktime_get_real;
    917	alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64;
    918	alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
    919	alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
    920	alarm_bases[ALARM_BOOTTIME].get_timespec = get_boottime_timespec;
    921	for (i = 0; i < ALARM_NUMTYPE; i++) {
    922		timerqueue_init_head(&alarm_bases[i].timerqueue);
    923		spin_lock_init(&alarm_bases[i].lock);
    924	}
    925
    926	error = alarmtimer_rtc_interface_setup();
    927	if (error)
    928		return error;
    929
    930	error = platform_driver_register(&alarmtimer_driver);
    931	if (error)
    932		goto out_if;
    933
    934	return 0;
    935out_if:
    936	alarmtimer_rtc_interface_remove();
    937	return error;
    938}
    939device_initcall(alarmtimer_init);