s390-ccw.img: Consume service interrupts
We have to consume the outstanding service interrupt after each service call, otherwise a correct implementation will return CC=2 on subsequent service calls. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
ec7353a146
commit
bdc7fe3638
@ -47,6 +47,7 @@ typedef unsigned long long __u64;
|
||||
|
||||
/* start.s */
|
||||
void disabled_wait(void);
|
||||
void consume_sclp_int(void);
|
||||
|
||||
/* main.c */
|
||||
void virtio_panic(const char *string);
|
||||
|
@ -24,6 +24,7 @@ static int sclp_service_call(unsigned int command, void *sccb)
|
||||
" srl %0,28"
|
||||
: "=&d" (cc) : "d" (command), "a" (__pa(sccb))
|
||||
: "cc", "memory");
|
||||
consume_sclp_int();
|
||||
if (cc == 3)
|
||||
return -EIO;
|
||||
if (cc == 2)
|
||||
|
@ -28,6 +28,38 @@ disabled_wait:
|
||||
larl %r1,disabled_wait_psw
|
||||
lpswe 0(%r1)
|
||||
|
||||
|
||||
/*
|
||||
* void consume_sclp_int(void)
|
||||
*
|
||||
* eats one sclp interrupt
|
||||
*/
|
||||
.globl consume_sclp_int
|
||||
consume_sclp_int:
|
||||
/* enable service interrupts in cr0 */
|
||||
stctg 0,0,0(15)
|
||||
oi 6(15), 0x2
|
||||
lctlg 0,0,0(15)
|
||||
/* prepare external call handler */
|
||||
larl %r1, external_new_code
|
||||
stg %r1, 0x1b8
|
||||
larl %r1, external_new_mask
|
||||
mvc 0x1b0(8),0(%r1)
|
||||
/* load enabled wait PSW */
|
||||
larl %r1, enabled_wait_psw
|
||||
lpswe 0(%r1)
|
||||
|
||||
external_new_code:
|
||||
/* disable service interrupts in cr0 */
|
||||
stctg 0,0,0(15)
|
||||
ni 6(15), 0xfd
|
||||
lctlg 0,0,0(15)
|
||||
br 14
|
||||
|
||||
.align 8
|
||||
disabled_wait_psw:
|
||||
.quad 0x0002000180000000,0x0000000000000000
|
||||
enabled_wait_psw:
|
||||
.quad 0x0302000180000000,0x0000000000000000
|
||||
external_new_mask:
|
||||
.quad 0x0000000180000000
|
||||
|
Loading…
Reference in New Issue
Block a user