usb: fix unaligned access in device_qual()
PATCH 1/1 usb: fix unaligned access in device_qual()
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER: usb_dnl_dfu
data abort
MAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]
sp : 8ef40d18 ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 : 8ef40f38
r7 : 8ef4aae8 r6 : 0000000a r5 : 8ef4ab28 r4 : 8ef4ab80
r3 : 0000000a r2 : 00000006 r1 : 00000006 r0 : 8ef4aae8
Flags: Nzcv IRQs off FIQs on Mode SVC_32
Resetting CPU ...
reason is that in the "struct usb_composite_dev" the "struct usb_device_descriptor desc;" is on an odd address, and this struct gets accessed in drivers/usb/gadget/composite.c device_qual()
Fix it, by align this var "struct desc" fix to an aligned address.
--- include/linux/usb/composite.h | 2 +-
1 Datei ge?ndert, 1 Zeile hinzugef?gt(+), 1 Zeile entfernt(-)
include/linux/usb/composite.h +1 -1
@@ -331,7 +331,7 @@ struct usb_composite_dev {/* private: */ /* internals */ unsigned int suspended:1; -struct usb_device_descriptor desc; +struct usb_device_descriptor __aligned(CONFIG_SYS_CACHELINE_SIZE) desc;struct list_head configs;struct usb_composite_driver *driver;u8 next_string_id;
Signature · 1 line
1.7.11.7
PATCH 1/1 usb: fix unaligned access in device_qual()
Hi Heiko,
Quoted 17 lines · Heiko Schocher
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER:
usb_dnl_dfu
data abortMAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]sp :
8ef40d18ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 :8ef40f38
r7 :8ef4aae8r6 :0000000ar5 :8ef4ab28r4 :8ef4ab80
r3 :0000000ar2 : 00000006 r1 : 00000006 r0 :8ef4aae8
Flags: Nzcv IRQs off FIQs on ModeSVC_32
Resetting CPU ...
Quoted 7 lines
reason is that in the "struct
usb_composite_dev" the "structusb_device_descriptordesc;" is on an odd address, and this struct gets accessed indrivers/usb/gadget/composite.cdevice_qual()Fix it, by align this var "struct desc" fix to an aligned address.
Please keep the commit message to a minimum -- what is wrong and how it is fixed -- and move the rest (context and additional details) after the commit message separator ('---' below).
Quoted 12 lines
Signed-off-by Heiko Schocher <[email protected]>Cc Marek Vasut <[email protected]>Cc Samuel Egli <[email protected]>--- include/linux/usb/composite.h | 2 +-1 Datei ge?ndert, 1 Zeile hinzugef?gt(+), 1 Zeile entfernt(-)
include/linux/usb/composite.h +0
-0
include/linux/usb/composite.h struct usb_composite_dev { · line 337
Quoted 8 lines
include/linux/usb/composite.h +1
-1@@ -331,7 +331,7 @@ struct usb_composite_dev {/* private: */ /* internals */ unsigned int suspended:1; -struct usb_device_descriptor desc; +struct usb_device_descriptor __aligned(CONFIG_SYS_CACHELINE_SIZE) desc;struct list_head configs;struct usb_composite_driver *driver;u8 next_string_id;
Amicalement,
Signature · 1 line
Albert.
PATCH 1/1 usb: fix unaligned access in device_qual()
Hi Albert,
Quoted 22 lines · Albert ARIBAUD
Quoted 22 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER:
usb_dnl_dfu
data abortMAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]sp :
8ef40d18ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 :8ef40f38
r7 :8ef4aae8r6 :0000000ar5 :8ef4ab28r4 :8ef4ab80
r3 :0000000ar2 : 00000006 r1 : 00000006 r0 :8ef4aae8
Flags: Nzcv IRQs off FIQs on ModeSVC_32
Resetting CPU ...reason is that in the "struct
usb_composite_dev" the "structusb_device_descriptordesc;" is on an odd address, and this struct gets accessed indrivers/usb/gadget/composite.cdevice_qual()
Quoted 6 lines
Quoted 2 lines
Fix it, by align this var "struct desc" fix to an aligned address.
Please keep the commit message to a minimum -- what is wrong and how it is fixed -- and move the rest (context and additional details) after the commit message separator ('---' below).
I personally find this expanded description quite helpful. Everything below the "---" line is removed from the git history. So +1 for this expanded description from me.
Thanks,
Stefan
PATCH 1/1 usb: fix unaligned access in device_qual()
Dear Stefan Roese,
Quoted 28 lines
Hi Albert,
Quoted 25 lines · Albert ARIBAUD
Quoted 24 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER:
usb_dnl_dfu
data abortMAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]sp :
8ef40d18ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 :8ef40f38
r7 :8ef4aae8r6 :0000000ar5 :8ef4ab28r4 :8ef4ab80
r3 :0000000ar2 : 00000006 r1 : 00000006 r0 :8ef4aae8
Flags: Nzcv IRQs off FIQs on ModeSVC_32
Resetting CPU ...reason is that in the "struct
usb_composite_dev" the "structusb_device_descriptordesc;" is on an odd address, and this struct gets accessed indrivers/usb/gadget/composite.cdevice_qual()Fix it, by align this var "struct desc" fix to an aligned address.
Quoted 7 lines
Quoted 3 lines
Please keep the commit message to a minimum -- what is wrong and how it is fixed -- and move the rest (context and additional details) after the commit message separator ('---' below).
I personally find this expanded description quite helpful. Everything below the "---" line is removed from the git history. So +1 for this expanded description from me.
Agreed
Best regards,
Marek Vasut
PATCH 1/1 usb: fix unaligned access in device_qual()
In reply to Stefan RoeseHi Stefan,
Quoted 27 lines · Stefan Roese
Hi Albert,
Quoted 24 lines · Albert ARIBAUD
Quoted 24 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER:
usb_dnl_dfu
data abortMAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]sp :
8ef40d18ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 :8ef40f38
r7 :8ef4aae8r6 :0000000ar5 :8ef4ab28r4 :8ef4ab80
r3 :0000000ar2 : 00000006 r1 : 00000006 r0 :8ef4aae8
Flags: Nzcv IRQs off FIQs on ModeSVC_32
Resetting CPU ...reason is that in the "struct
usb_composite_dev" the "structusb_device_descriptordesc;" is on an odd address, and this struct gets accessed indrivers/usb/gadget/composite.cdevice_qual()Fix it, by align this var "struct desc" fix to an aligned address.
Slow thinking: if the issue is "odd address", why align using cache-related constant? Alignment should just be to even address -- maybe even 4-byte alignment, to be checked.
Quoted 7 lines
Quoted 3 lines
Please keep the commit message to a minimum -- what is wrong and how it is fixed -- and move the rest (context and additional details) after the commit message separator ('---' below).
I personally find this expanded description quite helpful. Everything below the "---" line is removed from the git history. So +1 for this expanded description from me.
I am not against an expanded explanation of the why and how of the patch; but here, the console output copy, as well as the anecdote about the circumstances which led to discovering the bug, only add noise to the commit -- they're good for discussion the patch, hence my suggestion. The commit message is just as informative when spelled out thus:
----- 8< -----
usb: fix unaligned access in device_qual()
File include/linux/usb/composite.h contains struct usb_composite_dev in which field 'desc' is misaligned, causing an alignment data abort in function device_qual() in file drivers/usb/gadget/composite.c.
Fixed by forcing 'desc' field alignment to {even,4-byte} address.
[...]
---
When doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
GADGET DRIVER: usb_dnl_dfu
data abort
MAYBE you should read doc/README.arm-unaligned-accesses
pc : [<8ff71db8>] lr : [<8ff75aec>]
sp : 8ef40d18 ip : 00000005 fp : 00000000
r10: 00000000 r9 : 47401410 r8 : 8ef40f38
r7 : 8ef4aae8 r6 : 0000000a r5 : 8ef4ab28 r4 : 8ef4ab80
r3 : 0000000a r2 : 00000006 r1 : 00000006 r0 : 8ef4aae8
Flags: Nzcv IRQs off FIQs on Mode SVC_32
Resetting CPU ...
[...]
----- 8< -----
Quoted 2 lines
Thanks,
Stefan
Amicalement,
Signature · 1 line
Albert.
Marek Vasut
AppliedPATCH 1/1 usb: fix unaligned access in device_qual()
In reply to Heiko SchocherDear Heiko Schocher,
Quoted 3 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
Applied, thanks
btw you can send this stuff to my @denx address, it's much more convenient for me.
Best regards,
Marek Vasut
PATCH 1/1 usb: fix unaligned access in device_qual()
Hi Marek,
Quoted 7 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 3 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v" I get on the board:
Applied, thanks
Now we have console log output in commit messages. :(
Amicalement,
Signature · 1 line
Albert.
PATCH 1/1 usb: fix unaligned access in device_qual()
Hello Albert,
Quoted 5 lines
Hi Marek,
Quoted 2 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v"
I get on the board:
Applied, thanks
Now we have console log output in commit messages. :(
Don't be sad, I will buy you a tartelette ;)
Best regards,
Marek Vasut
PATCH 1/1 usb: fix unaligned access in device_qual()
Hi Marek,
Quoted 10 lines · Marek Vasut
Hello Albert,
Quoted 8 lines
Hi Marek,
Quoted 5 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 2 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v"
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
Quoted 1 line
I get on the board:
Applied, thanks
Now we have console log output in commit messages. :(
Don't be sad, I will buy you a tartelette ;)
Actually the sad part is that the patch in itself is bad: the actual alignment boundary should have been 16 bit, not one cacheline. Also, the issue could / should have been solved by reordering the fields rather than using an attribute.
And I'm not going to eat a tartelette when I'm about 30 minutes from going to a restaurant (admittedly small, but undoubtedly near).
Quoted 2 lines
Best regards,
Marek Vasut
Amicalement,
Signature · 1 line
Albert.
PATCH 1/1 usb: fix unaligned access in device_qual()
Dear Albert ARIBAUD,
Quoted 16 lines
Hi Marek,
Quoted 13 lines · Marek Vasut
Hello Albert,
Quoted 11 lines
Hi Marek,
Quoted 7 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 4 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v"
I get on the board:
Applied, thanks
Quoted 8 lines
Quoted 3 lines
Quoted 1 line
Now we have console log output in commit messages. :(
Don't be sad, I will buy you a tartelette ;)
Actually the sad part is that the patch in itself is bad: the actual alignment boundary should have been 16 bit, not one cacheline. Also, the issue could / should have been solved by reordering the fields rather than using an attribute.
Why 16 bit? I think cacheline alignment here makes sense if the descriptor is to be flush()'d from dcache.
Quoted 2 lines
And I'm not going to eat a tartelette when I'm about 30 minutes from going to a restaurant (admittedly small, but undoubtedly near).
You should have one to survive the journey ;-)
Best regards,
Marek Vasut
PATCH 1/1 usb: fix unaligned access in device_qual()
Hi Marek,
Quoted 22 lines · Marek Vasut
Dear Albert ARIBAUD,
Quoted 20 lines
Hi Marek,
Quoted 16 lines · Marek Vasut
Hello Albert,
Quoted 5 lines
Hi Marek,
Quoted 2 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v"
I get on the board:
Applied, thanks
Now we have console log output in commit messages. :(
Don't be sad, I will buy you a tartelette ;)
Quoted 7 lines
Quoted 4 lines
Actually the sad part is that the patch in itself is bad: the actual alignment boundary should have been 16 bit, not one cacheline. Also, the issue could / should have been solved by reordering the fields rather than using an attribute.
Why 16 bit? I think cacheline alignment here makes sense if the descriptor is to be flush()'d from dcache.
If it is then it should be moved out of the struct it currently lives in, in order to avoid a big alignment gap, and replaced with a pointer. Also, the commit message would then be wrong...
Quoted 4 lines
Quoted 2 lines
And I'm not going to eat a tartelette when I'm about 30 minutes from going to a restaurant (admittedly small, but undoubtedly near).
You should have one to survive the journey ;-)
I'm more addicted to the raw stuff. No one should need anything beyond 90+%-cocoa chocolate.
Quoted 2 lines
Best regards,
Marek Vasut
Amicalement,
Signature · 1 line
Albert.
PATCH 1/1 usb: fix unaligned access in device_qual()
Dear Albert ARIBAUD,
Quoted 30 lines
Hi Marek,
Quoted 27 lines · Marek Vasut
Dear Albert ARIBAUD,
Quoted 24 lines
Hi Marek,
Quoted 10 lines · Marek Vasut
Hello Albert,
Quoted 8 lines
Hi Marek,
Quoted 5 lines · Marek Vasut
Dear Heiko Schocher,
Quoted 2 lines
while playing with dfu, I tapped in an unaligned access when doing on the host side a "lsusb -d [vendornr]: -v"
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
Quoted 1 line
I get on the board:
Applied, thanks
Now we have console log output in commit messages. :(
Don't be sad, I will buy you a tartelette ;)
Actually the sad part is that the patch in itself is bad: the actual alignment boundary should have been 16 bit, not one cacheline. Also, the issue could / should have been solved by reordering the fields rather than using an attribute.
Quoted 6 lines
Quoted 2 lines
Why 16 bit? I think cacheline alignment here makes sense if the descriptor is to be flush()'d from dcache.
If it is then it should be moved out of the struct it currently lives in, in order to avoid a big alignment gap, and replaced with a pointer. Also, the commit message would then be wrong...
Good point, Heiko, can you comment?
Best regards,
Marek Vasut