1*ec63e07aSXin Li #ifndef SANDBOXED_API_SANDBOX2_SYSCALL_DEFS_H_ 2*ec63e07aSXin Li #define SANDBOXED_API_SANDBOX2_SYSCALL_DEFS_H_ 3*ec63e07aSXin Li 4*ec63e07aSXin Li #include <sys/types.h> 5*ec63e07aSXin Li 6*ec63e07aSXin Li #include <array> 7*ec63e07aSXin Li #include <cstdint> 8*ec63e07aSXin Li #include <string> 9*ec63e07aSXin Li #include <vector> 10*ec63e07aSXin Li 11*ec63e07aSXin Li #include "absl/status/statusor.h" 12*ec63e07aSXin Li #include "absl/strings/string_view.h" 13*ec63e07aSXin Li #include "absl/types/span.h" 14*ec63e07aSXin Li #include "sandboxed_api/config.h" 15*ec63e07aSXin Li #include "sandboxed_api/sandbox2/syscall.h" 16*ec63e07aSXin Li 17*ec63e07aSXin Li namespace sandbox2 { 18*ec63e07aSXin Li namespace syscalls { 19*ec63e07aSXin Li 20*ec63e07aSXin Li constexpr int kMaxArgs = 6; 21*ec63e07aSXin Li 22*ec63e07aSXin Li // Type of a given syscall argument. Used with argument conversion routines. 23*ec63e07aSXin Li enum ArgType { 24*ec63e07aSXin Li kGen = 1, 25*ec63e07aSXin Li kInt, 26*ec63e07aSXin Li kPath, 27*ec63e07aSXin Li kHex, 28*ec63e07aSXin Li kOct, 29*ec63e07aSXin Li kSocketCall, 30*ec63e07aSXin Li kSocketCallPtr, 31*ec63e07aSXin Li kSignal, 32*ec63e07aSXin Li kString, 33*ec63e07aSXin Li kAddressFamily, 34*ec63e07aSXin Li kSockaddr, 35*ec63e07aSXin Li kSockmsghdr, 36*ec63e07aSXin Li kCloneFlag, 37*ec63e07aSXin Li }; 38*ec63e07aSXin Li 39*ec63e07aSXin Li } // namespace syscalls 40*ec63e07aSXin Li 41*ec63e07aSXin Li class SyscallTable { 42*ec63e07aSXin Li public: 43*ec63e07aSXin Li // Single syscall definition 44*ec63e07aSXin Li struct Entry { 45*ec63e07aSXin Li // Returns the number of arguments which given syscall takes. GetNumArgsEntry46*ec63e07aSXin Li int GetNumArgs() const { 47*ec63e07aSXin Li if (num_args < 0 || num_args > syscalls::kMaxArgs) { 48*ec63e07aSXin Li return syscalls::kMaxArgs; 49*ec63e07aSXin Li } 50*ec63e07aSXin Li return num_args; 51*ec63e07aSXin Li } 52*ec63e07aSXin Li 53*ec63e07aSXin Li static std::string GetArgumentDescription(uint64_t value, 54*ec63e07aSXin Li syscalls::ArgType type, 55*ec63e07aSXin Li pid_t pid); 56*ec63e07aSXin Li BySyscallNrEntry57*ec63e07aSXin Li static constexpr bool BySyscallNr(const SyscallTable::Entry& a, 58*ec63e07aSXin Li const SyscallTable::Entry& b) { 59*ec63e07aSXin Li return a.nr < b.nr; 60*ec63e07aSXin Li } 61*ec63e07aSXin Li 62*ec63e07aSXin Li int nr; 63*ec63e07aSXin Li absl::string_view name; 64*ec63e07aSXin Li int num_args; 65*ec63e07aSXin Li std::array<syscalls::ArgType, syscalls::kMaxArgs> arg_types; 66*ec63e07aSXin Li }; 67*ec63e07aSXin Li 68*ec63e07aSXin Li // Returns the syscall table for the architecture. 69*ec63e07aSXin Li static SyscallTable get(sapi::cpu::Architecture arch); 70*ec63e07aSXin Li size()71*ec63e07aSXin Li int size() { return data_.size(); } 72*ec63e07aSXin Li 73*ec63e07aSXin Li absl::string_view GetName(int syscall) const; 74*ec63e07aSXin Li 75*ec63e07aSXin Li std::vector<std::string> GetArgumentsDescription(int syscall, 76*ec63e07aSXin Li const uint64_t values[], 77*ec63e07aSXin Li pid_t pid) const; 78*ec63e07aSXin Li 79*ec63e07aSXin Li absl::StatusOr<Entry> GetEntry(int syscall) const; 80*ec63e07aSXin Li // Returns the first entry matching the provided name. 81*ec63e07aSXin Li absl::StatusOr<Entry> GetEntry(absl::string_view name) const; 82*ec63e07aSXin Li GetEntries()83*ec63e07aSXin Li absl::Span<const Entry> GetEntries() const { return data_; } 84*ec63e07aSXin Li 85*ec63e07aSXin Li private: 86*ec63e07aSXin Li constexpr SyscallTable() = default; SyscallTable(absl::Span<const Entry> data)87*ec63e07aSXin Li explicit constexpr SyscallTable(absl::Span<const Entry> data) : data_(data) {} 88*ec63e07aSXin Li 89*ec63e07aSXin Li const absl::Span<const Entry> data_; 90*ec63e07aSXin Li }; 91*ec63e07aSXin Li 92*ec63e07aSXin Li } // namespace sandbox2 93*ec63e07aSXin Li 94*ec63e07aSXin Li #endif // SANDBOXED_API_SANDBOX2_SYSCALL_DEFS_H_ 95