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 <shashim@codeaurora.org>
Signed-off-by: Charan Teja Reddy <charante@codeaurora.org>
Signed-off-by: Vijayanand Jitta <vjitta@codeaurora.org>
Signed-off-by: Qingqing Zhou <qqzhou@codeaurora.org>
This commit is contained in:
Shiraz Hashim
2017-08-11 17:49:28 +05:30
committed by Gerrit - the friendly Code Review server
parent 63090e2763
commit c6a14aa9bf
2 changed files with 21 additions and 1 deletions

View File

@@ -92,6 +92,10 @@ config DEBUG_USER
8 - SIGSEGV faults 8 - SIGSEGV faults
16 - SIGBUS faults 16 - SIGBUS faults
config ARCH_SUPPORTS_DEBUG_PAGEALLOC
def_bool y
depends on FORCE_PAGES
config FORCE_PAGES config FORCE_PAGES
bool "Force lowmem to be mapped with 4K pages" bool "Force lowmem to be mapped with 4K pages"
help help

View File

@@ -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 * 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 * 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(0),
__pgprot(L_PTE_XN)); __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