Skip to content

Commit

Permalink
x86: prepare time related functions for paravirt
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Glauber de Oliveira Costa authored and Ingo Molnar committed Jan 30, 2008
1 parent 49a6978 commit ee238e5
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
12 changes: 9 additions & 3 deletions arch/x86/kernel/time_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include <asm/hpet.h>
#include <asm/nmi.h>
#include <asm/vgtod.h>
#include <asm/time.h>
#include <asm/timer.h>

volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;

Expand Down Expand Up @@ -54,7 +56,7 @@ static irqreturn_t timer_event_interrupt(int irq, void *dev_id)
/* calibrate_cpu is used on systems with fixed rate TSCs to determine
* processor frequency */
#define TICK_COUNT 100000000
static unsigned int __init tsc_calibrate_cpu_khz(void)
unsigned long __init native_calculate_cpu_khz(void)
{
int tsc_start, tsc_now;
int i, no_ctr_free;
Expand Down Expand Up @@ -104,20 +106,23 @@ static struct irqaction irq0 = {
.name = "timer"
};

void __init time_init(void)
void __init hpet_time_init(void)
{
if (!hpet_enable())
setup_pit_timer();

setup_irq(0, &irq0);
}

void __init time_init(void)
{
tsc_calibrate();

cpu_khz = tsc_khz;
if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) &&
boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
boot_cpu_data.x86 == 16)
cpu_khz = tsc_calibrate_cpu_khz();
cpu_khz = calculate_cpu_khz();

if (unsynchronized_tsc())
mark_tsc_unstable("TSCs unsynchronized");
Expand All @@ -130,4 +135,5 @@ void __init time_init(void)
printk(KERN_INFO "time.c: Detected %d.%03d MHz processor.\n",
cpu_khz / 1000, cpu_khz % 1000);
init_tsc_clocksource();
late_time_init = choose_time_init();
}
26 changes: 21 additions & 5 deletions include/asm-x86/time.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
#ifndef _ASMi386_TIME_H
#define _ASMi386_TIME_H
#ifndef _ASMX86_TIME_H
#define _ASMX86_TIME_H

extern void (*late_time_init)(void);
extern void hpet_time_init(void);

#include <linux/efi.h>
#include <asm/mc146818rtc.h>
#ifdef CONFIG_X86_32
#include <linux/efi.h>

static inline unsigned long native_get_wallclock(void)
{
Expand All @@ -28,8 +32,20 @@ static inline int native_set_wallclock(unsigned long nowtime)
return retval;
}

extern void (*late_time_init)(void);
extern void hpet_time_init(void);
#else
extern void native_time_init_hook(void);

static inline unsigned long native_get_wallclock(void)
{
return mach_get_cmos_time();
}

static inline int native_set_wallclock(unsigned long nowtime)
{
return mach_set_rtc_mmss(nowtime);
}

#endif

#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
Expand Down

0 comments on commit ee238e5

Please sign in to comment.