[U-Boot] [PATCH v2 1/2] usb: composite: fix possible alignment issues
Lukasz Majewski
lukma at denx.de
Thu Nov 21 22:38:31 UTC 2019
On Thu, 21 Nov 2019 22:15:22 +0100
Simon Goldschmidt <simon.k.r.goldschmidt at 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.goldschmidt at 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 <lukma at 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: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20191121/28c4c32c/attachment.sig>
More information about the U-Boot
mailing list