diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-10-02 14:54:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-10-02 14:54:16 -0400 |
commit | 5634347dee31373a8faf084f4cdbf6d5ea0b03a4 (patch) | |
tree | 1ff99fa3cbdd23eb25dcb5a4f83e27389f61786b | |
parent | b55a97e759c9e9efdce0470f520026383c514a13 (diff) | |
parent | ee556d00cf20012e889344a0adbbf809ab5015a3 (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.h | 4 | ||||
-rw-r--r-- | arch/arm64/kernel/entry-ftrace.S | 22 |
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) | |||
496 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 496 | static 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) | |||
178 | ENDPROC(ftrace_stub) | 178 | ENDPROC(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 | */ |
206 | ENTRY(return_to_handler) | 224 | ENTRY(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 |
213 | END(return_to_handler) | 231 | END(return_to_handler) |
214 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 232 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |