Commit-ID: be2e0e4257678408b0ab00ea9e743b9094e393e8 Gitweb: https://git.kernel.org/tip/be2e0e4257678408b0ab00ea9e743b9094e393e8 Author: Pavel Tatashin <pasha.tatas...@oracle.com> AuthorDate: Thu, 19 Jul 2018 16:55:33 -0400 Committer: Thomas Gleixner <t...@linutronix.de> CommitDate: Fri, 20 Jul 2018 00:02:40 +0200
s390/time: Add read_persistent_wall_and_boot_offset() read_persistent_wall_and_boot_offset() will replace read_boot_clock64() because on some architectures it is more convenient to read both sources as one may depend on the other. For s390, implementation is the same as read_boot_clock64() but also calling and returning value of read_persistent_clock64() Signed-off-by: Pavel Tatashin <pasha.tatas...@oracle.com> Signed-off-by: Thomas Gleixner <t...@linutronix.de> Reviewed-by: Martin Schwidefsky <schwidef...@de.ibm.com> Cc: steven.sist...@oracle.com Cc: daniel.m.jor...@oracle.com Cc: li...@armlinux.org.uk Cc: heiko.carst...@de.ibm.com Cc: john.stu...@linaro.org Cc: sb...@codeaurora.org Cc: h...@zytor.com Cc: douly.f...@cn.fujitsu.com Cc: pet...@infradead.org Cc: pra...@redhat.com Cc: feng.t...@intel.com Cc: pmla...@suse.com Cc: gno...@lxorguk.ukuu.org.uk Cc: linux-s...@vger.kernel.org Cc: boris.ostrov...@oracle.com Cc: jgr...@suse.com Cc: pbonz...@redhat.com Link: https://lkml.kernel.org/r/20180719205545.16512-15-pasha.tatas...@oracle.com --- arch/s390/kernel/time.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index cf561160ea88..d1f5447d5687 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -221,6 +221,24 @@ void read_persistent_clock64(struct timespec64 *ts) ext_to_timespec64(clk, ts); } +void __init read_persistent_wall_and_boot_offset(struct timespec64 *wall_time, + struct timespec64 *boot_offset) +{ + unsigned char clk[STORE_CLOCK_EXT_SIZE]; + struct timespec64 boot_time; + __u64 delta; + + delta = initial_leap_seconds + TOD_UNIX_EPOCH; + memcpy(clk, tod_clock_base, STORE_CLOCK_EXT_SIZE); + *(__u64 *)&clk[1] -= delta; + if (*(__u64 *)&clk[1] > delta) + clk[0]--; + ext_to_timespec64(clk, &boot_time); + + read_persistent_clock64(wall_time); + *boot_offset = timespec64_sub(*wall_time, boot_time); +} + void read_boot_clock64(struct timespec64 *ts) { unsigned char clk[STORE_CLOCK_EXT_SIZE];