mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
x86/time: introduce helper to fetch Xen wallclock when running as a guest
Move the current code in get_wallclock_time() to fetch the Xen wallclock information from the shared page when running as a guest into a separate helper. No functional change intended. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
18053054b7
commit
9f16d4e653
1 file changed
+25
-17
+25
-17
@@ -787,6 +787,30 @@ static struct platform_timesource __initdata_cf_clobber plt_xen_timer =
|
||||
};
|
||||
#endif
|
||||
|
||||
static unsigned long read_xen_wallclock(void)
|
||||
{
|
||||
#ifdef CONFIG_XEN_GUEST
|
||||
const struct shared_info *sh_info = XEN_shared_info;
|
||||
uint32_t wc_version;
|
||||
uint64_t wc_sec;
|
||||
|
||||
ASSERT(xen_guest);
|
||||
|
||||
do {
|
||||
wc_version = sh_info->wc_version & ~1;
|
||||
smp_rmb();
|
||||
|
||||
wc_sec = sh_info->wc_sec;
|
||||
smp_rmb();
|
||||
} while ( wc_version != sh_info->wc_version );
|
||||
|
||||
return wc_sec + read_xen_timer() / 1000000000;
|
||||
#else
|
||||
ASSERT_UNREACHABLE();
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HYPERV_GUEST
|
||||
/************************************************************
|
||||
* HYPER-V REFERENCE TSC
|
||||
@@ -1497,24 +1521,8 @@ void rtc_guest_write(unsigned int port, unsigned int data)
|
||||
|
||||
static unsigned long get_wallclock_time(void)
|
||||
{
|
||||
#ifdef CONFIG_XEN_GUEST
|
||||
if ( xen_guest )
|
||||
{
|
||||
struct shared_info *sh_info = XEN_shared_info;
|
||||
uint32_t wc_version;
|
||||
uint64_t wc_sec;
|
||||
|
||||
do {
|
||||
wc_version = sh_info->wc_version & ~1;
|
||||
smp_rmb();
|
||||
|
||||
wc_sec = sh_info->wc_sec;
|
||||
smp_rmb();
|
||||
} while ( wc_version != sh_info->wc_version );
|
||||
|
||||
return wc_sec + read_xen_timer() / 1000000000;
|
||||
}
|
||||
#endif
|
||||
return read_xen_wallclock();
|
||||
|
||||
return get_cmos_time();
|
||||
}
|
||||
|
||||