SanCov.cpp 940 B

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