Arnd Bergmann <arnd@xxxxxxxx> wrote: > +#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __BIG_ENDIAN : defined(__BIG_ENDIAN) > +typedef char __pad_before_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; > +typedef char __pad_after_uframe[0]; > +#endif > + > +#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN) > +typedef char __pad_before_uframe[0]; > +typedef char __pad_after_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)]; > +#endif > + > +struct __snd_pcm_mmap_status64 { > + __s32 state; /* RO: state - SNDRV_PCM_STATE_XXXX */ > + __u32 pad1; /* Needed for 64 bit alignment */ > + __pad_before_uframe __pad1; > + snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */ > + __pad_after_uframe __pad2; > + struct __snd_timespec64 tstamp; /* Timestamp */ > + __s32 suspended_state; /* RO: suspended stream state */ > + __u32 pad3; /* Needed for 64 bit alignment */ > + struct __snd_timespec64 audio_tstamp; /* sample counter or wall clock */ > +}; > + > +struct __snd_pcm_mmap_control64 { > + __pad_before_uframe __pad1; > + snd_pcm_uframes_t appl_ptr; /* RW: appl ptr (0...boundary-1) */ > + __pad_before_uframe __pad2; I was looking through this header and happened to notice that this padding is wrong. I believe it should be __pad_after_uframe here. I'm not sure of the implications of this typo, but I suspect it breaks something on 32-bit systems with 64-bit time (regardless of the endianness, since it changes the offset of avail_min). > + > + __pad_before_uframe __pad3; > + snd_pcm_uframes_t avail_min; /* RW: min available frames for wakeup */ > + __pad_after_uframe __pad4; > +};