|
@@ -25,6 +25,7 @@
|
|
|
#include <asm/cp15.h>
|
|
|
#include <asm/system_info.h>
|
|
|
#include <asm/unaligned.h>
|
|
|
+#include <asm/opcodes.h>
|
|
|
|
|
|
#include "fault.h"
|
|
|
|
|
@@ -762,21 +763,25 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|
|
if (thumb_mode(regs)) {
|
|
|
u16 *ptr = (u16 *)(instrptr & ~1);
|
|
|
fault = probe_kernel_address(ptr, tinstr);
|
|
|
+ tinstr = __mem_to_opcode_thumb16(tinstr);
|
|
|
if (!fault) {
|
|
|
if (cpu_architecture() >= CPU_ARCH_ARMv7 &&
|
|
|
IS_T32(tinstr)) {
|
|
|
/* Thumb-2 32-bit */
|
|
|
u16 tinst2 = 0;
|
|
|
fault = probe_kernel_address(ptr + 1, tinst2);
|
|
|
- instr = (tinstr << 16) | tinst2;
|
|
|
+ tinst2 = __mem_to_opcode_thumb16(tinst2);
|
|
|
+ instr = __opcode_thumb32_compose(tinstr, tinst2);
|
|
|
thumb2_32b = 1;
|
|
|
} else {
|
|
|
isize = 2;
|
|
|
instr = thumb2arm(tinstr);
|
|
|
}
|
|
|
}
|
|
|
- } else
|
|
|
+ } else {
|
|
|
fault = probe_kernel_address(instrptr, instr);
|
|
|
+ instr = __mem_to_opcode_arm(instr);
|
|
|
+ }
|
|
|
|
|
|
if (fault) {
|
|
|
type = TYPE_FAULT;
|