diff --git a/trace_streamer/src/parser/common_types.h b/trace_streamer/src/parser/common_types.h index 3207ea17bab6e30e75e9bdf28744d46d48cbdae4..4785136f9c65e5f073abb1390a1df99ba420f324 100644 --- a/trace_streamer/src/parser/common_types.h +++ b/trace_streamer/src/parser/common_types.h @@ -158,6 +158,12 @@ enum RawTraceContentType : uint8_t { CONTENT_TYPE_PRINTK_FORMATS = 31, CONTENT_TYPE_KALLSYMS = 32 }; + +enum RawTraceFileType : uint8_t { + FILE_RAW_TRACE = 0, + HM_FILE_RAW_TRACE = 1 +}; + } // namespace TraceStreamer } // namespace SysTuning #endif // _BYTRACE_COMMON_TYPES_H_ diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp index 9c2ec7da70dcad20fc202846fc09aa4c4c2598c6..64556fc6ba3525d93fa52b2643e54715a7ffbfa7 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp @@ -199,7 +199,11 @@ bool FtraceEventProcessor::SchedBlockedReason(FtraceEvent& ftraceEvent, uint8_t index = 0; auto schedBlockedMsg = ftraceEvent.mutable_sched_blocked_reason_format(); schedBlockedMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); - schedBlockedMsg->set_caller(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + if (format.eventId >= HM_EVENT_ID_OFFSET) { + (void)FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size); + } else { + schedBlockedMsg->set_caller(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + } schedBlockedMsg->set_io_wait(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); return true; } @@ -367,7 +371,9 @@ bool FtraceEventProcessor::TracingMarkWriteOrPrintFormat(FtraceEvent& ftraceEven { uint8_t index = 0; auto printMsg = ftraceEvent.mutable_print_format(); - printMsg->set_ip(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + if (format.eventId < HM_EVENT_ID_OFFSET) { + printMsg->set_ip(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + } printMsg->set_buf(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); return true; } diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h index c38d95a13a672f55eaee5a38d3e5ce28802144d4..d612346f4a3c1d167f101ff6be42986992b61c11 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h @@ -23,6 +23,7 @@ namespace SysTuning { namespace TraceStreamer { +constexpr uint32_t HM_EVENT_ID_OFFSET = 32768; using namespace TraceCfg; class FtraceEventProcessor { public: diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp index 4ada68a85f7c4198a703fc15faca5e049a3dd36a..8a43639b58757bacbf115e67e59854b3329dfa19 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp @@ -150,6 +150,15 @@ bool FtraceProcessor::HandleEventFormat(const std::string& formatInfo, EventForm TS_CHECK_TRUE(format.fields.size() > 0, false, "HandleEventFormat from %s failed!", formatInfo.c_str()); auto lastFiledIndex = format.fields.size() - 1; format.eventSize = format.fields[lastFiledIndex].offset + format.fields[lastFiledIndex].size; + if (format.eventId >= HM_EVENT_ID_OFFSET) { + for (auto &fmt: format.commonFields) { + fmt.offset += offsetof(struct HmTraceHeader, commonType); + } + for (auto &fmt: format.fields) { + fmt.offset += offsetof(struct HmTraceHeader, commonType); + } + format.eventSize += offsetof(struct HmTraceHeader, commonType); + } return true; } @@ -630,6 +639,66 @@ bool FtraceProcessor::HandlePage(FtraceCpuDetailMsg& cpuMsg, return true; } +static inline int RmqEntryTotalSize(unsigned int size) +{ + return sizeof(struct RmqEntry) + ((size + RMQ_ENTRY_ALIGN_MASK) & (~RMQ_ENTRY_ALIGN_MASK)); +} + +bool FtraceProcessor::HmParsePageData(FtraceCpuDetailMsg& cpuMsg, + CpuDetailParser& cpuDetailParser, uint8_t* &data) +{ + struct RmqConsumerData *rmqData = reinterpret_cast(data); + uint64_t timeStampBase = rmqData->timeStamp; + struct RmqEntry *event; + struct HmTraceHeader *header; + unsigned int evtSize; + unsigned int eventId; + EventFormat format = {}; + int num = 0; + + cpuMsg.set_cpu(rmqData->coreId); + cpuMsg.set_overwrite(0); + + auto curPtr = rmqData->data; + auto endPtr = rmqData->data + rmqData->length; + while (curPtr < endPtr) { + event = reinterpret_cast(curPtr); + evtSize = event->size; + if (evtSize == 0U) { + break; + } + + header = reinterpret_cast(event->data); + eventId = header->commonType; + if (!GetEventFormatById(eventId, format)) { + curPtr += RmqEntryTotalSize(evtSize); + TS_LOGD("mark.debug. evtId = %u evtSize = %u", eventId, evtSize); + continue; + } + if (FtraceEventProcessor::GetInstance().IsSupported(format.eventId)) { + std::unique_ptr ftraceEvent = std::make_unique(); + ftraceEvent->set_timestamp(event->timeStampOffset + timeStampBase); + ftraceEvent->set_tgid(header->tgid); + ftraceEvent->set_comm(header->tcbName); + HandleFtraceEvent(*ftraceEvent, reinterpret_cast(header), evtSize, format); + std::unique_ptr eventInfo = std::make_unique(); + eventInfo->cpuId = cpuMsg.cpu(); + eventInfo->eventId = eventId; + eventInfo->msgPtr = std::move(ftraceEvent); + cpuDetailParser.EventAppend(std::move(eventInfo)); + num++; + } else { + TS_LOGD("mark.debug. evtId = %u evtSize = %u format.eventId = %u format.evtSize = %u" + "format.eventName = %s format.eventType = %s", eventId, evtSize, format.eventId, format.eventSize, + format.eventName.c_str(), format.eventType.c_str()); + } + curPtr += RmqEntryTotalSize(evtSize); + } + + data += FTRACE_PAGE_SIZE; + return true; +} + static bool IsValidIndex(int index) { return index != CommonFiledIndex::INVALID_IDX; diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h index 671972ea0f85287eae2c629bead93b9d95ed7a7d..011ccdc304bb7230051891f10ff657c5d4cdecfe 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h @@ -27,6 +27,7 @@ namespace SysTuning { namespace TraceStreamer { constexpr uint32_t FTRACE_PAGE_SIZE = 4096; +constexpr uint32_t RMQ_ENTRY_ALIGN_MASK = (1 << 2) - 1; class FtraceProcessor { public: FtraceProcessor(); @@ -38,6 +39,8 @@ public: CpuDetailParser& cpuDetailParser, uint8_t page[], size_t size = FTRACE_PAGE_SIZE); + bool HmParsePageData(FtraceCpuDetailMsg& cpuDetailMsg, + CpuDetailParser& cpuDetailParser, uint8_t* &data); bool HandleTgids(const std::string& tgids); bool HandleCmdlines(const std::string& cmdlines); diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp index de3554803f87b0942446faecd76654f2a72ea103..3430100b332482ce33f31df7361640f45d99908b 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp @@ -46,8 +46,9 @@ bool RawTraceParser::InitRawTraceFileHeader(std::deque::iterator& packa RawTraceFileHeader header; auto ret = memcpy_s(&header, sizeof(RawTraceFileHeader), &(*packagesBuffer_.begin()), sizeof(RawTraceFileHeader)); TS_CHECK_TRUE(ret == EOK, false, "Memcpy FAILED!Error code is %d, data size is %zu.", ret, packagesBuffer_.size()); - TS_LOGI("magicNumber=%d", header.magicNumber); + TS_LOGI("magicNumber=%d fileType=%d", header.magicNumber, header.fileType); + fileType_ = header.fileType; packagesCurIter += sizeof(RawTraceFileHeader); packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); hasGotHeader_ = true; @@ -76,6 +77,7 @@ bool RawTraceParser::UpdateCpuCoreMax(uint32_t cpuId) } return true; } + bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer) { UpdateCpuCoreMax(cpuId); @@ -90,6 +92,22 @@ bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer) cpuDetailParser_->FilterAllEvents(*cpuDetail_.get()); return true; } + +bool RawTraceParser::HmParseCpuRawData(const std::string& buffer) +{ + TS_CHECK_TRUE(buffer.size() > 0, true, "hm raw data is null!"); + auto startPtr = reinterpret_cast(buffer.c_str()); + auto endPtr = startPtr + buffer.size(); + + for (uint8_t* data = const_cast(startPtr); data < endPtr;) { + TS_CHECK_TRUE(ftraceProcessor_->HmParsePageData(*cpuDetail_.get(), *cpuDetailParser_.get(), data), + false, "hm parse page failed!"); + cpuDetailParser_->FilterAllEvents(*cpuDetail_.get()); + } + TS_LOGD("mark.debug. HmParseCpuRawData end success"); + return true; +} + bool RawTraceParser::ParseLastCommData(uint8_t type, const std::string& buffer) { TS_CHECK_TRUE_RET(restCommDataCnt_ != INVALID_UINT8, false); @@ -147,8 +165,12 @@ bool RawTraceParser::ParseDataRecursively(std::deque::iterator& package continue; } if (curType >= CONTENT_TYPE_CPU_RAW && curType < CONTENT_TYPE_HEADER_PAGE) { - auto cpuId = curType - CONTENT_TYPE_CPU_RAW; - TS_CHECK_TRUE(ParseCpuRawData(cpuId, bufferLine), false, "cpu raw parse failed"); + if (fileType_ == FILE_RAW_TRACE) { + auto cpuId = curType - CONTENT_TYPE_CPU_RAW; + TS_CHECK_TRUE(ParseCpuRawData(cpuId, bufferLine), false, "cpu raw parse failed"); + } else if (fileType_ == HM_FILE_RAW_TRACE) { + TS_CHECK_TRUE(HmParseCpuRawData(bufferLine), false, "hm raw trace parse failed"); + } } else if (curType == CONTENT_TYPE_EVENTS_FORMAT) { TS_CHECK_TRUE(InitEventFormats(bufferLine), false, "init event format failed"); } else if (curType == CONTENT_TYPE_HEADER_PAGE) { diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h index 1509fcebd6e6c23a13208fed94fad5811ae17832..aa1898bff538b4711f9d83827a3f7a03deb349cf 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h @@ -35,6 +35,7 @@ private: bool ParseDataRecursively(std::deque::iterator& packagesBegin); void ParseTraceDataItem(const std::string& buffer) override; bool ParseCpuRawData(uint32_t cpuId, const std::string& buffer); + bool HmParseCpuRawData(const std::string& buffer); bool ParseLastCommData(uint8_t type, const std::string& buffer); bool InitRawTraceFileHeader(std::deque::iterator& packagesCurIter); bool InitEventFormats(const std::string& buffer); @@ -43,6 +44,7 @@ private: private: TraceDataCache* traceDataCache_; bool hasGotHeader_ = false; + uint8_t fileType_; uint8_t restCommDataCnt_ = 0; uint32_t cpuCoreMax_ = 0; std::unique_ptr ftraceProcessor_ = nullptr;