From: Tyrel Datwyler > Sent: 27 January 2017 18:03 > On 01/26/2017 05:50 PM, Benjamin Herrenschmidt wrote: > > On Thu, 2017-01-26 at 17:42 -0800, Tyrel Datwyler wrote: > >> On 01/26/2017 12:22 PM, Michal Suchnek wrote: > >>> Hello, > >>> > >>> building ibmvtpm I noticed gcc warning complaining that second word > >>> of > >>> struct ibmvtpm_crq in tpm_ibmvtpm_suspend is uninitialized. > >>> > >>> The structure is defined as > >>> > >>> struct ibmvtpm_crq { > >>> u8 valid; > >>> u8 msg; > >>> __be16 len; > >>> __be32 data; > >>> __be64 reserved; > >>> } __attribute__((packed, aligned(8))); > >>> > >>> initialized as > >>> > >>> struct ibmvtpm_crq crq; > >>> u64 *buf = (u64 *) &crq; > >>> ... > >>> crq.valid = (u8)IBMVTPM_VALID_CMD; > >>> crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND; > >>> > >>> and submitted with > >>> > >>> rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]), > >>> cpu_to_be64(buf[1]));
Isn't the real fubar here the use of that memory layout structure at all? It would probably all be better if the call looked like: rc = ibmvtpm_send_crq(ibmvtpm->vdev, MAKE_REQ(IBMVTPM_VALID_CMD, VTPM_PREPARE_TO_SUSPEND, xxx_len, xxx_data), 0); and MAKE_REQ() did all the required endian independant shifts to generate the correct 32bit value. David