kcov-example.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * Copyright (c) 2021, Patrick Meyer <git@the-space.agency>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/API/kcov.h>
  7. #include <LibCore/System.h>
  8. #include <LibMain/Main.h>
  9. #include <fcntl.h>
  10. #include <stdio.h>
  11. #include <sys/ioctl.h>
  12. #include <sys/mman.h>
  13. #include <unistd.h>
  14. // Note: This program requires serenity to be built with the CMake build option
  15. // ENABLE_KERNEL_COVERAGE_COLLECTION
  16. ErrorOr<int> serenity_main(Main::Arguments)
  17. {
  18. constexpr size_t num_entries = 1024 * 100;
  19. int fd = TRY(Core::System::open("/dev/kcov0"sv, O_RDWR));
  20. TRY(Core::System::ioctl(fd, KCOV_SETBUFSIZE, num_entries));
  21. kcov_pc_t* cover = (kcov_pc_t*)TRY(Core::System::mmap(NULL, num_entries * KCOV_ENTRY_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
  22. TRY(Core::System::ioctl(fd, KCOV_ENABLE));
  23. cover[0] = 0;
  24. // Example syscall so we actually cover some kernel code.
  25. getppid();
  26. TRY(Core::System::ioctl(fd, KCOV_DISABLE));
  27. u64 cov_idx = cover[0];
  28. for (size_t idx = 1; idx <= cov_idx; idx++)
  29. printf("%p\n", (void*)cover[idx]);
  30. TRY(Core::System::munmap(const_cast<u64*>(cover), num_entries * KCOV_ENTRY_SIZE));
  31. TRY(Core::System::close(fd));
  32. return 0;
  33. }