Skip to content

Commit

Permalink
net/iucv: get rid of register asm usage
Browse files Browse the repository at this point in the history
Using register asm statements has been proven to be very error prone,
especially when using code instrumentation where gcc may add function
calls, which clobbers register contents in an unexpected way.

Therefore get rid of register asm statements in iucv code, even though
there is currently nothing wrong with it. This way we know for sure
that the above mentioned bug class won't be introduced here.

Acked-by: Karsten Graul <[email protected]>
Signed-off-by: Heiko Carstens <[email protected]>
Signed-off-by: Karsten Graul <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
hcahca authored and davem330 committed Aug 9, 2021
1 parent ff8424b commit 50348fa
Showing 1 changed file with 22 additions and 20 deletions.
42 changes: 22 additions & 20 deletions net/iucv/iucv.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,19 +286,19 @@ static union iucv_param *iucv_param_irq[NR_CPUS];
*/
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;
int cc;

reg0 = command;
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;
" lgr 0,%[reg0]\n"
" lgr 1,%[reg1]\n"
" .long 0xb2f01000\n"
" ipm %[cc]\n"
" srl %[cc],28\n"
: [cc] "=&d" (cc), "+m" (*parm)
: [reg0] "d" ((unsigned long)command),
[reg1] "d" ((unsigned long)parm)
: "cc", "0", "1");
return cc;
}

static inline int iucv_call_b2f0(int command, union iucv_param *parm)
Expand All @@ -319,19 +319,21 @@ static inline int iucv_call_b2f0(int command, union iucv_param *parm)
*/
static int __iucv_query_maxconn(void *param, unsigned long *max_pathid)
{
register unsigned long reg0 asm ("0");
register unsigned long reg1 asm ("1");
int ccode;
unsigned long reg1 = (unsigned long)param;
int cc;

reg0 = IUCV_QUERY;
reg1 = (unsigned long) param;
asm volatile (
" lghi 0,%[cmd]\n"
" lgr 1,%[reg1]\n"
" .long 0xb2f01000\n"
" ipm %0\n"
" srl %0,28\n"
: "=d" (ccode), "+d" (reg0), "+d" (reg1) : : "cc");
" ipm %[cc]\n"
" srl %[cc],28\n"
" lgr %[reg1],1\n"
: [cc] "=&d" (cc), [reg1] "+&d" (reg1)
: [cmd] "K" (IUCV_QUERY)
: "cc", "0", "1");
*max_pathid = reg1;
return ccode;
return cc;
}

static int iucv_query_maxconn(void)
Expand Down

0 comments on commit 50348fa

Please sign in to comment.