From c6a14aa9bfa380eb8d2f761de80732c3e565ed4c Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Fri, 11 Aug 2017 17:49:28 +0530 Subject: [PATCH] arm: provision page alloc debug support Equip arm to support ARCH_SUPPORTS_DEBUG_PAGEALLOC and enable it by default. Having this support means all pages freed at buddy level would be marked as read-only and would help catch any scribbling over free page area. Allocated pages mapping attributes is restored to read/write. ARCH_SUPPORTS_DEBUG_PAGEALLOC needs FORCE_PAGES which ensures all kernel mapping are populated with page granularity and it would ensure page level accesses can be rightly configured. Change-Id: I9b23d1fb0b9594cc148b082c104da9a773c26057 Signed-off-by: Shiraz Hashim Signed-off-by: Charan Teja Reddy Signed-off-by: Vijayanand Jitta Signed-off-by: Qingqing Zhou --- arch/arm/Kconfig.debug | 4 ++++ arch/arm/mm/pageattr.c | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 6413c70c94a0..908022d60dfb 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -92,6 +92,10 @@ config DEBUG_USER 8 - SIGSEGV faults 16 - SIGBUS faults +config ARCH_SUPPORTS_DEBUG_PAGEALLOC + def_bool y + depends on FORCE_PAGES + config FORCE_PAGES bool "Force lowmem to be mapped with 4K pages" help diff --git a/arch/arm/mm/pageattr.c b/arch/arm/mm/pageattr.c index 86e441bad6e3..365dc9d7756c 100644 --- a/arch/arm/mm/pageattr.c +++ b/arch/arm/mm/pageattr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2014,2017-2018 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -98,3 +98,19 @@ int set_memory_x(unsigned long addr, int numpages) __pgprot(0), __pgprot(L_PTE_XN)); } + +#ifdef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC +void __kernel_map_pages(struct page *page, int numpages, int enable) +{ + unsigned long addr; + + if (PageHighMem(page)) + return; + + addr = (unsigned long) page_address(page); + if (enable) + set_memory_rw(addr, numpages); + else + set_memory_ro(addr, numpages); +} +#endif