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 */
|
/* start.s */
|
||||||
void disabled_wait(void);
|
void disabled_wait(void);
|
||||||
|
void consume_sclp_int(void);
|
||||||
|
|
||||||
/* main.c */
|
/* main.c */
|
||||||
void virtio_panic(const char *string);
|
void virtio_panic(const char *string);
|
||||||
|
@ -24,6 +24,7 @@ static int sclp_service_call(unsigned int command, void *sccb)
|
|||||||
" srl %0,28"
|
" srl %0,28"
|
||||||
: "=&d" (cc) : "d" (command), "a" (__pa(sccb))
|
: "=&d" (cc) : "d" (command), "a" (__pa(sccb))
|
||||||
: "cc", "memory");
|
: "cc", "memory");
|
||||||
|
consume_sclp_int();
|
||||||
if (cc == 3)
|
if (cc == 3)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
if (cc == 2)
|
if (cc == 2)
|
||||||
|
@ -28,6 +28,38 @@ disabled_wait:
|
|||||||
larl %r1,disabled_wait_psw
|
larl %r1,disabled_wait_psw
|
||||||
lpswe 0(%r1)
|
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
|
.align 8
|
||||||
disabled_wait_psw:
|
disabled_wait_psw:
|
||||||
.quad 0x0002000180000000,0x0000000000000000
|
.quad 0x0002000180000000,0x0000000000000000
|
||||||
|
enabled_wait_psw:
|
||||||
|
.quad 0x0302000180000000,0x0000000000000000
|
||||||
|
external_new_mask:
|
||||||
|
.quad 0x0000000180000000
|
||||||
|
Loading…
x
Reference in New Issue
Block a user