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/API/kcov.h>
8#include <LibCore/System.h>
9#include <LibMain/Main.h>
10#include <fcntl.h>
11#include <stdio.h>
12#include <sys/ioctl.h>
13#include <sys/mman.h>
14#include <unistd.h>
15
16// Note: This program requires serenity to be built with the CMake build option
17// ENABLE_KERNEL_COVERAGE_COLLECTION
18ErrorOr<int> serenity_main(Main::Arguments)
19{
20 constexpr size_t num_entries = 1024 * 100;
21
22 int fd = TRY(Core::System::open("/dev/kcov0"sv, O_RDWR));
23 TRY(Core::System::ioctl(fd, KCOV_SETBUFSIZE, num_entries));
24 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));
25 TRY(Core::System::ioctl(fd, KCOV_ENABLE));
26 cover[0] = 0;
27
28 // Example syscall so we actually cover some kernel code.
29 getppid();
30
31 TRY(Core::System::ioctl(fd, KCOV_DISABLE));
32
33 u64 cov_idx = cover[0];
34 for (size_t idx = 1; idx <= cov_idx; idx++)
35 printf("%p\n", (void*)cover[idx]);
36
37 TRY(Core::System::munmap(const_cast<u64*>(cover), num_entries * KCOV_ENTRY_SIZE));
38 TRY(Core::System::close(fd));
39
40 return 0;
41}