hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/um/os-Linux/time.c
....@@ -1,9 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Copyright (C) 2015 Anton Ivanov (aivanov@{brocade.com,kot-begemot.co.uk})
34 * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
45 * Copyright (C) 2012-2014 Cisco Systems
56 * Copyright (C) 2000 - 2007 Jeff Dike (jdike{addtoit,linux.intel}.com)
6
- * Licensed under the GPL
77 */
88
99 #include <stddef.h>
....@@ -14,7 +14,6 @@
1414 #include <kern_util.h>
1515 #include <os.h>
1616 #include <string.h>
17
-#include <timer-internal.h>
1817
1918 static timer_t event_high_res_timer = 0;
2019
....@@ -26,11 +25,11 @@
2625
2726 static inline long long timespec_to_ns(const struct timespec *ts)
2827 {
29
- return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) +
30
- ts->tv_nsec;
28
+ return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + ts->tv_nsec;
3129 }
3230
33
-long long os_persistent_clock_emulation (void) {
31
+long long os_persistent_clock_emulation(void)
32
+{
3433 struct timespec realtime_tp;
3534
3635 clock_gettime(CLOCK_REALTIME, &realtime_tp);
....@@ -40,94 +39,41 @@
4039 /**
4140 * os_timer_create() - create an new posix (interval) timer
4241 */
43
-int os_timer_create(void* timer) {
42
+int os_timer_create(void)
43
+{
44
+ timer_t *t = &event_high_res_timer;
4445
45
- timer_t* t = timer;
46
-
47
- if(t == NULL) {
48
- t = &event_high_res_timer;
49
- }
50
-
51
- if (timer_create(
52
- CLOCK_MONOTONIC,
53
- NULL,
54
- t) == -1) {
46
+ if (timer_create(CLOCK_MONOTONIC, NULL, t) == -1)
5547 return -1;
56
- }
57
- return 0;
58
-}
59
-
60
-int os_timer_set_interval(void* timer, void* i)
61
-{
62
- struct itimerspec its;
63
- unsigned long long nsec;
64
- timer_t* t = timer;
65
- struct itimerspec* its_in = i;
66
-
67
- if(t == NULL) {
68
- t = &event_high_res_timer;
69
- }
70
-
71
- nsec = UM_NSEC_PER_SEC / UM_HZ;
72
-
73
- if(its_in != NULL) {
74
- its.it_value.tv_sec = its_in->it_value.tv_sec;
75
- its.it_value.tv_nsec = its_in->it_value.tv_nsec;
76
- } else {
77
- its.it_value.tv_sec = 0;
78
- its.it_value.tv_nsec = nsec;
79
- }
80
-
81
- its.it_interval.tv_sec = 0;
82
- its.it_interval.tv_nsec = nsec;
83
-
84
- if(timer_settime(*t, 0, &its, NULL) == -1) {
85
- return -errno;
86
- }
8748
8849 return 0;
8950 }
9051
91
-/**
92
- * os_timer_remain() - returns the remaining nano seconds of the given interval
93
- * timer
94
- * Because this is the remaining time of an interval timer, which correspondends
95
- * to HZ, this value can never be bigger than one second. Just
96
- * the nanosecond part of the timer is returned.
97
- * The returned time is relative to the start time of the interval timer.
98
- * Return an negative value in an error case.
99
- */
100
-long os_timer_remain(void* timer)
52
+int os_timer_set_interval(unsigned long long nsecs)
10153 {
10254 struct itimerspec its;
103
- timer_t* t = timer;
10455
105
- if(t == NULL) {
106
- t = &event_high_res_timer;
107
- }
56
+ its.it_value.tv_sec = nsecs / UM_NSEC_PER_SEC;
57
+ its.it_value.tv_nsec = nsecs % UM_NSEC_PER_SEC;
10858
109
- if(timer_gettime(t, &its) == -1) {
59
+ its.it_interval.tv_sec = nsecs / UM_NSEC_PER_SEC;
60
+ its.it_interval.tv_nsec = nsecs % UM_NSEC_PER_SEC;
61
+
62
+ if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1)
11063 return -errno;
111
- }
11264
113
- return its.it_value.tv_nsec;
65
+ return 0;
11466 }
11567
116
-int os_timer_one_shot(int ticks)
68
+int os_timer_one_shot(unsigned long long nsecs)
11769 {
118
- struct itimerspec its;
119
- unsigned long long nsec;
120
- unsigned long sec;
70
+ struct itimerspec its = {
71
+ .it_value.tv_sec = nsecs / UM_NSEC_PER_SEC,
72
+ .it_value.tv_nsec = nsecs % UM_NSEC_PER_SEC,
12173
122
- nsec = (ticks + 1);
123
- sec = nsec / UM_NSEC_PER_SEC;
124
- nsec = nsec % UM_NSEC_PER_SEC;
125
-
126
- its.it_value.tv_sec = nsec / UM_NSEC_PER_SEC;
127
- its.it_value.tv_nsec = nsec;
128
-
129
- its.it_interval.tv_sec = 0;
130
- its.it_interval.tv_nsec = 0; // we cheat here
74
+ .it_interval.tv_sec = 0,
75
+ .it_interval.tv_nsec = 0, // we cheat here
76
+ };
13177
13278 timer_settime(event_high_res_timer, 0, &its, NULL);
13379 return 0;
....@@ -135,24 +81,13 @@
13581
13682 /**
13783 * os_timer_disable() - disable the posix (interval) timer
138
- * Returns the remaining interval timer time in nanoseconds
13984 */
140
-long long os_timer_disable(void)
85
+void os_timer_disable(void)
14186 {
14287 struct itimerspec its;
14388
14489 memset(&its, 0, sizeof(struct itimerspec));
145
- timer_settime(event_high_res_timer, 0, &its, &its);
146
-
147
- return its.it_value.tv_sec * UM_NSEC_PER_SEC + its.it_value.tv_nsec;
148
-}
149
-
150
-long long os_vnsecs(void)
151
-{
152
- struct timespec ts;
153
-
154
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&ts);
155
- return timespec_to_ns(&ts);
90
+ timer_settime(event_high_res_timer, 0, &its, NULL);
15691 }
15792
15893 long long os_nsecs(void)
....@@ -169,21 +104,14 @@
169104 */
170105 void os_idle_sleep(unsigned long long nsecs)
171106 {
172
- struct timespec ts;
173
-
174
- if (nsecs <= 0) {
175
- return;
176
- }
177
-
178
- ts = ((struct timespec) {
179
- .tv_sec = nsecs / UM_NSEC_PER_SEC,
180
- .tv_nsec = nsecs % UM_NSEC_PER_SEC
181
- });
107
+ struct timespec ts = {
108
+ .tv_sec = nsecs / UM_NSEC_PER_SEC,
109
+ .tv_nsec = nsecs % UM_NSEC_PER_SEC
110
+ };
182111
183112 /*
184113 * Relay the signal if clock_nanosleep is interrupted.
185114 */
186
- if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL)) {
115
+ if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL))
187116 deliver_alarm();
188
- }
189117 }