mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
KVM: s390: Fix sigp sense handling.
If sigp sense doesn't have any status bits to report, it should set cc 0 and leave the register as-is. Since we know about the external call pending bit, we should report it if it is set as well. Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
ea1918dd3d
commit
21b26c0853
@ -24,6 +24,7 @@
|
||||
|
||||
#define SIGP_STATUS_CHECK_STOP 0x00000010UL
|
||||
#define SIGP_STATUS_STOPPED 0x00000040UL
|
||||
#define SIGP_STATUS_EXT_CALL_PENDING 0x00000080UL
|
||||
#define SIGP_STATUS_INVALID_PARAMETER 0x00000100UL
|
||||
#define SIGP_STATUS_INCORRECT_STATE 0x00000200UL
|
||||
#define SIGP_STATUS_NOT_RUNNING 0x00000400UL
|
||||
|
@ -32,12 +32,16 @@ static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr,
|
||||
if (fi->local_int[cpu_addr] == NULL)
|
||||
rc = SIGP_CC_NOT_OPERATIONAL;
|
||||
else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
||||
& CPUSTAT_STOPPED)) {
|
||||
& (CPUSTAT_ECALL_PEND | CPUSTAT_STOPPED)))
|
||||
rc = SIGP_CC_ORDER_CODE_ACCEPTED;
|
||||
else {
|
||||
*reg &= 0xffffffff00000000UL;
|
||||
rc = SIGP_CC_STATUS_STORED;
|
||||
} else {
|
||||
*reg &= 0xffffffff00000000UL;
|
||||
*reg |= SIGP_STATUS_STOPPED;
|
||||
if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
||||
& CPUSTAT_ECALL_PEND)
|
||||
*reg |= SIGP_STATUS_EXT_CALL_PENDING;
|
||||
if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
|
||||
& CPUSTAT_STOPPED)
|
||||
*reg |= SIGP_STATUS_STOPPED;
|
||||
rc = SIGP_CC_STATUS_STORED;
|
||||
}
|
||||
spin_unlock(&fi->lock);
|
||||
|
Loading…
Reference in New Issue
Block a user