diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-20 09:18:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-20 09:18:51 -0400 |
commit | dcb30e659287a6b40dafed1362532da42ec27229 (patch) | |
tree | b5f74a4b605c59bcef144cbe248879b00e99690c /arch | |
parent | 7b9e3a6ac00be4f3d654a711573b1794b046c22f (diff) | |
parent | 25804e6a96681d5d2142058948e218999e4f547c (diff) |
Merge tag 'arm64-stable' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64
Pull ARM64 fixes from Catalin Marinas:
- Compat register fault reporting fix
- Documentation clarification on tagged pointers
- hwcap widened to 64-bit (user space already reading it as 64-bit)
* tag 'arm64-stable' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64:
arm64: Widen hwcap to be 64 bit
arm64: Correctly report LR and SP for compat tasks
arm64: documentation: tighten up tagged pointer documentation
arm64: Make do_bad_area() function static
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm64/include/asm/hwcap.h | 2 | ||||
-rw-r--r-- | arch/arm64/kernel/process.c | 21 | ||||
-rw-r--r-- | arch/arm64/kernel/setup.c | 2 | ||||
-rw-r--r-- | arch/arm64/mm/fault.c | 2 |
4 files changed, 19 insertions, 8 deletions
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h index 6d4482fa35bc..e2950b098e76 100644 --- a/arch/arm64/include/asm/hwcap.h +++ b/arch/arm64/include/asm/hwcap.h | |||
@@ -43,6 +43,6 @@ | |||
43 | COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ | 43 | COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ |
44 | COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV) | 44 | COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV) |
45 | 45 | ||
46 | extern unsigned int elf_hwcap; | 46 | extern unsigned long elf_hwcap; |
47 | #endif | 47 | #endif |
48 | #endif | 48 | #endif |
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index 57fb55c44c90..7ae8a1f00c3c 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c | |||
@@ -143,15 +143,26 @@ void machine_restart(char *cmd) | |||
143 | 143 | ||
144 | void __show_regs(struct pt_regs *regs) | 144 | void __show_regs(struct pt_regs *regs) |
145 | { | 145 | { |
146 | int i; | 146 | int i, top_reg; |
147 | u64 lr, sp; | ||
148 | |||
149 | if (compat_user_mode(regs)) { | ||
150 | lr = regs->compat_lr; | ||
151 | sp = regs->compat_sp; | ||
152 | top_reg = 12; | ||
153 | } else { | ||
154 | lr = regs->regs[30]; | ||
155 | sp = regs->sp; | ||
156 | top_reg = 29; | ||
157 | } | ||
147 | 158 | ||
148 | show_regs_print_info(KERN_DEFAULT); | 159 | show_regs_print_info(KERN_DEFAULT); |
149 | print_symbol("PC is at %s\n", instruction_pointer(regs)); | 160 | print_symbol("PC is at %s\n", instruction_pointer(regs)); |
150 | print_symbol("LR is at %s\n", regs->regs[30]); | 161 | print_symbol("LR is at %s\n", lr); |
151 | printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n", | 162 | printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n", |
152 | regs->pc, regs->regs[30], regs->pstate); | 163 | regs->pc, lr, regs->pstate); |
153 | printk("sp : %016llx\n", regs->sp); | 164 | printk("sp : %016llx\n", sp); |
154 | for (i = 29; i >= 0; i--) { | 165 | for (i = top_reg; i >= 0; i--) { |
155 | printk("x%-2d: %016llx ", i, regs->regs[i]); | 166 | printk("x%-2d: %016llx ", i, regs->regs[i]); |
156 | if (i % 2 == 0) | 167 | if (i % 2 == 0) |
157 | printk("\n"); | 168 | printk("\n"); |
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 12ad8f3d0cfd..055cfb80e05c 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
@@ -57,7 +57,7 @@ | |||
57 | unsigned int processor_id; | 57 | unsigned int processor_id; |
58 | EXPORT_SYMBOL(processor_id); | 58 | EXPORT_SYMBOL(processor_id); |
59 | 59 | ||
60 | unsigned int elf_hwcap __read_mostly; | 60 | unsigned long elf_hwcap __read_mostly; |
61 | EXPORT_SYMBOL_GPL(elf_hwcap); | 61 | EXPORT_SYMBOL_GPL(elf_hwcap); |
62 | 62 | ||
63 | static const char *cpu_name; | 63 | static const char *cpu_name; |
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 6d6acf153bff..c23751b06120 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c | |||
@@ -130,7 +130,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr, | |||
130 | force_sig_info(sig, &si, tsk); | 130 | force_sig_info(sig, &si, tsk); |
131 | } | 131 | } |
132 | 132 | ||
133 | void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) | 133 | static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) |
134 | { | 134 | { |
135 | struct task_struct *tsk = current; | 135 | struct task_struct *tsk = current; |
136 | struct mm_struct *mm = tsk->active_mm; | 136 | struct mm_struct *mm = tsk->active_mm; |