X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=include%2Fasm-s390%2Ftimex.h;h=98229db243141ba189a0f75927da5a351af7d992;hb=c91ef5986185c044a853d990670e3f7ce22f2991;hp=5d0332a4c2bdd0b8d737aea0f8fd5d4fa96e546b;hpb=48cb37bd9e053429aacb7c2726da3300aba60c68;p=powerpc.git diff --git a/include/asm-s390/timex.h b/include/asm-s390/timex.h index 5d0332a4c2..98229db243 100644 --- a/include/asm-s390/timex.h +++ b/include/asm-s390/timex.h @@ -11,24 +11,75 @@ #ifndef _ASM_S390_TIMEX_H #define _ASM_S390_TIMEX_H -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +/* Inline functions for clock register access. */ +static inline int set_clock(__u64 time) +{ + int cc; -typedef unsigned long long cycles_t; + asm volatile( + " sck 0(%2)\n" + " ipm %0\n" + " srl %0,28\n" + : "=d" (cc) : "m" (time), "a" (&time) : "cc"); + return cc; +} -static inline cycles_t get_cycles(void) +static inline int store_clock(__u64 *time) +{ + int cc; + + asm volatile( + " stck 0(%2)\n" + " ipm %0\n" + " srl %0,28\n" + : "=d" (cc), "=m" (*time) : "a" (time) : "cc"); + return cc; +} + +static inline void set_clock_comparator(__u64 time) { - cycles_t cycles; + asm volatile("sckc 0(%1)" : : "m" (time), "a" (&time)); +} - __asm__ __volatile__ ("stck 0(%1)" : "=m" (cycles) : "a" (&cycles) : "cc"); - return cycles >> 2; +static inline void store_clock_comparator(__u64 *time) +{ + asm volatile("stckc 0(%1)" : "=m" (*time) : "a" (time)); } +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ + +typedef unsigned long long cycles_t; + static inline unsigned long long get_clock (void) { unsigned long long clk; - __asm__ __volatile__ ("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) + asm volatile("stck %0" : "=Q" (clk) : : "cc"); +#else /* __GNUC__ */ + asm volatile("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); +#endif /* __GNUC__ */ return clk; } +static inline void get_clock_extended(void *dest) +{ + typedef struct { unsigned long long clk[2]; } __clock_t; + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) + asm volatile("stcke %0" : "=Q" (*((__clock_t *)dest)) : : "cc"); +#else /* __GNUC__ */ + asm volatile("stcke 0(%1)" : "=m" (*((__clock_t *)dest)) + : "a" ((__clock_t *)dest) : "cc"); +#endif /* __GNUC__ */ +} + +static inline cycles_t get_cycles(void) +{ + return (cycles_t) get_clock() >> 2; +} + +int get_sync_clock(unsigned long long *clock); +void init_cpu_timer(void); + #endif