[PATCH RESEND] usbtty: fix possible alignment issues

With gcc9, below warnings are shown: drivers/serial/usbtty.c: In function 'usbtty_init_strings': drivers/serial/usbtty.c:590:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 590 | str2wide (CONFIG_USBD_MANUFACTURER, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:596:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 597 | str2wide (CONFIG_USBD_PRODUCT_NAME, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:603:33: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 604 | str2wide (serial_number, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:610:49: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 611 | str2wide (CONFIG_USBD_CONFIGURATION_STR, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:617:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 618 | str2wide (CONFIG_USBD_DATA_INTERFACE_STR, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:623:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 624 | str2wide (CONFIG_USBD_CTRL_INTERFACE_STR, string->wData); | ~~~~~~^~~~~~~
Fix the issues by using packed structure.
Ref: commit 616ebd8b9cb4 ("usb: composite: fix possible alignment issues") Signed-off-by: Seung-Woo Kim sw0312.kim@samsung.com --- resend with proper e-mail address --- drivers/serial/usbtty.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index f1c1a260da..54e67dd0d1 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -48,6 +48,8 @@ #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface" #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
+typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed; + /* * Buffers to hold input and output data */ @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf); void usbtty_poll (void);
/* utility function for converting char* to wide string used by USB */ -static void str2wide (char *str, u16 * wide) +static void str2wide (char *str, void *wide) { int i; + __le16_packed *tmp = wide; for (i = 0; i < strlen (str) && str[i]; i++){ #if defined(__LITTLE_ENDIAN) - wide[i] = (u16) str[i]; + tmp[i].val = (u16) str[i]; #elif defined(__BIG_ENDIAN) - wide[i] = ((u16)(str[i])<<8); + tmp[i].val = ((u16)(str[i])<<8); #else #error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined" #endif

On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:
With gcc9, below warnings are shown: drivers/serial/usbtty.c: In function 'usbtty_init_strings': drivers/serial/usbtty.c:590:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 590 | str2wide (CONFIG_USBD_MANUFACTURER, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:596:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 597 | str2wide (CONFIG_USBD_PRODUCT_NAME, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:603:33: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 604 | str2wide (serial_number, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:610:49: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 611 | str2wide (CONFIG_USBD_CONFIGURATION_STR, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:617:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 618 | str2wide (CONFIG_USBD_DATA_INTERFACE_STR, string->wData); | ~~~~~~^~~~~~~ drivers/serial/usbtty.c:623:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member] 624 | str2wide (CONFIG_USBD_CTRL_INTERFACE_STR, string->wData); | ~~~~~~^~~~~~~
Fix the issues by using packed structure.
Ref: commit 616ebd8b9cb4 ("usb: composite: fix possible alignment issues") Signed-off-by: Seung-Woo Kim sw0312.kim@samsung.com
resend with proper e-mail address
drivers/serial/usbtty.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index f1c1a260da..54e67dd0d1 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -48,6 +48,8 @@ #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface" #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
+typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
/*
- Buffers to hold input and output data
*/ @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf); void usbtty_poll (void);
/* utility function for converting char* to wide string used by USB */ -static void str2wide (char *str, u16 * wide) +static void str2wide (char *str, void *wide) { int i;
- __le16_packed *tmp = wide; for (i = 0; i < strlen (str) && str[i]; i++){ #if defined(__LITTLE_ENDIAN)
wide[i] = (u16) str[i];
#elif defined(__BIG_ENDIAN)tmp[i].val = (u16) str[i];
wide[i] = ((u16)(str[i])<<8);
#else #error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined" #endiftmp[i].val = ((u16)(str[i])<<8);
We generally don't want packed structs and do need to disable this warning in general. Is this _really_ a problem, or are we just silencing the compiler here? Thanks!

Hi,
On 2020년 01월 07일 22:22, Tom Rini wrote:
On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:
...
drivers/serial/usbtty.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index f1c1a260da..54e67dd0d1 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -48,6 +48,8 @@ #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface" #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
+typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
/*
- Buffers to hold input and output data
*/ @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf); void usbtty_poll (void);
/* utility function for converting char* to wide string used by USB */ -static void str2wide (char *str, u16 * wide) +static void str2wide (char *str, void *wide) { int i;
- __le16_packed *tmp = wide; for (i = 0; i < strlen (str) && str[i]; i++){ #if defined(__LITTLE_ENDIAN)
wide[i] = (u16) str[i];
#elif defined(__BIG_ENDIAN)tmp[i].val = (u16) str[i];
wide[i] = ((u16)(str[i])<<8);
#else #error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined" #endiftmp[i].val = ((u16)(str[i])<<8);
We generally don't want packed structs and do need to disable this warning in general. Is this _really_ a problem, or are we just silencing the compiler here? Thanks!
The change makes just silence for the warnings as like composite.c in usb gadget.
Regards, - Seung-Woo Kim

On Wed, Jan 08, 2020 at 09:32:03AM +0900, Seung-Woo Kim wrote:
Hi,
On 2020년 01월 07일 22:22, Tom Rini wrote:
On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:
...
drivers/serial/usbtty.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index f1c1a260da..54e67dd0d1 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -48,6 +48,8 @@ #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface" #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
+typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
/*
- Buffers to hold input and output data
*/ @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf); void usbtty_poll (void);
/* utility function for converting char* to wide string used by USB */ -static void str2wide (char *str, u16 * wide) +static void str2wide (char *str, void *wide) { int i;
- __le16_packed *tmp = wide; for (i = 0; i < strlen (str) && str[i]; i++){ #if defined(__LITTLE_ENDIAN)
wide[i] = (u16) str[i];
#elif defined(__BIG_ENDIAN)tmp[i].val = (u16) str[i];
wide[i] = ((u16)(str[i])<<8);
#else #error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined" #endiftmp[i].val = ((u16)(str[i])<<8);
We generally don't want packed structs and do need to disable this warning in general. Is this _really_ a problem, or are we just silencing the compiler here? Thanks!
The change makes just silence for the warnings as like composite.c in usb gadget.
OK, thanks. NAK on this and I will pick up the general change to disable this warning soon.
participants (2)
-
Seung-Woo Kim
-
Tom Rini