diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/timex.h | 10 | ||||
-rw-r--r-- | arch/s390/kernel/early.c | 6 |
2 files changed, 9 insertions, 7 deletions
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index c8e244ecdfde..63bf3bd6e83f 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h @@ -17,6 +17,8 @@ /* The value of the TOD clock for 1.1.1970. */ #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL +#define STORE_CLOCK_EXT_SIZE 16 /* stcke writes 16 bytes */ + extern u64 clock_comparator_max; /* Inline functions for clock register access. */ @@ -32,15 +34,16 @@ static inline int set_tod_clock(__u64 time) return cc; } -static inline int store_tod_clock(__u64 *time) +static inline int store_tod_clock_ext(char *time) { + typedef struct { char _[STORE_CLOCK_EXT_SIZE]; } addrtype; int cc; asm volatile( - " stck %1\n" + " stcke %1\n" " ipm %0\n" " srl %0,28\n" - : "=d" (cc), "=Q" (*time) : : "cc"); + : "=d" (cc), "=Q" (*(addrtype *)time) : : "cc"); return cc; } @@ -144,7 +147,6 @@ static inline void local_tick_enable(unsigned long long comp) } #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ -#define STORE_CLOCK_EXT_SIZE 16 /* stcke writes 16 bytes */ typedef unsigned long long cycles_t; diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index cc89763a4d3c..ee063b56b5d1 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c @@ -35,12 +35,12 @@ static void __init reset_tod_clock(void) { - u64 time; + char time[STORE_CLOCK_EXT_SIZE]; - if (store_tod_clock(&time) == 0) + if (store_tod_clock_ext(time) == 0) return; /* TOD clock not running. Set the clock to Unix Epoch. */ - if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0) + if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock_ext(time) != 0) disabled_wait(); memset(tod_clock_base, 0, 16); |