On Thu, 21 Nov 2019 22:15:22 +0100
Simon Goldschmidt <simon.k.r.goldschm...@gmail.com> wrote:

> Since upgrading to gcc9, warnings are issued:
> "taking address of packed member of ‘...’ may result in an unaligned
> pointer value"
> 
> Fix this by converting two functions to use unaligned access since
> packed structures may be on an unaligned address, depending on USB
> hardware.
> 
> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com>
> ---
> 
> Changes in v2:
> - fix compiler warning "dereferencing ‘void *'"
> 
>  drivers/usb/gadget/composite.c | 25 ++++++++++++++++++-------
>  1 file changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/gadget/composite.c
> b/drivers/usb/gadget/composite.c index 618a7d5016..c98a444245 100644
> --- a/drivers/usb/gadget/composite.c
> +++ b/drivers/usb/gadget/composite.c
> @@ -12,8 +12,16 @@
>  
>  #define USB_BUFSIZ   4096
>  
> +/* Helper type for accessing packed u16 pointers */
> +typedef struct { __le16 val; } __packed __le16_packed;
> +
>  static struct usb_composite_driver *composite;
>  
> +static inline void le16_add_cpu_packed(__le16_packed *var, u16 val)
> +{
> +     var->val = cpu_to_le16(le16_to_cpu(var->val) + val);
> +}
> +
>  /**
>   * usb_add_function() - add a function to a configuration
>   * @config: the configuration
> @@ -480,20 +488,21 @@ done:
>   * the host side.
>   */
>  
> -static void collect_langs(struct usb_gadget_strings **sp, __le16
> *buf) +static void collect_langs(struct usb_gadget_strings **sp, void
> *buf) {
>       const struct usb_gadget_strings *s;
>       u16                             language;
> -     __le16                          *tmp;
> +     __le16_packed                   *tmp;
> +     __le16_packed                   *end = (buf + 252);
>  
>       while (*sp) {
>               s = *sp;
>               language = cpu_to_le16(s->language);
> -             for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
> -                     if (*tmp == language)
> +             for (tmp = buf; tmp->val && tmp < end; tmp++) {
> +                     if (tmp->val == language)
>                               goto repeat;
>               }
> -             *tmp++ = language;
> +             tmp->val = language;
>  repeat:
>               sp++;
>       }
> @@ -705,7 +714,8 @@ static int bos_desc(struct usb_composite_dev
> *cdev) */
>       usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
>       bos->bNumDeviceCaps++;
> -     le16_add_cpu(&bos->wTotalLength, USB_DT_USB_EXT_CAP_SIZE);
> +     le16_add_cpu_packed((__le16_packed *)&bos->wTotalLength,
> +                         USB_DT_USB_EXT_CAP_SIZE);
>       usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE;
>       usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
>       usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT;
> @@ -721,7 +731,8 @@ static int bos_desc(struct usb_composite_dev
> *cdev) 
>               ss_cap = cdev->req->buf +
> le16_to_cpu(bos->wTotalLength); bos->bNumDeviceCaps++;
> -             le16_add_cpu(&bos->wTotalLength,
> USB_DT_USB_SS_CAP_SIZE);
> +             le16_add_cpu_packed((__le16_packed
> *)&bos->wTotalLength,
> +                                 USB_DT_USB_SS_CAP_SIZE);
>               ss_cap->bLength = USB_DT_USB_SS_CAP_SIZE;
>               ss_cap->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
>               ss_cap->bDevCapabilityType = USB_SS_CAP_TYPE;

Acked-by: Lukasz Majewski <lu...@denx.de>


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de

Attachment: pgpzkndIXZrTM.pgp
Description: OpenPGP digital signature

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to