| ================ |
| Memory alignment |
| ================ |
| |
| Too many problems popped up because of unnoticed misaligned memory access in |
| kernel code lately. Therefore the alignment fixup is now unconditionally |
| configured in for SA11x0 based targets. According to Alan Cox, this is a |
| bad idea to configure it out, but Russell King has some good reasons for |
| doing so on some f***ed up ARM architectures like the EBSA110. However |
| this is not the case on many design I'm aware of, like all SA11x0 based |
| ones. |
| |
| Of course this is a bad idea to rely on the alignment trap to perform |
| unaligned memory access in general. If those access are predictable, you |
| are better to use the macros provided by include/linux/unaligned.h. The |
| alignment trap can fixup misaligned access for the exception cases, but at |
| a high performance cost. It better be rare. |
| |
| Now for user space applications, it is possible to configure the alignment |
| trap to SIGBUS any code performing unaligned access (good for debugging bad |
| code), or even fixup the access by software like for kernel code. The later |
| mode isn't recommended for performance reasons (just think about the |
| floating point emulation that works about the same way). Fix your code |
| instead! |
| |
| Please note that randomly changing the behaviour without good thought is |
| real bad - it changes the behaviour of all unaligned instructions in user |
| space, and might cause programs to fail unexpectedly. |
| |
| To change the alignment trap behavior, simply echo a number into |
| /proc/cpu/alignment. The number is made up from various bits: |
| |
| === ======================================================== |
| bit behavior when set |
| === ======================================================== |
| 0 A user process performing an unaligned memory access |
| will cause the kernel to print a message indicating |
| process name, pid, pc, instruction, address, and the |
| fault code. |
| |
| 1 The kernel will attempt to fix up the user process |
| performing the unaligned access. This is of course |
| slow (think about the floating point emulator) and |
| not recommended for production use. |
| |
| 2 The kernel will send a SIGBUS signal to the user process |
| performing the unaligned access. |
| === ======================================================== |
| |
| Note that not all combinations are supported - only values 0 through 5. |
| (6 and 7 don't make sense). |
| |
| For example, the following will turn on the warnings, but without |
| fixing up or sending SIGBUS signals:: |
| |
| echo 1 > /proc/cpu/alignment |
| |
| You can also read the content of the same file to get statistical |
| information on unaligned access occurrences plus the current mode of |
| operation for user space code. |
| |
| |
| Nicolas Pitre, Mar 13, 2001. Modified Russell King, Nov 30, 2001. |