| /* 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 |