
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