On Wed, 4 Nov 2015 15:29:23 +0100 Cornelia Huck <cornelia.huck@xxxxxxxxxx> wrote: > I'm currently suspecting some endianness issues, probably with the ecw > accesses, which is why I'd be interested in your trace information (as > I currently don't have a LE test setup at hand.) I think I've got it. We have sense_data as a byte array, which implicitly makes it BE already. When we copy to the ecws while building the irb, the data ends up in 32 bit values. The conversion from host endianness to BE now treats them as LE on your system... Could you please give the following qemu patch a try? diff --git a/hw/s390x/css.c b/hw/s390x/css.c index c033612..a13494e 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -892,8 +892,16 @@ int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len) /* If a unit check is pending, copy sense data. */ if ((s->dstat & SCSW_DSTAT_UNIT_CHECK) && (p->chars & PMCW_CHARS_MASK_CSENSE)) { + uint32_t ecw[8]; + int i; + irb.scsw.flags |= SCSW_FLAGS_MASK_ESWF | SCSW_FLAGS_MASK_ECTL; - memcpy(irb.ecw, sch->sense_data, sizeof(sch->sense_data)); + /* Attention: sense_data is already BE! */ + memset(ecw, 0, sizeof(ecw)); + memcpy(ecw, sch->sense_data, sizeof(sch->sense_data)); + for (i = 0; i < ARRAY_SIZE(ecw); i++) { + irb.ecw[i] = be32_to_cpu(ecw[i]); + } irb.esw[1] = 0x01000000 | (sizeof(sch->sense_data) << 8); } } -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html