15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SANDBOX_LINUX_SECCOMP_BPF_INSTRUCTION_H__
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SANDBOX_LINUX_SECCOMP_BPF_INSTRUCTION_H__
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace sandbox {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The fields in this structure have the same meaning as the corresponding
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fields in "struct sock_filter". See <linux/filter.h> for a lot more
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// detail.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code     -- Opcode of the instruction. This is typically a bitwise
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             combination BPF_XXX values.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// k        -- Operand; BPF instructions take zero or one operands. Operands
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             are 32bit-wide constants, if present. They can be immediate
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             values (if BPF_K is present in "code_"), addresses (if BPF_ABS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             is present in "code_"), or relative jump offsets (if BPF_JMP
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             and BPF_JA are present in "code_").
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// jt, jf   -- all conditional jumps have a 8bit-wide jump offset that allows
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             jumps of up to 256 instructions forward. Conditional jumps are
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             identified by BPF_JMP in "code_", but the lack of BPF_JA.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//             Conditional jumps have a "t"rue and "f"alse branch.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Instruction {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructor for an non-jumping instruction or for an unconditional
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "always" jump.
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Instruction(uint16_t c, uint32_t parm, Instruction* n)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : code(c), next(n), k(parm) {}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructor for a conditional jump instruction.
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Instruction(uint16_t c, uint32_t parm, Instruction* jt, Instruction* jf)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : code(c), jt_ptr(jt), jf_ptr(jf), k(parm) {}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16_t code;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When code generation is complete, we will have computed relative
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // branch targets that are in the range 0..255.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint8_t jt, jf;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // While assembling the BPF program, we use pointers for branch targets.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Once we have computed basic blocks, these pointers will be entered as
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // keys in a TargetsToBlocks map and should no longer be dereferenced
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // directly.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct {
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Instruction* jt_ptr, *jf_ptr;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // While assembling the BPF program, non-jumping instructions are linked
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // by the "next_" pointer. This field is no longer needed when we have
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // computed basic blocks.
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Instruction* next;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t k;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace sandbox
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SANDBOX_LINUX_SECCOMP_BPF_INSTRUCTION_H__
63