aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2013-05-18 15:34:30 -0400
committerChris Zankel <chris@zankel.net>2013-05-20 14:48:23 -0400
commit51fc41a90603eaee7b6d03b6027be8f22fcf8ef9 (patch)
tree87f240d64051f5747027e07592f0ec50cbdd4e37
parent7711ece9b31f0f3cf15ca16005dfd78988ea8f7e (diff)
xtensa: fix fast_store_prohibited _PAGE_WRITABLE_BIT test
Before _PAGE_WRITABLE_BIT test fast_store_prohibited must make sure that PTE is present. Otherwise 'writable' bit is undefined and may be reused in the 'file offset' or 'swap type' PTE fields. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Chris Zankel <chris@zankel.net>
-rw-r--r--arch/xtensa/kernel/entry.S7
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index 5082507d5631..fa94512ff84d 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -1792,10 +1792,15 @@ ENTRY(fast_store_prohibited)
1792 l32i a0, a0, 0 1792 l32i a0, a0, 0
1793 beqz a0, 2f 1793 beqz a0, 2f
1794 1794
1795 /* Note that we assume _PAGE_WRITABLE_BIT is only set if pte is valid.*/ 1795 /*
1796 * Note that we test _PAGE_WRITABLE_BIT only if PTE is present
1797 * and is not PAGE_NONE. See pgtable.h for possible PTE layouts.
1798 */
1796 1799
1797 _PTE_OFFSET(a0, a1, a4) 1800 _PTE_OFFSET(a0, a1, a4)
1798 l32i a4, a0, 0 # read pteval 1801 l32i a4, a0, 0 # read pteval
1802 movi a1, _PAGE_CA_INVALID
1803 ball a4, a1, 2f
1799 bbci.l a4, _PAGE_WRITABLE_BIT, 2f 1804 bbci.l a4, _PAGE_WRITABLE_BIT, 2f
1800 1805
1801 movi a1, _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_HW_WRITE 1806 movi a1, _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_HW_WRITE