1*aab831ceSchristos /* bpf.h - BPF opcode list for binutils. 2*aab831ceSchristos Copyright (C) 2023-2024 Free Software Foundation, Inc. 3*aab831ceSchristos 4*aab831ceSchristos Contributed by Oracle Inc. 5*aab831ceSchristos 6*aab831ceSchristos This file is part of the GNU binutils. 7*aab831ceSchristos 8*aab831ceSchristos This is free software; you can redistribute them and/or modify them 9*aab831ceSchristos under the terms of the GNU General Public License as published by 10*aab831ceSchristos the Free Software Foundation; either version 3, or (at your option) 11*aab831ceSchristos any later version. 12*aab831ceSchristos 13*aab831ceSchristos This program is distributed in the hope that it will be useful, but 14*aab831ceSchristos WITHOUT ANY WARRANTY; without even the implied warranty of 15*aab831ceSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*aab831ceSchristos General Public License for more details. 17*aab831ceSchristos 18*aab831ceSchristos You should have received a copy of the GNU General Public License 19*aab831ceSchristos along with this program; see the file COPYING3. If not, 20*aab831ceSchristos see <http://www.gnu.org/licenses/>. */ 21*aab831ceSchristos 22*aab831ceSchristos #ifndef _BPF_H_ 23*aab831ceSchristos #define _BPF_H_ 24*aab831ceSchristos 25*aab831ceSchristos #include <stdint.h> 26*aab831ceSchristos 27*aab831ceSchristos /* The BPF ISA has little-endian and big-endian variants. */ 28*aab831ceSchristos 29*aab831ceSchristos enum bpf_endian 30*aab831ceSchristos { 31*aab831ceSchristos BPF_ENDIAN_LITTLE, 32*aab831ceSchristos BPF_ENDIAN_BIG 33*aab831ceSchristos }; 34*aab831ceSchristos 35*aab831ceSchristos /* Most BPF instructions are conformed by a single 64-bit instruction 36*aab831ceSchristos word. The lddw instruction is conformed by two consecutive 64-bit 37*aab831ceSchristos instruction words. */ 38*aab831ceSchristos 39*aab831ceSchristos typedef uint64_t bpf_insn_word; 40*aab831ceSchristos 41*aab831ceSchristos /* There are several versions of the BPF ISA. */ 42*aab831ceSchristos 43*aab831ceSchristos #define BPF_V1 0x1 44*aab831ceSchristos #define BPF_V2 0x2 45*aab831ceSchristos #define BPF_V3 0x3 46*aab831ceSchristos #define BPF_V4 0x4 47*aab831ceSchristos #define BPF_XBPF 0xf 48*aab831ceSchristos 49*aab831ceSchristos /* Masks for the several instruction fields in a BPF instruction. 50*aab831ceSchristos These assume big-endian BPF instructions. */ 51*aab831ceSchristos 52*aab831ceSchristos #define BPF_CODE 0xff00000000000000UL 53*aab831ceSchristos #define BPF_REGS 0x00ff000000000000UL 54*aab831ceSchristos #define BPF_DST 0x00f0000000000000UL 55*aab831ceSchristos #define BPF_SRC 0x000f000000000000UL 56*aab831ceSchristos #define BPF_OFFSET16 0x0000ffff00000000UL 57*aab831ceSchristos #define BPF_IMM32 0x00000000ffffffffUL 58*aab831ceSchristos 59*aab831ceSchristos /* The BPF opcode instruction field is eight bits long and its 60*aab831ceSchristos interpretation depends on the instruction class. 61*aab831ceSchristos 62*aab831ceSchristos For arithmetic and jump instructions the 8-bit opcode field is 63*aab831ceSchristos subdivided in: 64*aab831ceSchristos 65*aab831ceSchristos op-code:4 op-src:1 op-class:3 66*aab831ceSchristos 67*aab831ceSchristos For load/store instructions, the 8-bit opcode field is subdivided 68*aab831ceSchristos in: 69*aab831ceSchristos 70*aab831ceSchristos op-mode:3 op-size:2 op-class:3 71*aab831ceSchristos 72*aab831ceSchristos All the constants defined below are to be applied on the first 73*aab831ceSchristos 64-bit word of a BPF instruction. Please define them assuming 74*aab831ceSchristos big-endian instructions; the matching and writing routines using 75*aab831ceSchristos the instruction table know how to handle the endianness groups. */ 76*aab831ceSchristos 77*aab831ceSchristos #define BPF_SRC_X ((uint64_t)0x08 << 56) 78*aab831ceSchristos #define BPF_SRC_K ((uint64_t)0x00 << 56) 79*aab831ceSchristos 80*aab831ceSchristos #define BPF_CODE_ADD ((uint64_t)0x00 << 56) 81*aab831ceSchristos #define BPF_CODE_SUB ((uint64_t)0x10 << 56) 82*aab831ceSchristos #define BPF_CODE_MUL ((uint64_t)0x20 << 56) 83*aab831ceSchristos #define BPF_CODE_DIV ((uint64_t)0x30 << 56) 84*aab831ceSchristos #define BPF_CODE_OR ((uint64_t)0x40 << 56) 85*aab831ceSchristos #define BPF_CODE_AND ((uint64_t)0x50 << 56) 86*aab831ceSchristos #define BPF_CODE_LSH ((uint64_t)0x60 << 56) 87*aab831ceSchristos #define BPF_CODE_RSH ((uint64_t)0x70 << 56) 88*aab831ceSchristos #define BPF_CODE_NEG ((uint64_t)0x80 << 56) 89*aab831ceSchristos #define BPF_CODE_MOD ((uint64_t)0x90 << 56) 90*aab831ceSchristos #define BPF_CODE_XOR ((uint64_t)0xa0 << 56) 91*aab831ceSchristos #define BPF_CODE_MOV ((uint64_t)0xb0 << 56) 92*aab831ceSchristos #define BPF_CODE_ARSH ((uint64_t)0xc0 << 56) 93*aab831ceSchristos #define BPF_CODE_END ((uint64_t)0xd0 << 56) 94*aab831ceSchristos 95*aab831ceSchristos #define BPF_CODE_JA ((uint64_t)0x00 << 56) 96*aab831ceSchristos #define BPF_CODE_JEQ ((uint64_t)0x10 << 56) 97*aab831ceSchristos #define BPF_CODE_JGT ((uint64_t)0x20 << 56) 98*aab831ceSchristos #define BPF_CODE_JGE ((uint64_t)0x30 << 56) 99*aab831ceSchristos #define BPF_CODE_JSET ((uint64_t)0x40 << 56) 100*aab831ceSchristos #define BPF_CODE_JNE ((uint64_t)0x50 << 56) 101*aab831ceSchristos #define BPF_CODE_JSGT ((uint64_t)0x60 << 56) 102*aab831ceSchristos #define BPF_CODE_JSGE ((uint64_t)0x70 << 56) 103*aab831ceSchristos #define BPF_CODE_CALL ((uint64_t)0x80 << 56) 104*aab831ceSchristos #define BPF_CODE_EXIT ((uint64_t)0x90 << 56) 105*aab831ceSchristos #define BPF_CODE_JLT ((uint64_t)0xa0 << 56) 106*aab831ceSchristos #define BPF_CODE_JLE ((uint64_t)0xb0 << 56) 107*aab831ceSchristos #define BPF_CODE_JSLT ((uint64_t)0xc0 << 56) 108*aab831ceSchristos #define BPF_CODE_JSLE ((uint64_t)0xd0 << 56) 109*aab831ceSchristos 110*aab831ceSchristos #define BPF_MODE_IMM ((uint64_t)0x00 << 56) 111*aab831ceSchristos #define BPF_MODE_ABS ((uint64_t)0x20 << 56) 112*aab831ceSchristos #define BPF_MODE_IND ((uint64_t)0x40 << 56) 113*aab831ceSchristos #define BPF_MODE_MEM ((uint64_t)0x60 << 56) 114*aab831ceSchristos #define BPF_MODE_ATOMIC ((uint64_t)0xc0 << 56) 115*aab831ceSchristos #define BPF_MODE_SMEM ((uint64_t)0x80 << 56) 116*aab831ceSchristos 117*aab831ceSchristos #define BPF_SIZE_W ((uint64_t)0x00 << 56) 118*aab831ceSchristos #define BPF_SIZE_H ((uint64_t)0x08 << 56) 119*aab831ceSchristos #define BPF_SIZE_B ((uint64_t)0x10 << 56) 120*aab831ceSchristos #define BPF_SIZE_DW ((uint64_t)0x18 << 56) 121*aab831ceSchristos 122*aab831ceSchristos #define BPF_CLASS_LD ((uint64_t)0x00 << 56) 123*aab831ceSchristos #define BPF_CLASS_LDX ((uint64_t)0x01 << 56) 124*aab831ceSchristos #define BPF_CLASS_ST ((uint64_t)0x02 << 56) 125*aab831ceSchristos #define BPF_CLASS_STX ((uint64_t)0x03 << 56) 126*aab831ceSchristos #define BPF_CLASS_ALU ((uint64_t)0x04 << 56) 127*aab831ceSchristos #define BPF_CLASS_JMP ((uint64_t)0x05 << 56) 128*aab831ceSchristos #define BPF_CLASS_JMP32 ((uint64_t)0x06 << 56) 129*aab831ceSchristos #define BPF_CLASS_ALU64 ((uint64_t)0x07 << 56) 130*aab831ceSchristos 131*aab831ceSchristos /* Certain instructions (ab)use other instruction fields as opcodes, 132*aab831ceSchristos even if these are multi-byte or infra-byte. Bleh. */ 133*aab831ceSchristos 134*aab831ceSchristos #define BPF_OFFSET16_SDIVMOD ((uint64_t)0x1 << 32) 135*aab831ceSchristos #define BPF_OFFSET16_MOVS8 ((uint64_t)8 << 32) 136*aab831ceSchristos #define BPF_OFFSET16_MOVS16 ((uint64_t)16 << 32) 137*aab831ceSchristos #define BPF_OFFSET16_MOVS32 ((uint64_t)32 << 32) 138*aab831ceSchristos 139*aab831ceSchristos #define BPF_IMM32_END16 ((uint64_t)0x00000010) 140*aab831ceSchristos #define BPF_IMM32_END32 ((uint64_t)0x00000020) 141*aab831ceSchristos #define BPF_IMM32_END64 ((uint64_t)0x00000040) 142*aab831ceSchristos 143*aab831ceSchristos #define BPF_IMM32_BSWAP16 ((uint64_t)0x00000010) 144*aab831ceSchristos #define BPF_IMM32_BSWAP32 ((uint64_t)0x00000020) 145*aab831ceSchristos #define BPF_IMM32_BSWAP64 ((uint64_t)0x00000040) 146*aab831ceSchristos 147*aab831ceSchristos #define BPF_IMM32_AADD ((uint64_t)0x00000000) 148*aab831ceSchristos #define BPF_IMM32_AOR ((uint64_t)0x00000040) 149*aab831ceSchristos #define BPF_IMM32_AAND ((uint64_t)0x00000050) 150*aab831ceSchristos #define BPF_IMM32_AXOR ((uint64_t)0x000000a0) 151*aab831ceSchristos #define BPF_IMM32_AFADD ((uint64_t)0x00000001) 152*aab831ceSchristos #define BPF_IMM32_AFOR ((uint64_t)0x00000041) 153*aab831ceSchristos #define BPF_IMM32_AFAND ((uint64_t)0x00000051) 154*aab831ceSchristos #define BPF_IMM32_AFXOR ((uint64_t)0x000000a1) 155*aab831ceSchristos #define BPF_IMM32_AXCHG ((uint64_t)0x000000e1) 156*aab831ceSchristos #define BPF_IMM32_ACMP ((uint64_t)0x000000f1) 157*aab831ceSchristos 158*aab831ceSchristos /* Unique identifiers for BPF instructions. */ 159*aab831ceSchristos 160*aab831ceSchristos enum bpf_insn_id 161*aab831ceSchristos { 162*aab831ceSchristos BPF_NOINSN = 0, 163*aab831ceSchristos /* 64-bit load instruction. */ 164*aab831ceSchristos BPF_INSN_LDDW, 165*aab831ceSchristos /* ALU instructions. */ 166*aab831ceSchristos BPF_INSN_ADDR, BPF_INSN_ADDI, BPF_INSN_SUBR, BPF_INSN_SUBI, 167*aab831ceSchristos BPF_INSN_MULR, BPF_INSN_MULI, BPF_INSN_SDIVR, BPF_INSN_SDIVI, 168*aab831ceSchristos BPF_INSN_SMODR, BPF_INSN_SMODI, BPF_INSN_DIVR, BPF_INSN_DIVI, 169*aab831ceSchristos BPF_INSN_MODR, BPF_INSN_MODI, BPF_INSN_ORR, BPF_INSN_ORI, 170*aab831ceSchristos BPF_INSN_ANDR, BPF_INSN_ANDI, BPF_INSN_XORR, BPF_INSN_XORI, 171*aab831ceSchristos BPF_INSN_NEGR, BPF_INSN_LSHR, BPF_INSN_LSHI, 172*aab831ceSchristos BPF_INSN_RSHR, BPF_INSN_RSHI, BPF_INSN_ARSHR, BPF_INSN_ARSHI, 173*aab831ceSchristos BPF_INSN_MOVS8R, BPF_INSN_MOVS16R, BPF_INSN_MOVS32R, 174*aab831ceSchristos BPF_INSN_MOVR, BPF_INSN_MOVI, 175*aab831ceSchristos /* ALU32 instructions. */ 176*aab831ceSchristos BPF_INSN_ADD32R, BPF_INSN_ADD32I, BPF_INSN_SUB32R, BPF_INSN_SUB32I, 177*aab831ceSchristos BPF_INSN_MUL32R, BPF_INSN_MUL32I, BPF_INSN_SDIV32R, BPF_INSN_SDIV32I, 178*aab831ceSchristos BPF_INSN_SMOD32R, BPF_INSN_SMOD32I, BPF_INSN_DIV32R, BPF_INSN_DIV32I, 179*aab831ceSchristos BPF_INSN_MOD32R, BPF_INSN_MOD32I, BPF_INSN_OR32R, BPF_INSN_OR32I, 180*aab831ceSchristos BPF_INSN_AND32R, BPF_INSN_AND32I, BPF_INSN_XOR32R, BPF_INSN_XOR32I, 181*aab831ceSchristos BPF_INSN_NEG32R, BPF_INSN_LSH32R, BPF_INSN_LSH32I, 182*aab831ceSchristos BPF_INSN_RSH32R, BPF_INSN_RSH32I, BPF_INSN_ARSH32R, BPF_INSN_ARSH32I, 183*aab831ceSchristos BPF_INSN_MOVS328R, BPF_INSN_MOVS3216R, BPF_INSN_MOVS3232R, 184*aab831ceSchristos BPF_INSN_MOV32R, BPF_INSN_MOV32I, 185*aab831ceSchristos /* Byte swap instructions. */ 186*aab831ceSchristos BPF_INSN_BSWAP16, BPF_INSN_BSWAP32, BPF_INSN_BSWAP64, 187*aab831ceSchristos /* Endianness conversion instructions. */ 188*aab831ceSchristos BPF_INSN_ENDLE16, BPF_INSN_ENDLE32, BPF_INSN_ENDLE64, 189*aab831ceSchristos BPF_INSN_ENDBE16, BPF_INSN_ENDBE32, BPF_INSN_ENDBE64, 190*aab831ceSchristos /* Absolute load instructions. */ 191*aab831ceSchristos BPF_INSN_LDABSB, BPF_INSN_LDABSH, BPF_INSN_LDABSW, 192*aab831ceSchristos /* Indirect load instructions. */ 193*aab831ceSchristos BPF_INSN_LDINDB, BPF_INSN_LDINDH, BPF_INSN_LDINDW, 194*aab831ceSchristos /* Generic load instructions (to register.) */ 195*aab831ceSchristos BPF_INSN_LDXB, BPF_INSN_LDXH, BPF_INSN_LDXW, BPF_INSN_LDXDW, 196*aab831ceSchristos /* Generic signed load instructions. */ 197*aab831ceSchristos BPF_INSN_LDXSB, BPF_INSN_LDXSH, BPF_INSN_LDXSW, BPF_INSN_LDXSDW, 198*aab831ceSchristos /* Generic store instructions (from register.) */ 199*aab831ceSchristos BPF_INSN_STXBR, BPF_INSN_STXHR, BPF_INSN_STXWR, BPF_INSN_STXDWR, 200*aab831ceSchristos BPF_INSN_STXBI, BPF_INSN_STXHI, BPF_INSN_STXWI, BPF_INSN_STXDWI, 201*aab831ceSchristos /* Compare-and-jump instructions (reg OP reg.) */ 202*aab831ceSchristos BPF_INSN_JAR, BPF_INSN_JEQR, BPF_INSN_JGTR, BPF_INSN_JSGTR, 203*aab831ceSchristos BPF_INSN_JGER, BPF_INSN_JSGER, BPF_INSN_JLTR, BPF_INSN_JSLTR, 204*aab831ceSchristos BPF_INSN_JSLER, BPF_INSN_JLER, BPF_INSN_JSETR, BPF_INSN_JNER, 205*aab831ceSchristos BPF_INSN_CALLR, BPF_INSN_CALL, BPF_INSN_EXIT, 206*aab831ceSchristos /* Compare-and-jump instructions (reg OP imm.) */ 207*aab831ceSchristos BPF_INSN_JEQI, BPF_INSN_JGTI, BPF_INSN_JSGTI, 208*aab831ceSchristos BPF_INSN_JGEI, BPF_INSN_JSGEI, BPF_INSN_JLTI, BPF_INSN_JSLTI, 209*aab831ceSchristos BPF_INSN_JSLEI, BPF_INSN_JLEI, BPF_INSN_JSETI, BPF_INSN_JNEI, 210*aab831ceSchristos /* jump-always with 32-bit offset. */ 211*aab831ceSchristos BPF_INSN_JAL, 212*aab831ceSchristos /* 32-bit compare-and-jump instructions (reg OP reg.) */ 213*aab831ceSchristos BPF_INSN_JEQ32R, BPF_INSN_JGT32R, BPF_INSN_JSGT32R, 214*aab831ceSchristos BPF_INSN_JGE32R, BPF_INSN_JSGE32R, BPF_INSN_JLT32R, BPF_INSN_JSLT32R, 215*aab831ceSchristos BPF_INSN_JSLE32R, BPF_INSN_JLE32R, BPF_INSN_JSET32R, BPF_INSN_JNE32R, 216*aab831ceSchristos /* 32-bit compare-and-jump instructions (reg OP imm.) */ 217*aab831ceSchristos BPF_INSN_JEQ32I, BPF_INSN_JGT32I, BPF_INSN_JSGT32I, 218*aab831ceSchristos BPF_INSN_JGE32I, BPF_INSN_JSGE32I, BPF_INSN_JLT32I, BPF_INSN_JSLT32I, 219*aab831ceSchristos BPF_INSN_JSLE32I, BPF_INSN_JLE32I, BPF_INSN_JSET32I, BPF_INSN_JNE32I, 220*aab831ceSchristos /* Atomic instructions. */ 221*aab831ceSchristos BPF_INSN_AADD, BPF_INSN_AOR, BPF_INSN_AAND, BPF_INSN_AXOR, 222*aab831ceSchristos /* Atomic instructions with fetching. */ 223*aab831ceSchristos BPF_INSN_AFADD, BPF_INSN_AFOR, BPF_INSN_AFAND, BPF_INSN_AFXOR, 224*aab831ceSchristos /* Atomic instructions (32-bit.) */ 225*aab831ceSchristos BPF_INSN_AADD32, BPF_INSN_AOR32, BPF_INSN_AAND32, BPF_INSN_AXOR32, 226*aab831ceSchristos /* Atomic instructions with fetching (32-bit.) */ 227*aab831ceSchristos BPF_INSN_AFADD32, BPF_INSN_AFOR32, BPF_INSN_AFAND32, BPF_INSN_AFXOR32, 228*aab831ceSchristos /* Atomic compare-and-swap, atomic exchange. */ 229*aab831ceSchristos BPF_INSN_ACMP, BPF_INSN_AXCHG, 230*aab831ceSchristos /* Atomic compare-and-swap, atomic exchange (32-bit). */ 231*aab831ceSchristos BPF_INSN_ACMP32, BPF_INSN_AXCHG32, 232*aab831ceSchristos /* GNU simulator specific instruction. */ 233*aab831ceSchristos BPF_INSN_BRKPT, 234*aab831ceSchristos }; 235*aab831ceSchristos 236*aab831ceSchristos /* Entry for a BPF instruction in the opcodes table. */ 237*aab831ceSchristos 238*aab831ceSchristos struct bpf_opcode 239*aab831ceSchristos { 240*aab831ceSchristos /* Unique numerical code for the instruction. */ 241*aab831ceSchristos enum bpf_insn_id id; 242*aab831ceSchristos 243*aab831ceSchristos /* The instruction template defines both the syntax of the 244*aab831ceSchristos instruction and the set of the different operands that appear in 245*aab831ceSchristos the instruction. 246*aab831ceSchristos 247*aab831ceSchristos Tags: 248*aab831ceSchristos %% - literal %. 249*aab831ceSchristos %dr - destination 64-bit register. 250*aab831ceSchristos %dw - destination 32-bit register. 251*aab831ceSchristos %sr - source 64-bit register. 252*aab831ceSchristos %sw - source 32-bit register. 253*aab831ceSchristos %d32 - 32-bit signed displacement (in 64-bit words minus one.) 254*aab831ceSchristos %d16 - 16-bit signed displacement (in 64-bit words minus one.) 255*aab831ceSchristos %o16 - 16-bit signed offset (in bytes.) 256*aab831ceSchristos %i32 - 32-bit signed immediate. 257*aab831ceSchristos %I32 - Like %i32. 258*aab831ceSchristos %i64 - 64-bit signed immediate. 259*aab831ceSchristos %w - expect zero or more white spaces and print a single space. 260*aab831ceSchristos %W - expect one or more white spaces and print a single space. 261*aab831ceSchristos 262*aab831ceSchristos When parsing and printing %o16 and %I32 (but not %i32) an 263*aab831ceSchristos explicit sign is always expected and included. Therefore, to 264*aab831ceSchristos denote something like `[%r3 + 10]', please use a template like `[ 265*aab831ceSchristos %sr %o16]' instead of `[ %sr + %o16 ]'. 266*aab831ceSchristos 267*aab831ceSchristos If %dr, %dw, %sr or %sw are found multiple times in a template, 268*aab831ceSchristos they refer to the same register, i.e. `%rd = le64 %rd' denotes 269*aab831ceSchristos `r2 = le64 r2', but not `r2 = le64 r1'. 270*aab831ceSchristos 271*aab831ceSchristos If %i64 appears in a template then the instruction is 128-bits 272*aab831ceSchristos long and composed by two consecutive 64-bit instruction words. 273*aab831ceSchristos 274*aab831ceSchristos A white space character means to expect zero or more white 275*aab831ceSchristos spaces, and to print no space. 276*aab831ceSchristos 277*aab831ceSchristos There are two templates defined per instruction, corresponding to 278*aab831ceSchristos two used different dialects: a "normal" assembly-like syntax and 279*aab831ceSchristos a "pseudo-c" syntax. Some toolchains support just one of these 280*aab831ceSchristos dialects. The GNU Toolchain supports both. */ 281*aab831ceSchristos const char *normal; 282*aab831ceSchristos const char *pseudoc; 283*aab831ceSchristos 284*aab831ceSchristos /* The version that introduced this instruction. Instructions are 285*aab831ceSchristos generally not removed once they get introduced. */ 286*aab831ceSchristos uint8_t version; 287*aab831ceSchristos 288*aab831ceSchristos /* Maks marking the opcode fields in the instruction, and the 289*aab831ceSchristos opcodes characterizing it. 290*aab831ceSchristos 291*aab831ceSchristos In multi-word instructions these apply to the first word in the 292*aab831ceSchristos instruction. Note that these values assumes big-endian 293*aab831ceSchristos instructions; code using these field must be aware of the 294*aab831ceSchristos endianness groups to which BPF instructions must conform to and 295*aab831ceSchristos DTRT. */ 296*aab831ceSchristos bpf_insn_word mask; 297*aab831ceSchristos bpf_insn_word opcode; 298*aab831ceSchristos }; 299*aab831ceSchristos 300*aab831ceSchristos /* Try to match a BPF instruction given its first instruction word. 301*aab831ceSchristos If no matching instruction is found, return NULL. */ 302*aab831ceSchristos 303*aab831ceSchristos const struct bpf_opcode *bpf_match_insn (bpf_insn_word word, 304*aab831ceSchristos enum bpf_endian endian, 305*aab831ceSchristos int version); 306*aab831ceSchristos 307*aab831ceSchristos /* Operand extractors. 308*aab831ceSchristos 309*aab831ceSchristos These all get big-endian instruction words. Note how the extractor 310*aab831ceSchristos for 64-bit signed immediates requires two instruction words. */ 311*aab831ceSchristos 312*aab831ceSchristos uint8_t bpf_extract_src (bpf_insn_word word, enum bpf_endian endian); 313*aab831ceSchristos uint8_t bpf_extract_dst (bpf_insn_word word, enum bpf_endian endian); 314*aab831ceSchristos int16_t bpf_extract_offset16 (bpf_insn_word word, enum bpf_endian endian); 315*aab831ceSchristos int32_t bpf_extract_imm32 (bpf_insn_word word, enum bpf_endian endian); 316*aab831ceSchristos int64_t bpf_extract_imm64 (bpf_insn_word word1, bpf_insn_word word2, 317*aab831ceSchristos enum bpf_endian endian); 318*aab831ceSchristos 319*aab831ceSchristos /* Get the opcode occupying the INDEX position in the opcodes table. 320*aab831ceSchristos The INDEX is zero based. If the provided index overflows the 321*aab831ceSchristos opcodes table then NULL is returned. */ 322*aab831ceSchristos 323*aab831ceSchristos const struct bpf_opcode *bpf_get_opcode (unsigned int index); 324*aab831ceSchristos 325*aab831ceSchristos #endif /* !_BPF_H_ */ 326