Skip to content

Commit e122eaf

Browse files
author
Haavard Skinnemoen
committed
[AVR32] Remove optimization of unaligned word loads
If we let unaligned word loads bypass the generic unaligned handling, gcc may combine it with a swap.b instruction and turn it into a ldwsp instruction, which does not work with unaligned addresses. Revert the optimization to prevent the RNDIS driver from crashing. Hopefully we'll figure something out later (it may be better to do the optimization in gcc.) Signed-off-by: Haavard Skinnemoen <[email protected]>
1 parent a8e93ed commit e122eaf

File tree

1 file changed

+3
-23
lines changed

1 file changed

+3
-23
lines changed

include/asm-avr32/unaligned.h

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,11 @@
66
* implementation. The AVR32 AP implementation can handle unaligned
77
* words, but halfwords must be halfword-aligned, and doublewords must
88
* be word-aligned.
9+
*
10+
* However, swapped word loads must be word-aligned so we can't
11+
* optimize word loads in general.
912
*/
1013

1114
#include <asm-generic/unaligned.h>
1215

13-
#ifdef CONFIG_CPU_AT32AP7000
14-
15-
/* REVISIT calling memmove() may be smaller for 64-bit values ... */
16-
17-
#undef get_unaligned
18-
#define get_unaligned(ptr) \
19-
___get_unaligned(ptr, sizeof((*ptr)))
20-
#define ___get_unaligned(ptr, size) \
21-
((size == 4) ? *(ptr) : __get_unaligned(ptr, size))
22-
23-
#undef put_unaligned
24-
#define put_unaligned(val, ptr) \
25-
___put_unaligned((__u64)(val), ptr, sizeof((*ptr)))
26-
#define ___put_unaligned(val, ptr, size) \
27-
do { \
28-
if (size == 4) \
29-
*(ptr) = (val); \
30-
else \
31-
__put_unaligned(val, ptr, size); \
32-
} while (0)
33-
34-
#endif
35-
3616
#endif /* __ASM_AVR32_UNALIGNED_H */

0 commit comments

Comments
 (0)