summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/s390/include/asm/timex.h10
-rw-r--r--arch/s390/kernel/early.c6
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);