aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/kernel/process.c')
-rw-r--r--arch/um/kernel/process.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
index 691b83b10649..67c0d1a860e9 100644
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -203,10 +203,50 @@ void initial_thread_cb(void (*proc)(void *), void *arg)
203 kmalloc_ok = save_kmalloc_ok; 203 kmalloc_ok = save_kmalloc_ok;
204} 204}
205 205
206static void time_travel_sleep(unsigned long long duration)
207{
208 unsigned long long next = time_travel_time + duration;
209
210 if (time_travel_mode != TT_MODE_INFCPU)
211 os_timer_disable();
212
213 if (time_travel_timer_mode != TT_TMR_DISABLED ||
214 time_travel_timer_expiry < next) {
215 if (time_travel_timer_mode == TT_TMR_ONESHOT)
216 time_travel_set_timer(TT_TMR_DISABLED, 0);
217 /*
218 * time_travel_time will be adjusted in the timer
219 * IRQ handler so it works even when the signal
220 * comes from the OS timer
221 */
222 deliver_alarm();
223 } else {
224 time_travel_set_time(next);
225 }
226
227 if (time_travel_mode != TT_MODE_INFCPU) {
228 if (time_travel_timer_mode == TT_TMR_PERIODIC)
229 os_timer_set_interval(time_travel_timer_interval);
230 else if (time_travel_timer_mode == TT_TMR_ONESHOT)
231 os_timer_one_shot(time_travel_timer_expiry - next);
232 }
233}
234
235static void um_idle_sleep(void)
236{
237 unsigned long long duration = UM_NSEC_PER_SEC;
238
239 if (time_travel_mode != TT_MODE_OFF) {
240 time_travel_sleep(duration);
241 } else {
242 os_idle_sleep(duration);
243 }
244}
245
206void arch_cpu_idle(void) 246void arch_cpu_idle(void)
207{ 247{
208 cpu_tasks[current_thread_info()->cpu].pid = os_getpid(); 248 cpu_tasks[current_thread_info()->cpu].pid = os_getpid();
209 os_idle_sleep(UM_NSEC_PER_SEC); 249 um_idle_sleep();
210 local_irq_enable(); 250 local_irq_enable();
211} 251}
212 252