 aeb3987683
			
		
	
	
	aeb3987683
	
	
	
		
			
			This is based upon a report from Chris Torek and his initial patch.
From Chris's report:
--------------------
This came up in testing kgdb, using the built-in tests -- turn
on CONFIG_KGDB_TESTS, then
    echo V1 > /sys/module/kgdbts/parameters/kgdbts
-- but it would affect using kgdb if you were debugging and looking
at bad pointers.
--------------------
When we get a copy_{from,to}_user() request and the %asi is set to
something other than ASI_AIUS (which is userspace) then we branch off
to a routine called memcpy_user_stub().  It just does a straight
memcpy since we are copying from kernel to kernel in this case.
The logic was that since source and destination are both kernel
pointers we don't need to have exception checks.
But for what probe_kernel_{read,write}() is trying to do, we have to
have the checks, otherwise things like kgdb bad kernel pointer
accesses don't do the right thing.
Signed-off-by: David S. Miller <davem@davemloft.net>
		
	
			
		
			
				
	
	
		
			29 lines
		
	
	
	
		
			720 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
	
		
			720 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* U1copy_from_user.S: UltraSparc-I/II/IIi/IIe optimized copy from userspace.
 | |
|  *
 | |
|  * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
 | |
|  */
 | |
| 
 | |
| #define EX_LD(x)		\
 | |
| 98:	x;			\
 | |
| 	.section __ex_table,"a";\
 | |
| 	.align 4;		\
 | |
| 	.word 98b, __retl_one;	\
 | |
| 	.text;			\
 | |
| 	.align 4;
 | |
| 
 | |
| #define FUNC_NAME		___copy_from_user
 | |
| #define LOAD(type,addr,dest)	type##a [addr] %asi, dest
 | |
| #define LOAD_BLK(addr,dest)	ldda [addr] ASI_BLK_AIUS, dest
 | |
| #define EX_RETVAL(x)		0
 | |
| 
 | |
| 	/* Writing to %asi is _expensive_ so we hardcode it.
 | |
| 	 * Reading %asi to check for KERNEL_DS is comparatively
 | |
| 	 * cheap.
 | |
| 	 */
 | |
| #define PREAMBLE					\
 | |
| 	rd		%asi, %g1;			\
 | |
| 	cmp		%g1, ASI_AIUS;			\
 | |
| 	bne,pn		%icc, ___copy_in_user;		\
 | |
| 	 nop;						\
 | |
| 
 | |
| #include "U1memcpy.S"
 |