diff options
Diffstat (limited to 'arch/arm/mm/alignment.c')
| -rw-r--r-- | arch/arm/mm/alignment.c | 11 | 
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index b820edaf318..db26e2e543f 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c @@ -749,7 +749,6 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  	unsigned long instr = 0, instrptr;  	int (*handler)(unsigned long addr, unsigned long instr, struct pt_regs *regs);  	unsigned int type; -	mm_segment_t fs;  	unsigned int fault;  	u16 tinstr = 0;  	int isize = 4; @@ -760,16 +759,15 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  	instrptr = instruction_pointer(regs); -	fs = get_fs(); -	set_fs(KERNEL_DS);  	if (thumb_mode(regs)) { -		fault = __get_user(tinstr, (u16 *)(instrptr & ~1)); +		u16 *ptr = (u16 *)(instrptr & ~1); +		fault = probe_kernel_address(ptr, tinstr);  		if (!fault) {  			if (cpu_architecture() >= CPU_ARCH_ARMv7 &&  			    IS_T32(tinstr)) {  				/* Thumb-2 32-bit */  				u16 tinst2 = 0; -				fault = __get_user(tinst2, (u16 *)(instrptr+2)); +				fault = probe_kernel_address(ptr + 1, tinst2);  				instr = (tinstr << 16) | tinst2;  				thumb2_32b = 1;  			} else { @@ -778,8 +776,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)  			}  		}  	} else -		fault = __get_user(instr, (u32 *)instrptr); -	set_fs(fs); +		fault = probe_kernel_address(instrptr, instr);  	if (fault) {  		type = TYPE_FAULT;  |