|
@@ -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;
|