|
@@ -7,6 +7,7 @@
|
|
#include <AK/JsonArraySerializer.h>
|
|
#include <AK/JsonArraySerializer.h>
|
|
#include <AK/JsonObject.h>
|
|
#include <AK/JsonObject.h>
|
|
#include <AK/JsonObjectSerializer.h>
|
|
#include <AK/JsonObjectSerializer.h>
|
|
|
|
+#include <AK/ScopeGuard.h>
|
|
#include <Kernel/Arch/x86/SmapDisabler.h>
|
|
#include <Kernel/Arch/x86/SmapDisabler.h>
|
|
#include <Kernel/FileSystem/Custody.h>
|
|
#include <Kernel/FileSystem/Custody.h>
|
|
#include <Kernel/KBufferBuilder.h>
|
|
#include <Kernel/KBufferBuilder.h>
|
|
@@ -63,6 +64,17 @@ KResult PerformanceEventBuffer::append_with_eip_and_ebp(ProcessID pid, ThreadID
|
|
if ((g_profiling_event_mask & type) == 0)
|
|
if ((g_profiling_event_mask & type) == 0)
|
|
return EINVAL;
|
|
return EINVAL;
|
|
|
|
|
|
|
|
+ auto current_thread = Thread::current();
|
|
|
|
+ u32 enter_count = 0;
|
|
|
|
+ if (current_thread)
|
|
|
|
+ enter_count = current_thread->enter_profiler();
|
|
|
|
+ ScopeGuard leave_profiler([&] {
|
|
|
|
+ if (current_thread)
|
|
|
|
+ current_thread->leave_profiler();
|
|
|
|
+ });
|
|
|
|
+ if (enter_count > 0)
|
|
|
|
+ return EINVAL;
|
|
|
|
+
|
|
PerformanceEvent event;
|
|
PerformanceEvent event;
|
|
event.type = type;
|
|
event.type = type;
|
|
event.lost_samples = lost_samples;
|
|
event.lost_samples = lost_samples;
|
|
@@ -122,6 +134,8 @@ KResult PerformanceEventBuffer::append_with_eip_and_ebp(ProcessID pid, ThreadID
|
|
event.data.kfree.size = arg1;
|
|
event.data.kfree.size = arg1;
|
|
event.data.kfree.ptr = arg2;
|
|
event.data.kfree.ptr = arg2;
|
|
break;
|
|
break;
|
|
|
|
+ case PERF_EVENT_PAGE_FAULT:
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
return EINVAL;
|
|
return EINVAL;
|
|
}
|
|
}
|
|
@@ -210,6 +224,9 @@ bool PerformanceEventBuffer::to_json_impl(Serializer& object) const
|
|
event_object.add("ptr", static_cast<u64>(event.data.kfree.ptr));
|
|
event_object.add("ptr", static_cast<u64>(event.data.kfree.ptr));
|
|
event_object.add("size", static_cast<u64>(event.data.kfree.size));
|
|
event_object.add("size", static_cast<u64>(event.data.kfree.size));
|
|
break;
|
|
break;
|
|
|
|
+ case PERF_EVENT_PAGE_FAULT:
|
|
|
|
+ event_object.add("type", "page_fault");
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
event_object.add("pid", event.pid);
|
|
event_object.add("pid", event.pid);
|
|
event_object.add("tid", event.tid);
|
|
event_object.add("tid", event.tid);
|