|
@@ -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];
|