diff options
Diffstat (limited to 'arch/um/kernel/process.c')
-rw-r--r-- | arch/um/kernel/process.c | 42 |
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 | ||
206 | static 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 | |||
235 | static 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 | |||
206 | void arch_cpu_idle(void) | 246 | void 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 | ||