From: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Add a wrapper for the service call instruction, and use it for SCLP interactions instead of using inline assembly everywhere. Signed-off-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Reviewed-by: David Hildenbrand <david@xxxxxxxxxx> Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx> Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Message-Id: <20200120184256.188698-3-imbrenda@xxxxxxxxxxxxx> Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> --- lib/s390x/asm/arch_def.h | 13 +++++++++++++ lib/s390x/sclp.c | 7 +------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/s390x/asm/arch_def.h b/lib/s390x/asm/arch_def.h index cf6e1ca..1a5e3c6 100644 --- a/lib/s390x/asm/arch_def.h +++ b/lib/s390x/asm/arch_def.h @@ -271,4 +271,17 @@ static inline int stsi(void *addr, int fc, int sel1, int sel2) return cc; } +static inline int servc(uint32_t command, unsigned long sccb) +{ + int cc; + + asm volatile( + " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ + " ipm %0\n" + " srl %0,28" + : "=&d" (cc) : "d" (command), "a" (sccb) + : "cc", "memory"); + return cc; +} + #endif diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c index 123b639..4054d0e 100644 --- a/lib/s390x/sclp.c +++ b/lib/s390x/sclp.c @@ -116,12 +116,7 @@ int sclp_service_call(unsigned int command, void *sccb) int cc; sclp_setup_int(); - asm volatile( - " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ - " ipm %0\n" - " srl %0,28" - : "=&d" (cc) : "d" (command), "a" (__pa(sccb)) - : "cc", "memory"); + cc = servc(command, __pa(sccb)); sclp_wait_busy(); if (cc == 3) return -1; -- 2.24.1