aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-10-02 14:54:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-10-02 14:54:16 -0400
commit5634347dee31373a8faf084f4cdbf6d5ea0b03a4 (patch)
tree1ff99fa3cbdd23eb25dcb5a4f83e27389f61786b
parentb55a97e759c9e9efdce0470f520026383c514a13 (diff)
parentee556d00cf20012e889344a0adbbf809ab5015a3 (diff)
Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 fixes from Catalin Marinas: - Fix for transparent huge page change_protection() logic which was inadvertently changing a huge pmd page into a pmd table entry. - Function graph tracer panic fix caused by the return_to_handler code corrupting the multi-regs function return value (composite types). * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: ftrace: fix function_graph tracer panic arm64: Fix THP protection change logic
-rw-r--r--arch/arm64/include/asm/pgtable.h4
-rw-r--r--arch/arm64/kernel/entry-ftrace.S22
2 files changed, 22 insertions, 4 deletions
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index b0329be95cb1..26b066690593 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -79,7 +79,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
79#define PAGE_S2 __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY) 79#define PAGE_S2 __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY)
80#define PAGE_S2_DEVICE __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_UXN) 80#define PAGE_S2_DEVICE __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_UXN)
81 81
82#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_PXN | PTE_UXN) 82#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_PXN | PTE_UXN)
83#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE) 83#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
84#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE) 84#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE)
85#define PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) 85#define PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
@@ -496,7 +496,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr)
496static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) 496static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
497{ 497{
498 const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | 498 const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY |
499 PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK; 499 PTE_PROT_NONE | PTE_VALID | PTE_WRITE;
500 /* preserve the hardware dirty information */ 500 /* preserve the hardware dirty information */
501 if (pte_hw_dirty(pte)) 501 if (pte_hw_dirty(pte))
502 pte = pte_mkdirty(pte); 502 pte = pte_mkdirty(pte);
diff --git a/arch/arm64/kernel/entry-ftrace.S b/arch/arm64/kernel/entry-ftrace.S
index 08cafc518b9a..0f03a8fe2314 100644
--- a/arch/arm64/kernel/entry-ftrace.S
+++ b/arch/arm64/kernel/entry-ftrace.S
@@ -178,6 +178,24 @@ ENTRY(ftrace_stub)
178ENDPROC(ftrace_stub) 178ENDPROC(ftrace_stub)
179 179
180#ifdef CONFIG_FUNCTION_GRAPH_TRACER 180#ifdef CONFIG_FUNCTION_GRAPH_TRACER
181 /* save return value regs*/
182 .macro save_return_regs
183 sub sp, sp, #64
184 stp x0, x1, [sp]
185 stp x2, x3, [sp, #16]
186 stp x4, x5, [sp, #32]
187 stp x6, x7, [sp, #48]
188 .endm
189
190 /* restore return value regs*/
191 .macro restore_return_regs
192 ldp x0, x1, [sp]
193 ldp x2, x3, [sp, #16]
194 ldp x4, x5, [sp, #32]
195 ldp x6, x7, [sp, #48]
196 add sp, sp, #64
197 .endm
198
181/* 199/*
182 * void ftrace_graph_caller(void) 200 * void ftrace_graph_caller(void)
183 * 201 *
@@ -204,11 +222,11 @@ ENDPROC(ftrace_graph_caller)
204 * only when CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST is enabled. 222 * only when CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST is enabled.
205 */ 223 */
206ENTRY(return_to_handler) 224ENTRY(return_to_handler)
207 str x0, [sp, #-16]! 225 save_return_regs
208 mov x0, x29 // parent's fp 226 mov x0, x29 // parent's fp
209 bl ftrace_return_to_handler// addr = ftrace_return_to_hander(fp); 227 bl ftrace_return_to_handler// addr = ftrace_return_to_hander(fp);
210 mov x30, x0 // restore the original return address 228 mov x30, x0 // restore the original return address
211 ldr x0, [sp], #16 229 restore_return_regs
212 ret 230 ret
213END(return_to_handler) 231END(return_to_handler)
214#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ 232#endif /* CONFIG_FUNCTION_GRAPH_TRACER */