void timer_irq(union uml_pt_regs *regs) { unsigned long long ticks = 0; #ifdef CONFIG_UML_REAL_TIME_CLOCK if(prev_nsecs){ /* We've had 1 tick */ unsigned long long nsecs = os_nsecs(); delta += nsecs - prev_nsecs; prev_nsecs = nsecs; /* Protect against the host clock being set backwards */ if(delta < 0) delta = 0; ticks += (delta * HZ) / BILLION; delta -= (ticks * BILLION) / HZ; } else prev_nsecs = os_nsecs(); #else ticks = 1; #endif while(ticks > 0){ do_IRQ(TIMER_IRQ, regs); ticks--; } }
void read_persistent_clock(struct timespec *ts) { long long nsecs = os_nsecs(); set_normalized_timespec(ts, nsecs / NSEC_PER_SEC, nsecs % NSEC_PER_SEC); }
void time_init_kern(void) { long long nsecs; nsecs = os_nsecs(); set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION, -nsecs % BILLION); }
void time_init(void) { long long nsecs; nsecs = os_nsecs(); set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION, -nsecs % BILLION); late_time_init = register_timer; }
static inline void set_time(unsigned long long nsecs) { unsigned long long now; unsigned long flags; spin_lock_irqsave(&timer_spinlock, flags); now = os_nsecs(); local_offset = nsecs - now; spin_unlock_irqrestore(&timer_spinlock, flags); clock_was_set(); }
static inline unsigned long long get_time(void) { unsigned long long nsecs; unsigned long flags; spin_lock_irqsave(&timer_spinlock, flags); nsecs = os_nsecs(); nsecs += local_offset; spin_unlock_irqrestore(&timer_spinlock, flags); return nsecs; }
void timer_irq(union uml_pt_regs *regs) { unsigned long long ticks = 0; if(!timer_irq_inited){ /* This is to ensure that ticks don't pile up when * the timer handler is suspended */ first_tick = 0; return; } if(first_tick){ #ifdef CONFIG_UML_REAL_TIME_CLOCK /* We've had 1 tick */ unsigned long long nsecs = os_nsecs(); delta += nsecs - prev_nsecs; prev_nsecs = nsecs; /* Protect against the host clock being set backwards */ if(delta < 0) delta = 0; ticks += (delta * HZ) / BILLION; delta -= (ticks * BILLION) / HZ; #else ticks = 1; #endif } else { prev_nsecs = os_nsecs(); first_tick = 1; } while(ticks > 0){ do_IRQ(TIMER_IRQ, regs); ticks--; } }
void __init time_init(void) { long long nsecs; timer_init(); nsecs = os_nsecs(); set_normalized_timespec(&wall_to_monotonic, -nsecs / NSEC_PER_SEC, -nsecs % NSEC_PER_SEC); set_normalized_timespec(&xtime, nsecs / NSEC_PER_SEC, nsecs % NSEC_PER_SEC); late_time_init = setup_itimer; }
static cycle_t itimer_read(struct clocksource *cs) { return os_nsecs() / 1000; }
static u64 timer_read(struct clocksource *cs) { return os_nsecs() / TIMER_MULTIPLIER; }
static cycle_t itimer_read(void) { return os_nsecs(); }