| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef SIMPLE_PERF_RECORD_FILE_FORMAT_H_ |
| #define SIMPLE_PERF_RECORD_FILE_FORMAT_H_ |
| |
| #include <string> |
| |
| #include "perf_event.h" |
| |
| /* |
| The file structure of perf.data: |
| file_header |
| id_section |
| attr section |
| data section |
| feature section |
| |
| The feature section has the following structure: |
| a section descriptor array, each element contains the section information of one add_feature. |
| data section of feature 1 |
| data section of feature 2 |
| .... |
| |
| file feature section: |
| file_struct files[]; |
| |
| struct file_struct { |
| uint32_t size; // size of rest fields in file_struct |
| char file_path[]; |
| uint32_t file_type; |
| uint64_t min_vaddr; |
| uint32_t symbol_count; |
| struct { |
| uint64_t start_vaddr; |
| uint32_t len; |
| char symbol_name[len+1]; |
| } symbol_table[symbol_count]; |
| |
| uint32_t dex_file_offset_count; // Only when file_type = DSO_DEX_FILE |
| uint64_t dex_file_offsets[dex_file_offset_count]; // Only when file_type = DSO_DEX_FILE |
| uint64_t file_offset_of_min_vaddr; // Only when file_type = DSO_ELF_FILE |
| uint64_t memory_offset_of_min_vaddr; // Only when file_type = DSO_KERNEL_MODULE |
| }; |
| |
| meta_info feature section: |
| meta_info infos[]; |
| |
| struct meta_info { |
| char key[]; |
| char value[]; |
| }; |
| keys in meta_info feature section include: |
| simpleperf_version, |
| |
| debug_unwind feature section: |
| message DebugUnwindFeature from record_file.proto |
| |
| debug_unwind_file feature section: |
| data for file 1 |
| data for file 2 |
| ... |
| |
| The file list is stored in debug_unwind feature section. |
| |
| file2 feature section (used to replace file feature section): |
| uint32_t file_msg1_size; |
| FileFeature file_msg1; // FileFeature from record_file.proto |
| uint32_t file_msg2_size; |
| FileFeature file_msg2; |
| ... |
| |
| etm_branch_list feature section: |
| ETMBranchList etm_branch_list; // from etm_branch_list.proto |
| */ |
| |
| namespace simpleperf { |
| namespace PerfFileFormat { |
| |
| enum { |
| FEAT_RESERVED = 0, |
| FEAT_FIRST_FEATURE = 1, |
| FEAT_TRACING_DATA = 1, |
| FEAT_BUILD_ID, |
| FEAT_HOSTNAME, |
| FEAT_OSRELEASE, |
| FEAT_VERSION, |
| FEAT_ARCH, |
| FEAT_NRCPUS, |
| FEAT_CPUDESC, |
| FEAT_CPUID, |
| FEAT_TOTAL_MEM, |
| FEAT_CMDLINE, |
| FEAT_EVENT_DESC, |
| FEAT_CPU_TOPOLOGY, |
| FEAT_NUMA_TOPOLOGY, |
| FEAT_BRANCH_STACK, |
| FEAT_PMU_MAPPINGS, |
| FEAT_GROUP_DESC, |
| FEAT_AUXTRACE, |
| FEAT_LAST_FEATURE, |
| |
| FEAT_SIMPLEPERF_START = 128, |
| FEAT_FILE = FEAT_SIMPLEPERF_START, |
| FEAT_META_INFO, |
| FEAT_DEBUG_UNWIND, |
| FEAT_DEBUG_UNWIND_FILE, |
| FEAT_FILE2, |
| FEAT_ETM_BRANCH_LIST, |
| FEAT_MAX_NUM = 256, |
| }; |
| |
| std::string GetFeatureName(int feature_id); |
| int GetFeatureId(const std::string& feature_name); |
| |
| struct SectionDesc { |
| uint64_t offset; |
| uint64_t size; |
| }; |
| |
| constexpr char PERF_MAGIC[] = "PERFILE2"; |
| |
| struct FileHeader { |
| char magic[8]; |
| uint64_t header_size; |
| uint64_t attr_size; |
| SectionDesc attrs; |
| SectionDesc data; |
| SectionDesc event_types; |
| unsigned char features[FEAT_MAX_NUM / 8]; |
| }; |
| |
| struct FileAttr { |
| perf_event_attr attr; |
| SectionDesc ids; |
| }; |
| |
| } // namespace PerfFileFormat |
| } // namespace simpleperf |
| |
| #endif // SIMPLE_PERF_RECORD_FILE_FORMAT_H_ |