xref: /aosp_15_r20/external/sandboxed-api/sandboxed_api/sandbox2/syscall_defs.h (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
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