Serenity Operating System
1/*
2 * Copyright (c) 2021, Patrick Meyer <git@the-space.agency>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <Kernel/Devices/KCOVDevice.h>
8#include <Kernel/Thread.h>
9
10extern bool g_in_early_boot;
11
12extern "C" {
13
14void __sanitizer_cov_trace_pc(void);
15void __sanitizer_cov_trace_pc(void)
16{
17 if (g_in_early_boot) [[unlikely]]
18 return;
19
20 if (Processor::current_in_irq()) [[unlikely]] {
21 // Do not trace in interrupts.
22 return;
23 }
24
25 auto const* thread = Thread::current();
26 auto tid = thread->tid();
27 auto maybe_kcov_instance = KCOVDevice::thread_instance->get(tid);
28 if (!maybe_kcov_instance.has_value()) [[likely]] {
29 // not traced
30 return;
31 }
32 auto* kcov_instance = maybe_kcov_instance.value();
33 if (kcov_instance->state() < KCOVInstance::TRACING) [[likely]]
34 return;
35 kcov_instance->buffer_add_pc((u64)__builtin_return_address(0));
36}
37}