hw/s390x/ipl: Fix alignment problems of S390IPLState members
commit3b8afb41bc8eef42c3e2d3ed78ca5fe94ebe76e8
authorThomas Huth <thuth@redhat.com>
Thu, 27 Sep 2018 08:23:33 +0000 (27 10:23 +0200)
committerCornelia Huck <cohuck@redhat.com>
Thu, 4 Oct 2018 08:32:38 +0000 (4 10:32 +0200)
tree5ce0e869e412506512afa9cd0217cefdeedc7235
parentdafd95053611aa14dda40266857608d12ddce658
hw/s390x/ipl: Fix alignment problems of S390IPLState members

The IplParameterBlock and QemuIplParameters structures are declared with
QEMU_PACKED, so the compiler assumes that the structures do not need to
be aligned in memory. Since the are listed after a "bool" within the
S390IPLState, the IplParameterBlock and QemuIplParameters are also indeed
mis-aligned in memory. This causes problems on Sparc during migration, since
we use VMSTATE_UINT16 in vmstate_iplb to access the devno member for example,
and the corresponding migration functions (like qemu_get_be16s) then try to
access a 16-bit value from a misaligned memory address.
The easiest solution to fix this problem is to move the packed structures
to the beginning of the S390IPLState, right after the DeviceState of course
which has to stay first for QOM reasons. But since DeviceState is a non-packed
struct, we can be sure that it will be padded to the correct alignment at the
end. If not, the QEMU_BUILD_BUG_MSG in this patch will tell us.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1538036615-32542-2-git-send-email-thuth@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
hw/s390x/ipl.h