Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 473e66ba authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

s390/time: always use stckf instead of stck if available



The store clock fast instruction saves a couple of instructions compared
to the store clock instruction. Always use stckf instead of stck if it
is available.

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 2739b6d1
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -82,7 +82,6 @@ extern unsigned int user_mode;
#define MACHINE_FLAG_LPAR	(1UL << 12)
#define MACHINE_FLAG_SPP	(1UL << 13)
#define MACHINE_FLAG_TOPOLOGY	(1UL << 14)
#define MACHINE_FLAG_STCKF	(1UL << 15)

#define MACHINE_IS_VM		(S390_lowcore.machine_flags & MACHINE_FLAG_VM)
#define MACHINE_IS_KVM		(S390_lowcore.machine_flags & MACHINE_FLAG_KVM)
@@ -101,7 +100,6 @@ extern unsigned int user_mode;
#define MACHINE_HAS_PFMF	(0)
#define MACHINE_HAS_SPP		(0)
#define MACHINE_HAS_TOPOLOGY	(0)
#define MACHINE_HAS_STCKF	(0)
#else /* __s390x__ */
#define MACHINE_HAS_IEEE	(1)
#define MACHINE_HAS_CSP		(1)
@@ -113,7 +111,6 @@ extern unsigned int user_mode;
#define MACHINE_HAS_PFMF	(S390_lowcore.machine_flags & MACHINE_FLAG_PFMF)
#define MACHINE_HAS_SPP		(S390_lowcore.machine_flags & MACHINE_FLAG_SPP)
#define MACHINE_HAS_TOPOLOGY	(S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY)
#define MACHINE_HAS_STCKF	(S390_lowcore.machine_flags & MACHINE_FLAG_STCKF)
#endif /* __s390x__ */

#define ZFCPDUMP_HSA_SIZE	(32UL<<20)
+5 −12
Original line number Diff line number Diff line
@@ -77,7 +77,11 @@ static inline unsigned long long get_clock (void)
{
	unsigned long long clk;

#if defined(CONFIG_64BIT) && !defined(CONFIG_MARCH_Z900) && !defined(CONFIG_MARCH_Z990)
	asm volatile(".insn s,0xb27c0000,%0" : "=Q" (clk) : : "cc");
#else
	asm volatile("stck %0" : "=Q" (clk) : : "cc");
#endif
	return clk;
}

@@ -86,17 +90,6 @@ static inline void get_clock_ext(char *clk)
	asm volatile("stcke %0" : "=Q" (*clk) : : "cc");
}

static inline unsigned long long get_clock_fast(void)
{
	unsigned long long clk;

	if (MACHINE_HAS_STCKF)
		asm volatile(".insn	s,0xb27c0000,%0" : "=Q" (clk) : : "cc");
	else
		clk = get_clock();
	return clk;
}

static inline unsigned long long get_clock_xt(void)
{
	unsigned char clk[16];
+0 −2
Original line number Diff line number Diff line
@@ -374,8 +374,6 @@ static __init void detect_machine_facilities(void)
		S390_lowcore.machine_flags |= MACHINE_FLAG_MVCOS;
	if (test_facility(40))
		S390_lowcore.machine_flags |= MACHINE_FLAG_SPP;
	if (test_facility(25))
		S390_lowcore.machine_flags |= MACHINE_FLAG_STCKF;
#endif
}

+12 −4
Original line number Diff line number Diff line
@@ -148,6 +148,14 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
	ssm	__LC_RETURN_PSW
	.endm

	.macro STCK savearea
#if defined(CONFIG_64BIT) && !defined(CONFIG_MARCH_Z900) && !defined(CONFIG_MARCH_Z990)
	.insn	s,0xb27c0000,\savearea		# store clock fast
#else
	.insn	s,0xb2050000,\savearea		# store clock
#endif
	.endm

	.section .kprobes.text, "ax"

/*
@@ -458,7 +466,7 @@ pgm_svcper:
 * IO interrupt handler routine
 */
ENTRY(io_int_handler)
	stck	__LC_INT_CLOCK
	STCK	__LC_INT_CLOCK
	stpt	__LC_ASYNC_ENTER_TIMER
	stmg	%r8,%r15,__LC_SAVE_AREA_ASYNC
	lg	%r10,__LC_LAST_BREAK
@@ -604,7 +612,7 @@ io_notify_resume:
 * External interrupt handler routine
 */
ENTRY(ext_int_handler)
	stck	__LC_INT_CLOCK
	STCK	__LC_INT_CLOCK
	stpt	__LC_ASYNC_ENTER_TIMER
	stmg	%r8,%r15,__LC_SAVE_AREA_ASYNC
	lg	%r10,__LC_LAST_BREAK
@@ -639,7 +647,7 @@ ENTRY(psw_idle)
	larl	%r1,psw_idle_lpsw+4
	stg	%r1,__SF_EMPTY+8(%r15)
	larl	%r1,.Lvtimer_max
	stck	__IDLE_ENTER(%r2)
	STCK	__IDLE_ENTER(%r2)
	ltr	%r5,%r5
	stpt	__VQ_IDLE_ENTER(%r3)
	jz	psw_idle_lpsw
@@ -655,7 +663,7 @@ __critical_end:
 * Machine check handler routines
 */
ENTRY(mcck_int_handler)
	stck	__LC_MCCK_CLOCK
	STCK	__LC_MCCK_CLOCK
	la	%r1,4095		# revalidate r1
	spt	__LC_CPU_TIMER_SAVE_AREA-4095(%r1)	# revalidate cpu timer
	lmg	%r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
+2 −2
Original line number Diff line number Diff line
@@ -517,7 +517,7 @@ static int get_inbound_buffer_frontier(struct qdio_q *q)
	int count, stop;
	unsigned char state = 0;

	q->timestamp = get_clock_fast();
	q->timestamp = get_clock();

	/*
	 * Don't check 128 buffers, as otherwise qdio_inbound_q_moved
@@ -788,7 +788,7 @@ static int get_outbound_buffer_frontier(struct qdio_q *q)
	int count, stop;
	unsigned char state = 0;

	q->timestamp = get_clock_fast();
	q->timestamp = get_clock();

	if (need_siga_sync(q))
		if (((queue_type(q) != QDIO_IQDIO_QFMT) &&