Serenity Operating System
1/*
2 * Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#if defined(__SANITIZE_ADDRESS__)
8
9# include <Kernel/AddressSanitizer.h>
10
11void Kernel::AddressSanitizer::shadow_va_check_load(unsigned long address, size_t size, void* return_address)
12{
13 (void)address;
14 (void)size;
15 (void)return_address;
16}
17
18void Kernel::AddressSanitizer::shadow_va_check_store(unsigned long address, size_t size, void* return_address)
19{
20 (void)address;
21 (void)size;
22 (void)return_address;
23}
24
25using namespace Kernel;
26using namespace Kernel::AddressSanitizer;
27
28extern "C" {
29
30// Define a macro to easily declare the KASAN load and store callbacks for
31// the various sizes of data type.
32//
33# define ADDRESS_SANITIZER_LOAD_STORE(size) \
34 void __asan_load##size(unsigned long); \
35 void __asan_load##size(unsigned long address) \
36 { \
37 shadow_va_check_load(address, size, __builtin_return_address(0)); \
38 } \
39 void __asan_load##size##_noabort(unsigned long); \
40 void __asan_load##size##_noabort(unsigned long address) \
41 { \
42 shadow_va_check_load(address, size, __builtin_return_address(0)); \
43 } \
44 void __asan_store##size(unsigned long); \
45 void __asan_store##size(unsigned long address) \
46 { \
47 shadow_va_check_store(address, size, __builtin_return_address(0)); \
48 } \
49 void __asan_store##size##_noabort(unsigned long); \
50 void __asan_store##size##_noabort(unsigned long address) \
51 { \
52 shadow_va_check_store(address, size, __builtin_return_address(0)); \
53 }
54
55ADDRESS_SANITIZER_LOAD_STORE(1);
56ADDRESS_SANITIZER_LOAD_STORE(2);
57ADDRESS_SANITIZER_LOAD_STORE(4);
58ADDRESS_SANITIZER_LOAD_STORE(8);
59ADDRESS_SANITIZER_LOAD_STORE(16);
60
61# undef ADDRESS_SANITIZER_LOAD_STORE
62
63void __asan_loadN(unsigned long, size_t);
64void __asan_loadN(unsigned long address, size_t size)
65{
66 shadow_va_check_load(address, size, __builtin_return_address(0));
67}
68
69void __asan_loadN_noabort(unsigned long, size_t);
70void __asan_loadN_noabort(unsigned long address, size_t size)
71{
72 shadow_va_check_load(address, size, __builtin_return_address(0));
73}
74
75void __asan_storeN(unsigned long, size_t);
76void __asan_storeN(unsigned long address, size_t size)
77{
78 shadow_va_check_store(address, size, __builtin_return_address(0));
79}
80
81void __asan_storeN_noabort(unsigned long, size_t);
82void __asan_storeN_noabort(unsigned long address, size_t size)
83{
84 shadow_va_check_store(address, size, __builtin_return_address(0));
85}
86
87// Performs shadow memory cleanup of the current thread's stack before a
88// function marked with the [[noreturn]] attribute is called.
89//
90void __asan_handle_no_return(void);
91void __asan_handle_no_return(void)
92{
93}
94
95void __asan_before_dynamic_init(char const*);
96void __asan_before_dynamic_init(char const* /* module_name */)
97{
98}
99
100void __asan_after_dynamic_init();
101void __asan_after_dynamic_init()
102{
103}
104}
105
106#endif