Serenity Operating System
at master 41 lines 1.2 kB view raw
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}