Skip to content

Commit 58284a9

Browse files
Anshuman Khandualwilldeacon
authored andcommitted
arm64/mm: Validate hotplug range before creating linear mapping
During memory hotplug process, the linear mapping should not be created for a given memory range if that would fall outside the maximum allowed linear range. Else it might cause memory corruption in the kernel virtual space. Maximum linear mapping region is [PAGE_OFFSET..(PAGE_END -1)] accommodating both its ends but excluding PAGE_END. Max physical range that can be mapped inside this linear mapping range, must also be derived from its end points. This ensures that arch_add_memory() validates memory hot add range for its potential linear mapping requirements, before creating it with __create_pgd_mapping(). Fixes: 4ab2150 ("arm64: Add memory hotplug support") Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Steven Price <steven.price@arm.com> Cc: Robin Murphy <robin.murphy@arm.com> Cc: David Hildenbrand <david@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Link: https://lore.kernel.org/r/1605252614-761-1-git-send-email-anshuman.khandual@arm.com Signed-off-by: Will Deacon <will@kernel.org>
1 parent 04e613d commit 58284a9

1 file changed

Lines changed: 17 additions & 0 deletions

File tree

arch/arm64/mm/mmu.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,11 +1444,28 @@ static void __remove_pgd_mapping(pgd_t *pgdir, unsigned long start, u64 size)
14441444
free_empty_tables(start, end, PAGE_OFFSET, PAGE_END);
14451445
}
14461446

1447+
static bool inside_linear_region(u64 start, u64 size)
1448+
{
1449+
/*
1450+
* Linear mapping region is the range [PAGE_OFFSET..(PAGE_END - 1)]
1451+
* accommodating both its ends but excluding PAGE_END. Max physical
1452+
* range which can be mapped inside this linear mapping range, must
1453+
* also be derived from its end points.
1454+
*/
1455+
return start >= __pa(_PAGE_OFFSET(vabits_actual)) &&
1456+
(start + size - 1) <= __pa(PAGE_END - 1);
1457+
}
1458+
14471459
int arch_add_memory(int nid, u64 start, u64 size,
14481460
struct mhp_params *params)
14491461
{
14501462
int ret, flags = 0;
14511463

1464+
if (!inside_linear_region(start, size)) {
1465+
pr_err("[%llx %llx] is outside linear mapping region\n", start, start + size);
1466+
return -EINVAL;
1467+
}
1468+
14521469
if (rodata_full || debug_pagealloc_enabled())
14531470
flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
14541471

0 commit comments

Comments
 (0)