diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:31:10 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:31:10 -0500 |
commit | ee238e5ca66858f80170f87724f84d67183b069a (patch) | |
tree | c08fe7edeac9b55fad0be5f7050cc3ddf8796232 | |
parent | 49a697871e2edcbc9cc682466bc4f2316b854d23 (diff) |
x86: prepare time related functions for paravirt
This patch add provisions for time related functions so they
can be later replaced by paravirt versions.
it basically encloses {g,s}et_wallclock inside the
already existent functions update_persistent_clock and
read_persistent_clock, and defines {s,g}et_wallclock
to the core of such functions.
it also allow for a later-on-game time initialization, as done
by i386. Paravirt guests can set a function to do their own
initialization this way.
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/time_64.c | 12 | ||||
-rw-r--r-- | include/asm-x86/time.h | 26 |
2 files changed, 30 insertions, 8 deletions
diff --git a/arch/x86/kernel/time_64.c b/arch/x86/kernel/time_64.c index bf0bcc9bb001..91d4d495904e 100644 --- a/arch/x86/kernel/time_64.c +++ b/arch/x86/kernel/time_64.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <asm/hpet.h> | 21 | #include <asm/hpet.h> |
22 | #include <asm/nmi.h> | 22 | #include <asm/nmi.h> |
23 | #include <asm/vgtod.h> | 23 | #include <asm/vgtod.h> |
24 | #include <asm/time.h> | ||
25 | #include <asm/timer.h> | ||
24 | 26 | ||
25 | volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES; | 27 | volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES; |
26 | 28 | ||
@@ -54,7 +56,7 @@ static irqreturn_t timer_event_interrupt(int irq, void *dev_id) | |||
54 | /* calibrate_cpu is used on systems with fixed rate TSCs to determine | 56 | /* calibrate_cpu is used on systems with fixed rate TSCs to determine |
55 | * processor frequency */ | 57 | * processor frequency */ |
56 | #define TICK_COUNT 100000000 | 58 | #define TICK_COUNT 100000000 |
57 | static unsigned int __init tsc_calibrate_cpu_khz(void) | 59 | unsigned long __init native_calculate_cpu_khz(void) |
58 | { | 60 | { |
59 | int tsc_start, tsc_now; | 61 | int tsc_start, tsc_now; |
60 | int i, no_ctr_free; | 62 | int i, no_ctr_free; |
@@ -104,20 +106,23 @@ static struct irqaction irq0 = { | |||
104 | .name = "timer" | 106 | .name = "timer" |
105 | }; | 107 | }; |
106 | 108 | ||
107 | void __init time_init(void) | 109 | void __init hpet_time_init(void) |
108 | { | 110 | { |
109 | if (!hpet_enable()) | 111 | if (!hpet_enable()) |
110 | setup_pit_timer(); | 112 | setup_pit_timer(); |
111 | 113 | ||
112 | setup_irq(0, &irq0); | 114 | setup_irq(0, &irq0); |
115 | } | ||
113 | 116 | ||
117 | void __init time_init(void) | ||
118 | { | ||
114 | tsc_calibrate(); | 119 | tsc_calibrate(); |
115 | 120 | ||
116 | cpu_khz = tsc_khz; | 121 | cpu_khz = tsc_khz; |
117 | if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) && | 122 | if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) && |
118 | boot_cpu_data.x86_vendor == X86_VENDOR_AMD && | 123 | boot_cpu_data.x86_vendor == X86_VENDOR_AMD && |
119 | boot_cpu_data.x86 == 16) | 124 | boot_cpu_data.x86 == 16) |
120 | cpu_khz = tsc_calibrate_cpu_khz(); | 125 | cpu_khz = calculate_cpu_khz(); |
121 | 126 | ||
122 | if (unsynchronized_tsc()) | 127 | if (unsynchronized_tsc()) |
123 | mark_tsc_unstable("TSCs unsynchronized"); | 128 | mark_tsc_unstable("TSCs unsynchronized"); |
@@ -130,4 +135,5 @@ void __init time_init(void) | |||
130 | printk(KERN_INFO "time.c: Detected %d.%03d MHz processor.\n", | 135 | printk(KERN_INFO "time.c: Detected %d.%03d MHz processor.\n", |
131 | cpu_khz / 1000, cpu_khz % 1000); | 136 | cpu_khz / 1000, cpu_khz % 1000); |
132 | init_tsc_clocksource(); | 137 | init_tsc_clocksource(); |
138 | late_time_init = choose_time_init(); | ||
133 | } | 139 | } |
diff --git a/include/asm-x86/time.h b/include/asm-x86/time.h index b3f94cd81ac6..68779b048a3e 100644 --- a/include/asm-x86/time.h +++ b/include/asm-x86/time.h | |||
@@ -1,8 +1,12 @@ | |||
1 | #ifndef _ASMi386_TIME_H | 1 | #ifndef _ASMX86_TIME_H |
2 | #define _ASMi386_TIME_H | 2 | #define _ASMX86_TIME_H |
3 | |||
4 | extern void (*late_time_init)(void); | ||
5 | extern void hpet_time_init(void); | ||
3 | 6 | ||
4 | #include <linux/efi.h> | ||
5 | #include <asm/mc146818rtc.h> | 7 | #include <asm/mc146818rtc.h> |
8 | #ifdef CONFIG_X86_32 | ||
9 | #include <linux/efi.h> | ||
6 | 10 | ||
7 | static inline unsigned long native_get_wallclock(void) | 11 | static inline unsigned long native_get_wallclock(void) |
8 | { | 12 | { |
@@ -28,8 +32,20 @@ static inline int native_set_wallclock(unsigned long nowtime) | |||
28 | return retval; | 32 | return retval; |
29 | } | 33 | } |
30 | 34 | ||
31 | extern void (*late_time_init)(void); | 35 | #else |
32 | extern void hpet_time_init(void); | 36 | extern void native_time_init_hook(void); |
37 | |||
38 | static inline unsigned long native_get_wallclock(void) | ||
39 | { | ||
40 | return mach_get_cmos_time(); | ||
41 | } | ||
42 | |||
43 | static inline int native_set_wallclock(unsigned long nowtime) | ||
44 | { | ||
45 | return mach_set_rtc_mmss(nowtime); | ||
46 | } | ||
47 | |||
48 | #endif | ||
33 | 49 | ||
34 | #ifdef CONFIG_PARAVIRT | 50 | #ifdef CONFIG_PARAVIRT |
35 | #include <asm/paravirt.h> | 51 | #include <asm/paravirt.h> |