mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	the path in the example cmd is out of date, and the path for now is also mentioned in the same file Signed-off-by: Perr Zhang <strongbox8@zoho.com> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
Too many problems poped 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/asm/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.
 |