1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_KERNEL_UTILS_SYSCALL_TABLE_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_KERNEL_UTILS_SYSCALL_TABLE_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <optional> 21*6dbdd20aSAndroid Build Coastguard Worker #include <string> 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_view.h" 24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/utils.h" 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Worker static constexpr size_t kMaxSyscalls = 550; 29*6dbdd20aSAndroid Build Coastguard Worker 30*6dbdd20aSAndroid Build Coastguard Worker enum class Architecture { 31*6dbdd20aSAndroid Build Coastguard Worker kUnknown = 0, 32*6dbdd20aSAndroid Build Coastguard Worker kArm64, 33*6dbdd20aSAndroid Build Coastguard Worker kArm32, 34*6dbdd20aSAndroid Build Coastguard Worker kX86_64, 35*6dbdd20aSAndroid Build Coastguard Worker kX86, 36*6dbdd20aSAndroid Build Coastguard Worker }; 37*6dbdd20aSAndroid Build Coastguard Worker 38*6dbdd20aSAndroid Build Coastguard Worker class SyscallTable { 39*6dbdd20aSAndroid Build Coastguard Worker public: 40*6dbdd20aSAndroid Build Coastguard Worker using OffT = uint16_t; 41*6dbdd20aSAndroid Build Coastguard Worker // Exposed for testing. 42*6dbdd20aSAndroid Build Coastguard Worker template <typename Table> Load()43*6dbdd20aSAndroid Build Coastguard Worker static SyscallTable Load() { 44*6dbdd20aSAndroid Build Coastguard Worker static_assert(base::ArraySize(Table::offsets) <= kMaxSyscalls, 45*6dbdd20aSAndroid Build Coastguard Worker "kMaxSyscalls too small"); 46*6dbdd20aSAndroid Build Coastguard Worker return SyscallTable(Table::names, Table::offsets, 47*6dbdd20aSAndroid Build Coastguard Worker base::ArraySize(Table::offsets)); 48*6dbdd20aSAndroid Build Coastguard Worker } 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard Worker explicit SyscallTable(Architecture arch); 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker // Return the architecture enum for the given uname machine string. 53*6dbdd20aSAndroid Build Coastguard Worker static Architecture ArchFromString(base::StringView machine); 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker // Returns the syscall table based on the current machine's architecture. Only 56*6dbdd20aSAndroid Build Coastguard Worker // works on Linux based systems. 57*6dbdd20aSAndroid Build Coastguard Worker static SyscallTable FromCurrentArch(); 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker // Returns the syscall id for the syscall with the given name. If the syscall 60*6dbdd20aSAndroid Build Coastguard Worker // is not found, returns std::nullopt. 61*6dbdd20aSAndroid Build Coastguard Worker std::optional<size_t> GetByName(const std::string& name) const; 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker // Returns the syscall name for the syscall with the given id. If the syscall 64*6dbdd20aSAndroid Build Coastguard Worker // is not found, returns nullptr. 65*6dbdd20aSAndroid Build Coastguard Worker const char* GetById(size_t id) const; 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker private: SyscallTable(const char * names,const OffT * off,size_t count)68*6dbdd20aSAndroid Build Coastguard Worker SyscallTable(const char* names, const OffT* off, size_t count) 69*6dbdd20aSAndroid Build Coastguard Worker : syscall_names_(names), syscall_offsets_(off), syscall_count_(count) {} 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker const char* syscall_names_ = ""; 72*6dbdd20aSAndroid Build Coastguard Worker const OffT* syscall_offsets_ = {}; 73*6dbdd20aSAndroid Build Coastguard Worker size_t syscall_count_ = 0; 74*6dbdd20aSAndroid Build Coastguard Worker }; 75*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 76*6dbdd20aSAndroid Build Coastguard Worker 77*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_KERNEL_UTILS_SYSCALL_TABLE_H_ 78