perf_event.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/PerformanceEventBuffer.h>
  7. #include <Kernel/Process.h>
  8. namespace Kernel {
  9. KResultOr<FlatPtr> Process::sys$perf_event(int type, FlatPtr arg1, FlatPtr arg2)
  10. {
  11. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  12. auto events_buffer = current_perf_events_buffer();
  13. if (!events_buffer) {
  14. if (!create_perf_events_buffer_if_needed())
  15. return ENOMEM;
  16. events_buffer = perf_events();
  17. }
  18. return events_buffer->append(type, arg1, arg2, nullptr);
  19. }
  20. KResultOr<FlatPtr> Process::sys$perf_register_string(Userspace<char const*> user_string, size_t user_string_length)
  21. {
  22. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  23. auto* events_buffer = current_perf_events_buffer();
  24. if (!events_buffer)
  25. return KSuccess;
  26. auto string_or_error = try_copy_kstring_from_user(user_string, user_string_length);
  27. if (string_or_error.is_error())
  28. return string_or_error.error();
  29. return events_buffer->register_string(string_or_error.release_value());
  30. }
  31. }