s390x/kvm: helper to set the SIGP status in SigpInfo

Whenever we set the SIGP status in the status register, we have to wipe out
the lower 4 bytes and keep the higher 4 bytes. Also the condition code will
always be set to STATUS_STORED.

Let's introduce the wrapper for SigpInfo, as this will avoid most duplicate
code in the future.

Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Message-Id: <1424783731-43426-5-git-send-email-jfrei@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
David Hildenbrand 2015-02-24 14:15:25 +01:00 committed by Christian Borntraeger
parent 22740e3fc0
commit 36b5c84556
1 changed files with 8 additions and 3 deletions

View File

@ -1118,6 +1118,13 @@ typedef struct SigpInfo {
uint64_t *status_reg;
} SigpInfo;
static void set_sigp_status(SigpInfo *si, uint64_t status)
{
*si->status_reg &= 0xffffffff00000000ULL;
*si->status_reg |= status;
si->cc = SIGP_CC_STATUS_STORED;
}
static void sigp_start(void *arg)
{
SigpInfo *si = arg;
@ -1202,9 +1209,7 @@ static int handle_sigp_single_dst(S390CPU *dst_cpu, uint8_t order,
break;
default:
DPRINTF("KVM: unknown SIGP: 0x%x\n", order);
*status_reg &= 0xffffffff00000000ULL;
*status_reg |= SIGP_STAT_INVALID_ORDER;
si.cc = SIGP_CC_STATUS_STORED;
set_sigp_status(&si, SIGP_STAT_INVALID_ORDER);
}
return si.cc;