Commit df80c038 authored by Harald Freudenberger's avatar Harald Freudenberger Committed by Martin Schwidefsky

s390/zcrypt: Review inline assembler constraints.

Reviewed and adapted the register use and asm constraints
of the C inline assembler functions in accordance to the
the AP instructions specifications.
Signed-off-by: default avatarHarald Freudenberger <freude@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent ea3c4185
...@@ -20,14 +20,16 @@ static inline int ap_instructions_available(void) ...@@ -20,14 +20,16 @@ static inline int ap_instructions_available(void)
{ {
register unsigned long reg0 asm ("0") = AP_MKQID(0, 0); register unsigned long reg0 asm ("0") = AP_MKQID(0, 0);
register unsigned long reg1 asm ("1") = -ENODEV; register unsigned long reg1 asm ("1") = -ENODEV;
register unsigned long reg2 asm ("2") = 0UL; register unsigned long reg2 asm ("2");
asm volatile( asm volatile(
" .long 0xb2af0000\n" /* PQAP(TAPQ) */ " .long 0xb2af0000\n" /* PQAP(TAPQ) */
"0: la %1,0\n" "0: la %0,0\n"
"1:\n" "1:\n"
EX_TABLE(0b, 1b) EX_TABLE(0b, 1b)
: "+d" (reg0), "+d" (reg1), "+d" (reg2) : : "cc"); : "+d" (reg1), "=d" (reg2)
: "d" (reg0)
: "cc");
return reg1; return reg1;
} }
...@@ -42,10 +44,12 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info) ...@@ -42,10 +44,12 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
{ {
register unsigned long reg0 asm ("0") = qid; register unsigned long reg0 asm ("0") = qid;
register struct ap_queue_status reg1 asm ("1"); register struct ap_queue_status reg1 asm ("1");
register unsigned long reg2 asm ("2") = 0UL; register unsigned long reg2 asm ("2");
asm volatile(".long 0xb2af0000" /* PQAP(TAPQ) */ asm volatile(".long 0xb2af0000" /* PQAP(TAPQ) */
: "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc"); : "=d" (reg1), "=d" (reg2)
: "d" (reg0)
: "cc");
if (info) if (info)
*info = reg2; *info = reg2;
return reg1; return reg1;
...@@ -59,13 +63,14 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info) ...@@ -59,13 +63,14 @@ static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
*/ */
static inline struct ap_queue_status ap_rapq(ap_qid_t qid) static inline struct ap_queue_status ap_rapq(ap_qid_t qid)
{ {
register unsigned long reg0 asm ("0") = qid | 0x01000000UL; register unsigned long reg0 asm ("0") = qid | (1UL << 24);
register struct ap_queue_status reg1 asm ("1"); register struct ap_queue_status reg1 asm ("1");
register unsigned long reg2 asm ("2") = 0UL;
asm volatile( asm volatile(
".long 0xb2af0000" /* PQAP(RAPQ) */ ".long 0xb2af0000" /* PQAP(RAPQ) */
: "+d" (reg0), "=d" (reg1), "+d" (reg2) : : "cc"); : "=d" (reg1)
: "d" (reg0)
: "cc");
return reg1; return reg1;
} }
...@@ -107,8 +112,8 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid, ...@@ -107,8 +112,8 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
asm volatile( asm volatile(
".long 0xb2af0000" /* PQAP(AQIC) */ ".long 0xb2af0000" /* PQAP(AQIC) */
: "+d" (reg0), "+d" (reg1_in), "=d" (reg1_out), "+d" (reg2) : "=d" (reg1_out)
: : "d" (reg0), "d" (reg1_in), "d" (reg2)
: "cc"); : "cc");
return reg1_out; return reg1_out;
} }
...@@ -120,17 +125,17 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid, ...@@ -120,17 +125,17 @@ static inline struct ap_queue_status ap_aqic(ap_qid_t qid,
*/ */
static inline int ap_qci(void *config) static inline int ap_qci(void *config)
{ {
register unsigned long reg0 asm ("0") = 0x04000000UL; register unsigned long reg0 asm ("0") = 4UL << 24;
register unsigned long reg1 asm ("1") = -EINVAL; register unsigned long reg1 asm ("1") = -EINVAL;
register void *reg2 asm ("2") = (void *) config; register void *reg2 asm ("2") = (void *) config;
asm volatile( asm volatile(
".long 0xb2af0000\n" /* PQAP(QCI) */ ".long 0xb2af0000\n" /* PQAP(QCI) */
"0: la %1,0\n" "0: la %0,0\n"
"1:\n" "1:\n"
EX_TABLE(0b, 1b) EX_TABLE(0b, 1b)
: "+d" (reg0), "+d" (reg1), "+d" (reg2) : "+d" (reg1)
: : "d" (reg0), "d" (reg2)
: "cc", "memory"); : "cc", "memory");
return reg1; return reg1;
...@@ -169,12 +174,13 @@ static inline struct ap_queue_status ap_qact(ap_qid_t qid, int ifbit, ...@@ -169,12 +174,13 @@ static inline struct ap_queue_status ap_qact(ap_qid_t qid, int ifbit,
| ((ifbit & 0x01) << 22); | ((ifbit & 0x01) << 22);
register unsigned long reg1_in asm ("1") = apinfo->val; register unsigned long reg1_in asm ("1") = apinfo->val;
register struct ap_queue_status reg1_out asm ("1"); register struct ap_queue_status reg1_out asm ("1");
register unsigned long reg2 asm ("2") = 0; register unsigned long reg2 asm ("2");
asm volatile( asm volatile(
".long 0xb2af0000" /* PQAP(QACT) */ ".long 0xb2af0000" /* PQAP(QACT) */
: "+d" (reg0), "+d" (reg1_in), "=d" (reg1_out), "+d" (reg2) : "+d" (reg1_in), "=d" (reg1_out), "=d" (reg2)
: : "cc"); : "d" (reg0)
: "cc");
apinfo->val = reg2; apinfo->val = reg2;
return reg1_out; return reg1_out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment