diff options
Diffstat (limited to 'arch/powerpc/kernel/time.c')
| -rw-r--r-- | arch/powerpc/kernel/time.c | 21 | 
1 files changed, 20 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 92dc844299b..36707dec94d 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -54,6 +54,7 @@  #include <linux/irq.h>  #include <linux/delay.h>  #include <linux/perf_event.h> +#include <asm/trace.h>  #include <asm/io.h>  #include <asm/processor.h> @@ -571,6 +572,8 @@ void timer_interrupt(struct pt_regs * regs)  	struct clock_event_device *evt = &decrementer->event;  	u64 now; +	trace_timer_interrupt_entry(regs); +  	/* Ensure a positive value is written to the decrementer, or else  	 * some CPUs will continuue to take decrementer exceptions */  	set_dec(DECREMENTER_MAX); @@ -590,6 +593,7 @@ void timer_interrupt(struct pt_regs * regs)  		now = decrementer->next_tb - now;  		if (now <= DECREMENTER_MAX)  			set_dec((int)now); +		trace_timer_interrupt_exit(regs);  		return;  	}  	old_regs = set_irq_regs(regs); @@ -620,6 +624,8 @@ void timer_interrupt(struct pt_regs * regs)  	irq_exit();  	set_irq_regs(old_regs); + +	trace_timer_interrupt_exit(regs);  }  void wakeup_decrementer(void) @@ -777,7 +783,7 @@ int update_persistent_clock(struct timespec now)  	return ppc_md.set_rtc_time(&tm);  } -void read_persistent_clock(struct timespec *ts) +static void __read_persistent_clock(struct timespec *ts)  {  	struct rtc_time tm;  	static int first = 1; @@ -800,10 +806,23 @@ void read_persistent_clock(struct timespec *ts)  		return;  	}  	ppc_md.get_rtc_time(&tm); +  	ts->tv_sec = mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,  			    tm.tm_hour, tm.tm_min, tm.tm_sec);  } +void read_persistent_clock(struct timespec *ts) +{ +	__read_persistent_clock(ts); + +	/* Sanitize it in case real time clock is set below EPOCH */ +	if (ts->tv_sec < 0) { +		ts->tv_sec = 0; +		ts->tv_nsec = 0; +	} +		 +} +  /* clocksource code */  static cycle_t rtc_read(struct clocksource *cs)  {  |