diff options
author | Philip Derrin <philip@cog.systems> | 2017-11-13 18:55:26 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2017-11-21 10:10:07 -0500 |
commit | 3b0c0c922ff4be275a8beb87ce5657d16f355b54 (patch) | |
tree | c12be9315a645c400e1e62b91158237be85eb6d0 | |
parent | 29337b60ab5d2a499847c26d45e3cb81f62c2f26 (diff) |
ARM: 8721/1: mm: dump: check hardware RO bit for LPAE
When CONFIG_ARM_LPAE is set, the PMD dump relies on the software
read-only bit to determine whether a page is writable. This
concealed a bug which left the kernel text section writable
(AP2=0) while marked read-only in the software bit.
In a kernel with the AP2 bug, the dump looks like this:
---[ Kernel Mapping ]---
0xc0000000-0xc0200000 2M RW NX SHD
0xc0200000-0xc0600000 4M ro x SHD
0xc0600000-0xc0800000 2M ro NX SHD
0xc0800000-0xc4800000 64M RW NX SHD
The fix is to check that the software and hardware bits are both
set before displaying "ro". The dump then shows the true perms:
---[ Kernel Mapping ]---
0xc0000000-0xc0200000 2M RW NX SHD
0xc0200000-0xc0600000 4M RW x SHD
0xc0600000-0xc0800000 2M RW NX SHD
0xc0800000-0xc4800000 64M RW NX SHD
Fixes: ded947798469 ("ARM: 8109/1: mm: Modify pte_write and pmd_write logic for LPAE")
Signed-off-by: Philip Derrin <philip@cog.systems>
Tested-by: Neil Dick <neil@cog.systems>
Reviewed-by: Kees Cook <keescook@chromium.org>
Cc: stable@vger.kernel.org
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | arch/arm/mm/dump.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c index 35ff45470dbf..fc3b44028cfb 100644 --- a/arch/arm/mm/dump.c +++ b/arch/arm/mm/dump.c | |||
@@ -129,8 +129,8 @@ static const struct prot_bits section_bits[] = { | |||
129 | .val = PMD_SECT_USER, | 129 | .val = PMD_SECT_USER, |
130 | .set = "USR", | 130 | .set = "USR", |
131 | }, { | 131 | }, { |
132 | .mask = L_PMD_SECT_RDONLY, | 132 | .mask = L_PMD_SECT_RDONLY | PMD_SECT_AP2, |
133 | .val = L_PMD_SECT_RDONLY, | 133 | .val = L_PMD_SECT_RDONLY | PMD_SECT_AP2, |
134 | .set = "ro", | 134 | .set = "ro", |
135 | .clear = "RW", | 135 | .clear = "RW", |
136 | #elif __LINUX_ARM_ARCH__ >= 6 | 136 | #elif __LINUX_ARM_ARCH__ >= 6 |