[PATCH 1/1] usb: avoid -Werror=address-of-packed-member
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Dec 17 12:14:00 CET 2019
On 12/17/19 11:00 AM, Marek Vasut wrote:
> On 12/17/19 10:27 AM, Heinrich Schuchardt wrote:
>> With GCC 9.2.1 errors of type -Werror=address-of-packed-member occur when
>> passing a member of a packed structure to le16_to_cpus() on a big endian
>> system (e.g. P2041RDB_defconfig).
>>
>> Replace le16_to_cpus() by get_unaligned_le16(). Check defined(__BIG_ENDIAN)
>> to avoid the introduction of unnecessary instructions on little endian
>> systems as seen on aarch64.
>
> I would expect the compiler would optimize such stuff out ?
> Can we do without the ifdef ?
When compiling qemu_arm64_defconfig without the #ifdef the GCC 9.2.1
adds assembler instructions:
/* correct le values */
dev->descriptor.bcdUSB =
48: 79020660 strh w0, [x19, #258]
4c: 39442660 ldrb w0, [x19, #265]
50: 2a002020 orr w0, w1, w0, lsl #8
54: 39442a61 ldrb w1, [x19, #266]
get_unaligned_le16(&dev->descriptor.bcdUSB);
dev->descriptor.idVendor =
58: 79021260 strh w0, [x19, #264]
5c: 39442e60 ldrb w0, [x19, #267]
60: 2a002020 orr w0, w1, w0, lsl #8
64: 39443261 ldrb w1, [x19, #268]
get_unaligned_le16(&dev->descriptor.idVendor);
dev->descriptor.idProduct =
68: 79021660 strh w0, [x19, #266]
6c: 39443660 ldrb w0, [x19, #269]
70: 2a002020 orr w0, w1, w0, lsl #8
get_unaligned_le16(&dev->descriptor.idProduct);
dev->descriptor.bcdDevice =
74: 79021a60 strh w0, [x19, #268]
udelay(1000 * msec);
78: d2807d00 mov x0, #0x3e8 // #1000
7c: 94000000 bl 0 <udelay>
* one microframe duration here (1mS for USB 1.x , 125uS for
USB 2.0).
*/
mdelay(1);
Best regards
Heinrich
More information about the U-Boot
mailing list