projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'tags/ib-asoc-1' into for-mfd-next
[firefly-linux-kernel-4.4.55.git]
/
arch
/
arm
/
kernel
/
traps.c
diff --git
a/arch/arm/kernel/traps.c
b/arch/arm/kernel/traps.c
index 8fcda140358d94d6056ea200b79b50bb6e7bde81..7940241f0576b0db1cc0a749e449c7faf492518a 100644
(file)
--- a/
arch/arm/kernel/traps.c
+++ b/
arch/arm/kernel/traps.c
@@
-34,6
+34,7
@@
#include <asm/unwind.h>
#include <asm/tls.h>
#include <asm/system_misc.h>
#include <asm/unwind.h>
#include <asm/tls.h>
#include <asm/system_misc.h>
+#include <asm/opcodes.h>
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
@@
-341,15
+342,17
@@
void arm_notify_die(const char *str, struct pt_regs *regs,
int is_valid_bugaddr(unsigned long pc)
{
#ifdef CONFIG_THUMB2_KERNEL
int is_valid_bugaddr(unsigned long pc)
{
#ifdef CONFIG_THUMB2_KERNEL
- unsigned short bkpt;
+ u16 bkpt;
+ u16 insn = __opcode_to_mem_thumb16(BUG_INSTR_VALUE);
#else
#else
- unsigned long bkpt;
+ u32 bkpt;
+ u32 insn = __opcode_to_mem_arm(BUG_INSTR_VALUE);
#endif
if (probe_kernel_address((unsigned *)pc, bkpt))
return 0;
#endif
if (probe_kernel_address((unsigned *)pc, bkpt))
return 0;
- return bkpt ==
BUG_INSTR_VALUE
;
+ return bkpt ==
insn
;
}
#endif
}
#endif
@@
-402,25
+405,28
@@
asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
if (processor_mode(regs) == SVC_MODE) {
#ifdef CONFIG_THUMB2_KERNEL
if (thumb_mode(regs)) {
if (processor_mode(regs) == SVC_MODE) {
#ifdef CONFIG_THUMB2_KERNEL
if (thumb_mode(regs)) {
- instr =
((u16 *)pc)[0]
;
+ instr =
__mem_to_opcode_thumb16(((u16 *)pc)[0])
;
if (is_wide_instruction(instr)) {
if (is_wide_instruction(instr)) {
- instr <<= 16;
- instr |= ((u16 *)pc)[1];
+ u16 inst2;
+ inst2 = __mem_to_opcode_thumb16(((u16 *)pc)[1]);
+ instr = __opcode_thumb32_compose(instr, inst2);
}
} else
#endif
}
} else
#endif
- instr =
*(u32 *) pc
;
+ instr =
__mem_to_opcode_arm(*(u32 *) pc)
;
} else if (thumb_mode(regs)) {
if (get_user(instr, (u16 __user *)pc))
goto die_sig;
} else if (thumb_mode(regs)) {
if (get_user(instr, (u16 __user *)pc))
goto die_sig;
+ instr = __mem_to_opcode_thumb16(instr);
if (is_wide_instruction(instr)) {
unsigned int instr2;
if (get_user(instr2, (u16 __user *)pc+1))
goto die_sig;
if (is_wide_instruction(instr)) {
unsigned int instr2;
if (get_user(instr2, (u16 __user *)pc+1))
goto die_sig;
- instr
<<= 16
;
- instr
|= instr2
;
+ instr
2 = __mem_to_opcode_thumb16(instr2)
;
+ instr
= __opcode_thumb32_compose(instr, instr2)
;
}
} else if (get_user(instr, (u32 __user *)pc)) {
}
} else if (get_user(instr, (u32 __user *)pc)) {
+ instr = __mem_to_opcode_arm(instr);
goto die_sig;
}
goto die_sig;
}
@@
-503,9
+509,10
@@
static inline int
__do_cache_op(unsigned long start, unsigned long end)
{
int ret;
__do_cache_op(unsigned long start, unsigned long end)
{
int ret;
- unsigned long chunk = PAGE_SIZE;
do {
do {
+ unsigned long chunk = min(PAGE_SIZE, end - start);
+
if (signal_pending(current)) {
struct thread_info *ti = current_thread_info();
if (signal_pending(current)) {
struct thread_info *ti = current_thread_info();
@@
-850,7
+857,7
@@
static void __init kuser_init(void *vectors)
memcpy(vectors + 0xfe0, vectors + 0xfe8, 4);
}
#else
memcpy(vectors + 0xfe0, vectors + 0xfe8, 4);
}
#else
-static void __init kuser_init(void *vectors)
+static
inline
void __init kuser_init(void *vectors)
{
}
#endif
{
}
#endif