blob: aa22893b62bc342eb47e9a7e8caacc3e51c09112 [file] [log] [blame]
Mauro Carvalho Chehabdc7a12b2019-04-14 15:51:10 -03001================
2Memory alignment
3================
4
George G. Davis462e5a52019-06-05 16:30:10 -04005Too many problems popped up because of unnoticed misaligned memory access in
Linus Torvalds1da177e2005-04-16 15:20:36 -07006kernel code lately. Therefore the alignment fixup is now unconditionally
7configured in for SA11x0 based targets. According to Alan Cox, this is a
8bad idea to configure it out, but Russell King has some good reasons for
9doing so on some f***ed up ARM architectures like the EBSA110. However
10this is not the case on many design I'm aware of, like all SA11x0 based
11ones.
12
13Of course this is a bad idea to rely on the alignment trap to perform
14unaligned memory access in general. If those access are predictable, you
15are better to use the macros provided by include/asm/unaligned.h. The
16alignment trap can fixup misaligned access for the exception cases, but at
17a high performance cost. It better be rare.
18
19Now for user space applications, it is possible to configure the alignment
20trap to SIGBUS any code performing unaligned access (good for debugging bad
21code), or even fixup the access by software like for kernel code. The later
22mode isn't recommended for performance reasons (just think about the
23floating point emulation that works about the same way). Fix your code
24instead!
25
26Please note that randomly changing the behaviour without good thought is
27real bad - it changes the behaviour of all unaligned instructions in user
28space, and might cause programs to fail unexpectedly.
29
30To change the alignment trap behavior, simply echo a number into
Nicolas Pitre1ada1442008-12-15 03:09:15 +010031/proc/cpu/alignment. The number is made up from various bits:
Linus Torvalds1da177e2005-04-16 15:20:36 -070032
Mauro Carvalho Chehabdc7a12b2019-04-14 15:51:10 -030033=== ========================================================
Linus Torvalds1da177e2005-04-16 15:20:36 -070034bit behavior when set
Mauro Carvalho Chehabdc7a12b2019-04-14 15:51:10 -030035=== ========================================================
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 A user process performing an unaligned memory access
37 will cause the kernel to print a message indicating
38 process name, pid, pc, instruction, address, and the
39 fault code.
40
411 The kernel will attempt to fix up the user process
42 performing the unaligned access. This is of course
43 slow (think about the floating point emulator) and
44 not recommended for production use.
45
462 The kernel will send a SIGBUS signal to the user process
47 performing the unaligned access.
Mauro Carvalho Chehabdc7a12b2019-04-14 15:51:10 -030048=== ========================================================
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
50Note that not all combinations are supported - only values 0 through 5.
51(6 and 7 don't make sense).
52
53For example, the following will turn on the warnings, but without
Mauro Carvalho Chehabdc7a12b2019-04-14 15:51:10 -030054fixing up or sending SIGBUS signals::
Linus Torvalds1da177e2005-04-16 15:20:36 -070055
Perr Zhang7c2a3e92017-04-20 12:58:40 +080056 echo 1 > /proc/cpu/alignment
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
58You can also read the content of the same file to get statistical
59information on unaligned access occurrences plus the current mode of
60operation for user space code.
61
62
63Nicolas Pitre, Mar 13, 2001. Modified Russell King, Nov 30, 2001.