diff options
author | David Daney <ddaney@caviumnetworks.com> | 2009-09-02 18:47:34 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-09-17 14:07:52 -0400 |
commit | 2ca2ebfd952d0338a0972c1f1f56b9b0c1a3b09c (patch) | |
tree | 6a43cd0634d9eb6d2fd1247b89b309d97095d698 /arch/mips/mm/fault.c | |
parent | e0cc87f59490d7d62a8ab2a76498dc8a2b64927a (diff) |
MIPS: Don't corrupt page tables on vmalloc fault.
The code after the vmalloc_fault: label in do_page_fault() modifies
user page tables, this is not correct for 64-bit kernels.
For 64-bit kernels we should go straight to the no_context handler
skipping vmalloc_fault.
Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mm/fault.c')
-rw-r--r-- | arch/mips/mm/fault.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index f956ecbb8136..e97a7a2fb2c0 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c | |||
@@ -58,11 +58,17 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, | |||
58 | * only copy the information from the master page table, | 58 | * only copy the information from the master page table, |
59 | * nothing more. | 59 | * nothing more. |
60 | */ | 60 | */ |
61 | #ifdef CONFIG_64BIT | ||
62 | # define VMALLOC_FAULT_TARGET no_context | ||
63 | #else | ||
64 | # define VMALLOC_FAULT_TARGET vmalloc_fault | ||
65 | #endif | ||
66 | |||
61 | if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END)) | 67 | if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END)) |
62 | goto vmalloc_fault; | 68 | goto VMALLOC_FAULT_TARGET; |
63 | #ifdef MODULE_START | 69 | #ifdef MODULE_START |
64 | if (unlikely(address >= MODULE_START && address < MODULE_END)) | 70 | if (unlikely(address >= MODULE_START && address < MODULE_END)) |
65 | goto vmalloc_fault; | 71 | goto VMALLOC_FAULT_TARGET; |
66 | #endif | 72 | #endif |
67 | 73 | ||
68 | /* | 74 | /* |
@@ -203,6 +209,7 @@ do_sigbus: | |||
203 | force_sig_info(SIGBUS, &info, tsk); | 209 | force_sig_info(SIGBUS, &info, tsk); |
204 | 210 | ||
205 | return; | 211 | return; |
212 | #ifndef CONFIG_64BIT | ||
206 | vmalloc_fault: | 213 | vmalloc_fault: |
207 | { | 214 | { |
208 | /* | 215 | /* |
@@ -241,4 +248,5 @@ vmalloc_fault: | |||
241 | goto no_context; | 248 | goto no_context; |
242 | return; | 249 | return; |
243 | } | 250 | } |
251 | #endif | ||
244 | } | 252 | } |