diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2015-10-08 15:05:46 +0200 |
---|---|---|
committer | Cornelia Huck <cornelia.huck@de.ibm.com> | 2015-10-20 16:21:00 +0200 |
commit | b080364aedfc294c53c4c4af255efcf007b35d9d (patch) | |
tree | 00312ba0d2ad1a97a4964edf8b2fcb959ae7ec19 /target-s390x/kvm.c | |
parent | 2ab75df38e34fe9bc271b5115ab52114e6e63a89 (diff) | |
download | hqemu-b080364aedfc294c53c4c4af255efcf007b35d9d.zip hqemu-b080364aedfc294c53c4c4af255efcf007b35d9d.tar.gz |
s390x: flagify mcic values
Instead of using magic values when building the machine check
interruption code, add some defines as by chapter 11-14 in the PoP.
This should make it easier to catch problems like the missing vector
register validity bit ("s390x/kvm: Fix vector validity bit in device
machine checks"), and less hassle should we want to generate machine
checks beyond the channel reports we currently support.
Acked-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Diffstat (limited to 'target-s390x/kvm.c')
-rw-r--r-- | target-s390x/kvm.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index e1acdac..6e488d4 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -2065,16 +2065,31 @@ void kvm_s390_io_interrupt(uint16_t subchannel_id, kvm_s390_floating_interrupt(&irq); } +static uint64_t build_channel_report_mcic(void) +{ + uint64_t mcic; + + /* subclass: indicate channel report pending */ + mcic = MCIC_SC_CP | + /* subclass modifiers: none */ + /* storage errors: none */ + /* validity bits: no damage */ + MCIC_VB_WP | MCIC_VB_MS | MCIC_VB_PM | MCIC_VB_IA | MCIC_VB_FP | + MCIC_VB_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR | + MCIC_VB_FC | MCIC_VB_CT | MCIC_VB_CC; + if (kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) { + mcic |= MCIC_VB_VR; + } + return mcic; +} + void kvm_s390_crw_mchk(void) { struct kvm_s390_irq irq = { .type = KVM_S390_MCHK, .u.mchk.cr14 = 1 << 28, - .u.mchk.mcic = 0x00400f1d40330000ULL, + .u.mchk.mcic = build_channel_report_mcic(), }; - if (kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) { - irq.u.mchk.mcic |= 0x0000004000000000ULL; - } kvm_s390_floating_interrupt(&irq); } |