59 lines
		
	
	
	
		
			2.4 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			59 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/sys/debug/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/sys/debug/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.
							 |