11188faa7SWalter Erquinigo //===-- IntelPTPerThreadProcessTrace.cpp ----------------------------------===// 21188faa7SWalter Erquinigo // 31188faa7SWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41188faa7SWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information. 51188faa7SWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61188faa7SWalter Erquinigo // 71188faa7SWalter Erquinigo //===----------------------------------------------------------------------===// 81188faa7SWalter Erquinigo 91188faa7SWalter Erquinigo #include "IntelPTPerThreadProcessTrace.h" 101188faa7SWalter Erquinigo 111188faa7SWalter Erquinigo using namespace lldb; 121188faa7SWalter Erquinigo using namespace lldb_private; 131188faa7SWalter Erquinigo using namespace process_linux; 141188faa7SWalter Erquinigo using namespace llvm; 151188faa7SWalter Erquinigo 161188faa7SWalter Erquinigo bool IntelPTPerThreadProcessTrace::TracesThread(lldb::tid_t tid) const { 171188faa7SWalter Erquinigo return m_thread_traces.TracesThread(tid); 181188faa7SWalter Erquinigo } 191188faa7SWalter Erquinigo 201188faa7SWalter Erquinigo Error IntelPTPerThreadProcessTrace::TraceStop(lldb::tid_t tid) { 211188faa7SWalter Erquinigo return m_thread_traces.TraceStop(tid); 221188faa7SWalter Erquinigo } 231188faa7SWalter Erquinigo 241188faa7SWalter Erquinigo Error IntelPTPerThreadProcessTrace::TraceStart(lldb::tid_t tid) { 251188faa7SWalter Erquinigo if (m_thread_traces.GetTotalBufferSize() + 261188faa7SWalter Erquinigo m_tracing_params.trace_buffer_size > 271188faa7SWalter Erquinigo static_cast<size_t>(*m_tracing_params.process_buffer_size_limit)) 281188faa7SWalter Erquinigo return createStringError( 291188faa7SWalter Erquinigo inconvertibleErrorCode(), 301188faa7SWalter Erquinigo "Thread %" PRIu64 " can't be traced as the process trace size limit " 311188faa7SWalter Erquinigo "has been reached. Consider retracing with a higher " 321188faa7SWalter Erquinigo "limit.", 331188faa7SWalter Erquinigo tid); 341188faa7SWalter Erquinigo 351188faa7SWalter Erquinigo return m_thread_traces.TraceStart(tid, m_tracing_params); 361188faa7SWalter Erquinigo } 371188faa7SWalter Erquinigo 38*1f56f7fcSWalter Erquinigo TraceGetStateResponse IntelPTPerThreadProcessTrace::GetState() { 39*1f56f7fcSWalter Erquinigo TraceGetStateResponse state; 40*1f56f7fcSWalter Erquinigo m_thread_traces.ForEachThread( 41*1f56f7fcSWalter Erquinigo [&](lldb::tid_t tid, const IntelPTSingleBufferTrace &thread_trace) { 42*1f56f7fcSWalter Erquinigo state.traced_threads.push_back({tid, 43*1f56f7fcSWalter Erquinigo {{IntelPTDataKinds::kTraceBuffer, 44*1f56f7fcSWalter Erquinigo thread_trace.GetTraceBufferSize()}}}); 45*1f56f7fcSWalter Erquinigo }); 46*1f56f7fcSWalter Erquinigo return state; 47*1f56f7fcSWalter Erquinigo } 48*1f56f7fcSWalter Erquinigo 49*1f56f7fcSWalter Erquinigo Expected<std::vector<uint8_t>> IntelPTPerThreadProcessTrace::GetBinaryData( 50*1f56f7fcSWalter Erquinigo const TraceGetBinaryDataRequest &request) { 51*1f56f7fcSWalter Erquinigo if (Expected<IntelPTSingleBufferTrace &> trace = 52*1f56f7fcSWalter Erquinigo m_thread_traces.GetTracedThread(*request.tid)) 53*1f56f7fcSWalter Erquinigo return trace->GetTraceBuffer(request.offset, request.size); 54*1f56f7fcSWalter Erquinigo else 55*1f56f7fcSWalter Erquinigo return trace.takeError(); 56*1f56f7fcSWalter Erquinigo } 57*1f56f7fcSWalter Erquinigo 58*1f56f7fcSWalter Erquinigo Expected<IntelPTProcessTraceUP> 59*1f56f7fcSWalter Erquinigo IntelPTPerThreadProcessTrace::Start(const TraceIntelPTStartRequest &request, 60*1f56f7fcSWalter Erquinigo ArrayRef<lldb::tid_t> current_tids) { 61*1f56f7fcSWalter Erquinigo IntelPTProcessTraceUP trace(new IntelPTPerThreadProcessTrace(request)); 62*1f56f7fcSWalter Erquinigo 63*1f56f7fcSWalter Erquinigo Error error = Error::success(); 64*1f56f7fcSWalter Erquinigo for (lldb::tid_t tid : current_tids) 65*1f56f7fcSWalter Erquinigo error = joinErrors(std::move(error), trace->TraceStart(tid)); 66*1f56f7fcSWalter Erquinigo if (error) 67*1f56f7fcSWalter Erquinigo return std::move(error); 68*1f56f7fcSWalter Erquinigo return trace; 691188faa7SWalter Erquinigo } 70