diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2016-06-20 14:03:00 +0200 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-06-28 09:32:31 +0200 |
commit | eb090ad2ad5c7d0b4264a54f371683f2b2de1f9d (patch) | |
tree | 26797fc48f3384875f66a10cd862b50b771e3c80 /net | |
parent | s390/crypto: use basic blocks for ap bus inline assemblies (diff) | |
download | linux-eb090ad2ad5c7d0b4264a54f371683f2b2de1f9d.tar.xz linux-eb090ad2ad5c7d0b4264a54f371683f2b2de1f9d.zip |
s390/iucv: use basic blocks for iucv inline assemblies
Use only simple inline assemblies which consist of a single basic
block if the register asm construct is being used.
Otherwise gcc would generate broken code if the compiler option
--sanitize-coverage=trace-pc would be used.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/iucv/iucv.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index 7eaa000c9258..88a2a3ba4212 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c @@ -320,21 +320,29 @@ static union iucv_param *iucv_param_irq[NR_CPUS]; * * Returns the result of the CP IUCV call. */ -static inline int iucv_call_b2f0(int command, union iucv_param *parm) +static inline int __iucv_call_b2f0(int command, union iucv_param *parm) { register unsigned long reg0 asm ("0"); register unsigned long reg1 asm ("1"); int ccode; reg0 = command; - reg1 = virt_to_phys(parm); + reg1 = (unsigned long)parm; asm volatile( " .long 0xb2f01000\n" " ipm %0\n" " srl %0,28\n" : "=d" (ccode), "=m" (*parm), "+d" (reg0), "+a" (reg1) : "m" (*parm) : "cc"); - return (ccode == 1) ? parm->ctrl.iprcode : ccode; + return ccode; +} + +static inline int iucv_call_b2f0(int command, union iucv_param *parm) +{ + int ccode; + + ccode = __iucv_call_b2f0(command, parm); + return ccode == 1 ? parm->ctrl.iprcode : ccode; } /** @@ -345,16 +353,12 @@ static inline int iucv_call_b2f0(int command, union iucv_param *parm) * Returns the maximum number of connections or -EPERM is IUCV is not * available. */ -static int iucv_query_maxconn(void) +static int __iucv_query_maxconn(void *param, unsigned long *max_pathid) { register unsigned long reg0 asm ("0"); register unsigned long reg1 asm ("1"); - void *param; int ccode; - param = kzalloc(sizeof(union iucv_param), GFP_KERNEL|GFP_DMA); - if (!param) - return -ENOMEM; reg0 = IUCV_QUERY; reg1 = (unsigned long) param; asm volatile ( @@ -362,8 +366,22 @@ static int iucv_query_maxconn(void) " ipm %0\n" " srl %0,28\n" : "=d" (ccode), "+d" (reg0), "+d" (reg1) : : "cc"); + *max_pathid = reg1; + return ccode; +} + +static int iucv_query_maxconn(void) +{ + unsigned long max_pathid; + void *param; + int ccode; + + param = kzalloc(sizeof(union iucv_param), GFP_KERNEL | GFP_DMA); + if (!param) + return -ENOMEM; + ccode = __iucv_query_maxconn(param, &max_pathid); if (ccode == 0) - iucv_max_pathid = reg1; + iucv_max_pathid = max_pathid; kfree(param); return ccode ? -EPERM : 0; } |