aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorGlauber de Oliveira Costa <gcosta@redhat.com>2008-01-30 07:31:10 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:31:10 -0500
commitee238e5ca66858f80170f87724f84d67183b069a (patch)
treec08fe7edeac9b55fad0be5f7050cc3ddf8796232 /arch
parent49a697871e2edcbc9cc682466bc4f2316b854d23 (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>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/time_64.c12
1 files changed, 9 insertions, 3 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
25volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES; 27volatile 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
57static unsigned int __init tsc_calibrate_cpu_khz(void) 59unsigned 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
107void __init time_init(void) 109void __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
117void __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}