kmsan.h (4ca8cc8d1bbe582bfc7a4d80bd72cfd8d3d0e2e8) kmsan.h (ce732a7520b093091c345cba1b84542d1abd83ed)
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * x86 KMSAN support.
4 *
5 * Copyright (C) 2022, Google LLC
6 * Author: Alexander Potapenko <glider@google.com>
7 */
8
9#ifndef _ASM_X86_KMSAN_H
10#define _ASM_X86_KMSAN_H
11
12#ifndef MODULE
13
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * x86 KMSAN support.
4 *
5 * Copyright (C) 2022, Google LLC
6 * Author: Alexander Potapenko <glider@google.com>
7 */
8
9#ifndef _ASM_X86_KMSAN_H
10#define _ASM_X86_KMSAN_H
11
12#ifndef MODULE
13
14#include <asm/cpu_entry_area.h>
14#include <asm/processor.h>
15#include <linux/mmzone.h>
16
15#include <asm/processor.h>
16#include <linux/mmzone.h>
17
18DECLARE_PER_CPU(char[CPU_ENTRY_AREA_SIZE], cpu_entry_area_shadow);
19DECLARE_PER_CPU(char[CPU_ENTRY_AREA_SIZE], cpu_entry_area_origin);
20
17/*
21/*
22 * Functions below are declared in the header to make sure they are inlined.
23 * They all are called from kmsan_get_metadata() for every memory access in
24 * the kernel, so speed is important here.
25 */
26
27/*
28 * Compute metadata addresses for the CPU entry area on x86.
29 */
30static inline void *arch_kmsan_get_meta_or_null(void *addr, bool is_origin)
31{
32 unsigned long addr64 = (unsigned long)addr;
33 char *metadata_array;
34 unsigned long off;
35 int cpu;
36
37 if ((addr64 < CPU_ENTRY_AREA_BASE) ||
38 (addr64 >= (CPU_ENTRY_AREA_BASE + CPU_ENTRY_AREA_MAP_SIZE)))
39 return NULL;
40 cpu = (addr64 - CPU_ENTRY_AREA_BASE) / CPU_ENTRY_AREA_SIZE;
41 off = addr64 - (unsigned long)get_cpu_entry_area(cpu);
42 if ((off < 0) || (off >= CPU_ENTRY_AREA_SIZE))
43 return NULL;
44 metadata_array = is_origin ? cpu_entry_area_origin :
45 cpu_entry_area_shadow;
46 return &per_cpu(metadata_array[off], cpu);
47}
48
49/*
18 * Taken from arch/x86/mm/physaddr.h to avoid using an instrumented version.
19 */
20static inline bool kmsan_phys_addr_valid(unsigned long addr)
21{
22 if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
23 return !(addr >> boot_cpu_data.x86_phys_bits);
24 else
25 return true;

--- 30 unchanged lines hidden ---
50 * Taken from arch/x86/mm/physaddr.h to avoid using an instrumented version.
51 */
52static inline bool kmsan_phys_addr_valid(unsigned long addr)
53{
54 if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
55 return !(addr >> boot_cpu_data.x86_phys_bits);
56 else
57 return true;

--- 30 unchanged lines hidden ---