s390/vtime: use cpu alternative for stck/stckf

Use a cpu alternative to switch between stck and stckf instead of
making it compile time dependent. This will also make kernels compiled
for old machines, but running on newer machines, use stckf.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
Heiko Carstens 2021-02-02 16:59:50 +01:00 committed by Vasily Gorbik
parent 80841ad8d4
commit 1c7673476b
1 changed files with 8 additions and 11 deletions

View File

@ -13,7 +13,7 @@
#include <linux/timex.h>
#include <linux/types.h>
#include <linux/time.h>
#include <asm/alternative.h>
#include <asm/vtimer.h>
#include <asm/vtime.h>
#include <asm/cpu_mf.h>
@ -128,16 +128,13 @@ static int do_account_vtime(struct task_struct *tsk)
timer = S390_lowcore.last_update_timer;
clock = S390_lowcore.last_update_clock;
asm volatile(
" stpt %0\n" /* Store current cpu timer value */
#ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES
" stckf %1" /* Store current tod clock value */
#else
" stck %1" /* Store current tod clock value */
#endif
: "=Q" (S390_lowcore.last_update_timer),
"=Q" (S390_lowcore.last_update_clock)
: : "cc");
/* Use STORE CLOCK by default, STORE CLOCK FAST if available. */
alternative_io("stpt %0\n .insn s,0xb2050000,%1\n",
"stpt %0\n .insn s,0xb27c0000,%1\n",
25,
ASM_OUTPUT2("=Q" (S390_lowcore.last_update_timer),
"=Q" (S390_lowcore.last_update_clock)),
ASM_NO_INPUT_CLOBBER("cc"));
clock = S390_lowcore.last_update_clock - clock;
timer -= S390_lowcore.last_update_timer;