[PATCH] powerpc: Merge vdso's and add vdso support to 32 bits kernel
This patch moves the vdso's to arch/powerpc, adds support for the 32 bits vdso to the 32 bits kernel, rename systemcfg (finally !), and adds some new (still untested) routines to both vdso's: clock_gettime() with support for CLOCK_REALTIME and CLOCK_MONOTONIC, clock_getres() (same clocks) and get_tbfreq() for glibc to retreive the timebase frequency. Tom,Steve: The implementation of get_tbfreq() I've done for 32 bits returns a long long (r3, r4) not a long. This is such that if we ever add support for >4Ghz timebases on ppc32, the userland interface won't have to change. I have tested gettimeofday() using some glibc patches in both ppc32 and ppc64 kernels using 32 bits userland (I haven't had a chance to test a 64 bits userland yet, but the implementation didn't change and was tested earlier). I haven't tested yet the new functions. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:

committed by
Paul Mackerras

parent
6761c4a073
commit
a7f290dad3
@@ -62,8 +62,8 @@
|
||||
#include <asm/irq.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/firmware.h>
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
@@ -261,7 +261,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
||||
do_gtod.varp = temp_varp;
|
||||
do_gtod.var_idx = temp_idx;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* tb_update_count is used to allow the userspace gettimeofday code
|
||||
* to assure itself that it sees a consistent view of the tb_to_xs and
|
||||
@@ -271,14 +270,15 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
||||
* tb_to_xs and stamp_xsec values are consistent. If not, then it
|
||||
* loops back and reads them again until this criteria is met.
|
||||
*/
|
||||
++(_systemcfg->tb_update_count);
|
||||
++(vdso_data->tb_update_count);
|
||||
smp_wmb();
|
||||
_systemcfg->tb_orig_stamp = new_tb_stamp;
|
||||
_systemcfg->stamp_xsec = new_stamp_xsec;
|
||||
_systemcfg->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->tb_orig_stamp = new_tb_stamp;
|
||||
vdso_data->stamp_xsec = new_stamp_xsec;
|
||||
vdso_data->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
||||
smp_wmb();
|
||||
++(_systemcfg->tb_update_count);
|
||||
#endif
|
||||
++(vdso_data->tb_update_count);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -357,9 +357,8 @@ static void iSeries_tb_recal(void)
|
||||
do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
tb_to_xs = divres.result_low;
|
||||
do_gtod.varp->tb_to_xs = tb_to_xs;
|
||||
_systemcfg->tb_ticks_per_sec =
|
||||
tb_ticks_per_sec;
|
||||
_systemcfg->tb_to_xs = tb_to_xs;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
}
|
||||
else {
|
||||
printk( "Titan recalibrate: FAILED (difference > 4 percent)\n"
|
||||
@@ -561,10 +560,8 @@ int do_settimeofday(struct timespec *tv)
|
||||
new_xsec += (u64)new_sec * XSEC_PER_SEC - tb_delta_xs;
|
||||
update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
_systemcfg->tz_minuteswest = sys_tz.tz_minuteswest;
|
||||
_systemcfg->tz_dsttime = sys_tz.tz_dsttime;
|
||||
#endif
|
||||
vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
|
||||
vdso_data->tz_dsttime = sys_tz.tz_dsttime;
|
||||
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
clock_was_set();
|
||||
@@ -713,13 +710,12 @@ void __init time_init(void)
|
||||
do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
do_gtod.varp->tb_to_xs = tb_to_xs;
|
||||
do_gtod.tb_to_us = tb_to_us;
|
||||
#ifdef CONFIG_PPC64
|
||||
_systemcfg->tb_orig_stamp = tb_last_jiffy;
|
||||
_systemcfg->tb_update_count = 0;
|
||||
_systemcfg->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
_systemcfg->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
|
||||
_systemcfg->tb_to_xs = tb_to_xs;
|
||||
#endif
|
||||
|
||||
vdso_data->tb_orig_stamp = tb_last_jiffy;
|
||||
vdso_data->tb_update_count = 0;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->stamp_xsec = xtime.tv_sec * XSEC_PER_SEC;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
|
||||
time_freq = 0;
|
||||
|
||||
|
Reference in New Issue
Block a user