ladybird/Kernel/Syscalls/perf_event.cpp
Andreas Kling 1e90a3a542 Kernel: Make sys$perf_register_string() generate the string ID's
Making userspace provide a global string ID was silly, and made the API
extremely difficult to use correctly in a global profiling context.

Instead, simply make the kernel do the string ID allocation for us.
This also allows us to convert the string storage to a Vector in the
kernel (and an array in the JSON profile data.)
2021-08-12 00:03:39 +02:00

38 lines
1.1 KiB
C++

/*
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/PerformanceEventBuffer.h>
#include <Kernel/Process.h>
namespace Kernel {
KResultOr<FlatPtr> Process::sys$perf_event(int type, FlatPtr arg1, FlatPtr arg2)
{
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
auto events_buffer = current_perf_events_buffer();
if (!events_buffer) {
if (!create_perf_events_buffer_if_needed())
return ENOMEM;
events_buffer = perf_events();
}
return events_buffer->append(type, arg1, arg2, nullptr);
}
KResultOr<FlatPtr> Process::sys$perf_register_string(Userspace<char const*> user_string, size_t user_string_length)
{
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
auto* events_buffer = current_perf_events_buffer();
if (!events_buffer)
return KSuccess;
auto string_or_error = try_copy_kstring_from_user(user_string, user_string_length);
if (string_or_error.is_error())
return string_or_error.error();
return events_buffer->register_string(string_or_error.release_value());
}
}