14f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui/* 24f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * Copyright (C) 2016 The Android Open Source Project 34f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * 44f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * Licensed under the Apache License, Version 2.0 (the "License"); 54f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * you may not use this file except in compliance with the License. 64f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * You may obtain a copy of the License at 74f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * 84f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * http://www.apache.org/licenses/LICENSE-2.0 94f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * 104f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * Unless required by applicable law or agreed to in writing, software 114f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * distributed under the License is distributed on an "AS IS" BASIS, 124f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * See the License for the specific language governing permissions and 144f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui * limitations under the License. 154f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui */ 164f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 174f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#ifndef SIMPLE_PERF_TRACING_H_ 184f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#define SIMPLE_PERF_TRACING_H_ 194f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 204f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#include <vector> 214f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 224f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#include <android-base/logging.h> 234f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 244f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#include "event_type.h" 256965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui#include "utils.h" 264f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 274f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cuistruct TracingField { 284f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::string name; 294f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui size_t offset; 304f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui size_t elem_size; 314f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui size_t elem_count; 324f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui bool is_signed; 334f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui}; 344f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 356965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cuistruct TracingFieldPlace { 366965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui uint32_t offset; 376965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui uint32_t size; 386965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui 396965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui uint64_t ReadFromData(const char* raw_data) { 406965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui return ConvertBytesToValue(raw_data + offset, size); 416965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui } 426965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui}; 436965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui 444f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cuistruct TracingFormat { 454f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::string system_name; 464f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::string name; 474f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui uint64_t id; 484f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::vector<TracingField> fields; 494f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 506965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui void GetField(const std::string& name, TracingFieldPlace& place) { 514f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui const TracingField& field = GetField(name); 526965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui place.offset = field.offset; 536965d42c43f12fd2dfcca3c490b51edc67822586Yabin Cui place.size = field.elem_size; 544f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui } 554f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 564f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui private: 574f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui const TracingField& GetField(const std::string& name) { 584f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui for (const auto& field : fields) { 594f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui if (field.name == name) { 604f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui return field; 614f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui } 624f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui } 634f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui LOG(FATAL) << "Couldn't find field " << name << "in TracingFormat of " 644f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui << this->name; 654f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui return fields[0]; 664f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui } 674f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui}; 684f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 694f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cuiclass TracingFile; 704f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 714f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cuiclass Tracing { 724f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui public: 735674ed87431f2d9b05f4ec0c7f7c2e56e585c956Chih-Hung Hsieh explicit Tracing(const std::vector<char>& data); 744f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui ~Tracing(); 754f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui void Dump(size_t indent); 764f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui TracingFormat GetTracingFormatHavingId(uint64_t trace_event_id); 774f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::string GetTracingEventNameHavingId(uint64_t trace_event_id); 784f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui const std::string& GetKallsyms() const; 794f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui uint32_t GetPageSize() const; 804f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 814f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui private: 824f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui TracingFile* tracing_file_; 834f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::vector<TracingFormat> tracing_formats_; 844f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui}; 854f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 86877751bbae11e009070e036ee1cd16e88135fff5Yabin Cuibool GetTracingData(const std::vector<const EventType*>& event_types, 874f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui std::vector<char>* data); 884f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui 894f41df6f68efc3b9b534014a8cfb6ee8ac4d5c91Yabin Cui#endif // SIMPLE_PERF_TRACING_H_ 90