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