// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SANDBOX_LINUX_BPF_DSL_CODEGEN_H__ #define SANDBOX_LINUX_BPF_DSL_CODEGEN_H__ #include <stddef.h> #include <stdint.h> #include <map> #include <tuple> #include <vector> #include "sandbox/sandbox_export.h" struct sock_filter; namespace sandbox { // The code generator implements a basic assembler that can convert a // graph of BPF instructions into a well-formed array of BPF // instructions. Most notably, it ensures that jumps are always // forward and don't exceed the limit of 255 instructions imposed by // the instruction set. // // Callers would typically create a new CodeGen object and then use it // to build a DAG of instruction nodes. They'll eventually call // Compile() to convert this DAG to a Program. // // CodeGen gen; // CodeGen::Node allow, branch, dag; // // allow = // gen.MakeInstruction(BPF_RET+BPF_K, // ErrorCode(ErrorCode::ERR_ALLOWED).err())); // branch = // gen.MakeInstruction(BPF_JMP+BPF_EQ+BPF_K, __NR_getpid, // Trap(GetPidHandler, NULL), allow); // dag = // gen.MakeInstruction(BPF_LD+BPF_W+BPF_ABS, // offsetof(struct arch_seccomp_data, nr), branch); // // // Simplified code follows; in practice, it is important to avoid calling // // any C++ destructors after starting the sandbox. // CodeGen::Program program = gen.Compile(dag); // const struct sock_fprog prog = { // static_cast<unsigned short>(program.size()), &program[0] }; // prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); // class SANDBOX_EXPORT CodeGen { … }; } // namespace sandbox #endif // SANDBOX_LINUX_BPF_DSL_CODEGEN_H__