s390/time: Add read_persistent_wall_and_boot_offset()
authorPavel Tatashin <pasha.tatashin@oracle.com>
Thu, 19 Jul 2018 20:55:33 +0000 (16:55 -0400)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 19 Jul 2018 22:02:40 +0000 (00:02 +0200)
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.tatashin@oracle.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: steven.sistare@oracle.com
Cc: daniel.m.jordan@oracle.com
Cc: linux@armlinux.org.uk
Cc: heiko.carstens@de.ibm.com
Cc: john.stultz@linaro.org
Cc: sboyd@codeaurora.org
Cc: hpa@zytor.com
Cc: douly.fnst@cn.fujitsu.com
Cc: peterz@infradead.org
Cc: prarit@redhat.com
Cc: feng.tang@intel.com
Cc: pmladek@suse.com
Cc: gnomes@lxorguk.ukuu.org.uk
Cc: linux-s390@vger.kernel.org
Cc: boris.ostrovsky@oracle.com
Cc: jgross@suse.com
Cc: pbonzini@redhat.com
Link: https://lkml.kernel.org/r/20180719205545.16512-15-pasha.tatashin@oracle.com
arch/s390/kernel/time.c

index cf56116..d1f5447 100644 (file)
@@ -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];