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