1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SRC_TRACED_PROBES_FTRACE_EVENT_INFO_CONSTANTS_H_ 18 #define SRC_TRACED_PROBES_FTRACE_EVENT_INFO_CONSTANTS_H_ 19 20 #include <stdint.h> 21 22 #include <string> 23 #include <vector> 24 25 #include "perfetto/base/logging.h" 26 #include "perfetto/protozero/proto_utils.h" 27 28 namespace perfetto { 29 30 enum FtraceFieldType { 31 kFtraceUint8 = 1, 32 kFtraceUint16, 33 kFtraceUint32, 34 kFtraceUint64, 35 kFtraceInt8, 36 kFtraceInt16, 37 kFtraceInt32, 38 kFtraceInt64, 39 kFtraceFixedCString, 40 kFtraceCString, 41 kFtraceStringPtr, 42 kFtraceBool, 43 kFtraceInode32, 44 kFtraceInode64, 45 kFtracePid32, 46 kFtraceCommonPid32, 47 kFtraceDevId32, 48 kFtraceDevId64, 49 kFtraceDataLoc, 50 }; 51 52 // Joint enum of FtraceFieldType (left) and ProtoFieldType (right). 53 // where there exists a way to convert from the FtraceFieldType 54 // into the ProtoFieldType. 55 enum TranslationStrategy { 56 kUint8ToUint32 = 1, 57 kUint8ToUint64, 58 kUint16ToUint32, 59 kUint16ToUint64, 60 kUint32ToUint32, 61 kUint32ToUint64, 62 kUint64ToUint64, 63 kInt8ToInt32, 64 kInt8ToInt64, 65 kInt16ToInt32, 66 kInt16ToInt64, 67 kInt32ToInt32, 68 kInt32ToInt64, 69 kInt64ToInt64, 70 kFixedCStringToString, 71 kCStringToString, 72 kStringPtrToString, 73 kBoolToUint32, 74 kBoolToUint64, 75 kInode32ToUint64, 76 kInode64ToUint64, 77 kPid32ToInt32, 78 kPid32ToInt64, 79 kCommonPid32ToInt32, 80 kCommonPid32ToInt64, 81 kDevId32ToUint64, 82 kDevId64ToUint64, 83 kDataLocToString, 84 }; 85 86 inline const char* ToString(FtraceFieldType v) { 87 switch (v) { 88 case kFtraceUint8: 89 return "uint8"; 90 case kFtraceUint16: 91 return "uint16"; 92 case kFtraceUint32: 93 return "uint32"; 94 case kFtraceUint64: 95 return "uint64"; 96 case kFtraceInt8: 97 return "int8"; 98 case kFtraceInt16: 99 return "int16"; 100 case kFtraceInt32: 101 return "int32"; 102 case kFtraceInt64: 103 return "int64"; 104 case kFtraceFixedCString: 105 return "fixed length null terminated string"; 106 case kFtraceCString: 107 return "null terminated string"; 108 case kFtraceStringPtr: 109 return "string ptr"; 110 case kFtraceBool: 111 return "bool"; 112 case kFtraceInode32: 113 return "inode32"; 114 case kFtraceInode64: 115 return "inode64"; 116 case kFtracePid32: 117 return "pid32"; 118 case kFtraceCommonPid32: 119 return "common_pid32"; 120 case kFtraceDevId32: 121 return "devid32"; 122 case kFtraceDevId64: 123 return "devid64"; 124 case kFtraceDataLoc: 125 return "__data_loc"; 126 } 127 // For gcc: 128 PERFETTO_FATAL("Not reached"); 129 return ""; 130 } 131 132 struct Field { 133 Field() = default; 134 Field(uint16_t offset, uint16_t size) 135 : ftrace_offset(offset), ftrace_size(size) {} 136 137 uint16_t ftrace_offset; 138 uint16_t ftrace_size; 139 FtraceFieldType ftrace_type; 140 const char* ftrace_name; 141 142 uint32_t proto_field_id; 143 protozero::proto_utils::ProtoSchemaType proto_field_type; 144 145 TranslationStrategy strategy; 146 }; 147 148 struct Event { 149 Event() = default; 150 Event(const char* event_name, const char* event_group) 151 : name(event_name), group(event_group) {} 152 153 const char* name; 154 const char* group; 155 std::vector<Field> fields; 156 uint32_t ftrace_event_id; 157 158 // Field id of the subevent proto (e.g. PrintFtraceEvent) in the FtraceEvent 159 // parent proto. 160 uint32_t proto_field_id; 161 162 // 'Size' of the event. Some caveats: some events (e.g. print) end with a null 163 // terminated string of unknown size. This size doesn't include the length of 164 // that string. 165 uint16_t size; 166 }; 167 168 // The compile time information needed to read the common fields from 169 // the raw ftrace buffer. 170 std::vector<Field> GetStaticCommonFieldsInfo(); 171 172 bool SetTranslationStrategy(FtraceFieldType ftrace, 173 protozero::proto_utils::ProtoSchemaType proto, 174 TranslationStrategy* out); 175 176 Field MakeField(const char* name, 177 uint32_t id, 178 protozero::proto_utils::ProtoSchemaType type); 179 180 } // namespace perfetto 181 182 #endif // SRC_TRACED_PROBES_FTRACE_EVENT_INFO_CONSTANTS_H_ 183