| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * arch/arm/include/asm/kasan_def.h |
| * |
| * Copyright (c) 2018 Huawei Technologies Co., Ltd. |
| * |
| * Author: Abbott Liu <liuwenliang@huawei.com> |
| */ |
| |
| #ifndef __ASM_KASAN_DEF_H |
| #define __ASM_KASAN_DEF_H |
| |
| #ifdef CONFIG_KASAN |
| |
| /* |
| * Define KASAN_SHADOW_OFFSET,KASAN_SHADOW_START and KASAN_SHADOW_END for |
| * the Arm kernel address sanitizer. We are "stealing" lowmem (the 4GB |
| * addressable by a 32bit architecture) out of the virtual address |
| * space to use as shadow memory for KASan as follows: |
| * |
| * +----+ 0xffffffff |
| * | | \ |
| * | | |-> Static kernel image (vmlinux) BSS and page table |
| * | |/ |
| * +----+ PAGE_OFFSET |
| * | | \ |
| * | | |-> Loadable kernel modules virtual address space area |
| * | |/ |
| * +----+ MODULES_VADDR = KASAN_SHADOW_END |
| * | | \ |
| * | | |-> The shadow area of kernel virtual address. |
| * | |/ |
| * +----+-> TASK_SIZE (start of kernel space) = KASAN_SHADOW_START the |
| * | |\ shadow address of MODULES_VADDR |
| * | | | |
| * | | | |
| * | | |-> The user space area in lowmem. The kernel address |
| * | | | sanitizer do not use this space, nor does it map it. |
| * | | | |
| * | | | |
| * | | | |
| * | | | |
| * | |/ |
| * ------ 0 |
| * |
| * 1) KASAN_SHADOW_START |
| * This value begins with the MODULE_VADDR's shadow address. It is the |
| * start of kernel virtual space. Since we have modules to load, we need |
| * to cover also that area with shadow memory so we can find memory |
| * bugs in modules. |
| * |
| * 2) KASAN_SHADOW_END |
| * This value is the 0x100000000's shadow address: the mapping that would |
| * be after the end of the kernel memory at 0xffffffff. It is the end of |
| * kernel address sanitizer shadow area. It is also the start of the |
| * module area. |
| * |
| * 3) KASAN_SHADOW_OFFSET: |
| * This value is used to map an address to the corresponding shadow |
| * address by the following formula: |
| * |
| * shadow_addr = (address >> 3) + KASAN_SHADOW_OFFSET; |
| * |
| * As you would expect, >> 3 is equal to dividing by 8, meaning each |
| * byte in the shadow memory covers 8 bytes of kernel memory, so one |
| * bit shadow memory per byte of kernel memory is used. |
| * |
| * The KASAN_SHADOW_OFFSET is provided in a Kconfig option depending |
| * on the VMSPLIT layout of the system: the kernel and userspace can |
| * split up lowmem in different ways according to needs, so we calculate |
| * the shadow offset depending on this. |
| */ |
| |
| #define KASAN_SHADOW_SCALE_SHIFT 3 |
| #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) |
| #define KASAN_SHADOW_END ((UL(1) << (32 - KASAN_SHADOW_SCALE_SHIFT)) \ |
| + KASAN_SHADOW_OFFSET) |
| #define KASAN_SHADOW_START ((KASAN_SHADOW_END >> 3) + KASAN_SHADOW_OFFSET) |
| |
| #endif |
| #endif |