Serenity Operating System
at master 106 lines 3.7 kB view raw
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