| From 864aa04cd02979c2c755cb28b5f4fe56039171c0 Mon Sep 17 00:00:00 2001 |
| From: Will Deacon <will.deacon@arm.com> |
| Date: Tue, 18 Sep 2012 19:18:35 +0100 |
| Subject: ARM: mm: use pteval_t to represent page protection values |
| |
| From: Will Deacon <will.deacon@arm.com> |
| |
| commit 864aa04cd02979c2c755cb28b5f4fe56039171c0 upstream. |
| |
| When updating the page protection map after calculating the user_pgprot |
| value, the base protection map is temporarily stored in an unsigned long |
| type, causing truncation of the protection bits when LPAE is enabled. |
| This effectively means that calls to mprotect() will corrupt the upper |
| page attributes, clearing the XN bit unconditionally. |
| |
| This patch uses pteval_t to store the intermediate protection values, |
| preserving the upper bits for 64-bit descriptors. |
| |
| Acked-by: Nicolas Pitre <nico@linaro.org> |
| Acked-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Will Deacon <will.deacon@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/mm/mmu.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/arm/mm/mmu.c |
| +++ b/arch/arm/mm/mmu.c |
| @@ -488,7 +488,7 @@ static void __init build_mem_type_table( |
| #endif |
| |
| for (i = 0; i < 16; i++) { |
| - unsigned long v = pgprot_val(protection_map[i]); |
| + pteval_t v = pgprot_val(protection_map[i]); |
| protection_map[i] = __pgprot(v | user_pgprot); |
| } |
| |