diff options
Diffstat (limited to 'doc/rfc/rfc9669.txt')
-rw-r--r-- | doc/rfc/rfc9669.txt | 2216 |
1 files changed, 2216 insertions, 0 deletions
diff --git a/doc/rfc/rfc9669.txt b/doc/rfc/rfc9669.txt new file mode 100644 index 0000000..7675d5e --- /dev/null +++ b/doc/rfc/rfc9669.txt @@ -0,0 +1,2216 @@ + + + + +Internet Engineering Task Force (IETF) D. Thaler, Ed. +Request for Comments: 9669 October 2024 +Category: Standards Track +ISSN: 2070-1721 + + + BPF Instruction Set Architecture (ISA) + +Abstract + + eBPF (which is no longer an acronym for anything), also commonly + referred to as BPF, is a technology with origins in the Linux kernel + that can run untrusted programs in a privileged context such as an + operating system kernel. This document specifies the BPF instruction + set architecture (ISA). + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9669. + +Copyright Notice + + Copyright (c) 2024 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Documentation Conventions + 2.1. Types + 2.2. Functions + 2.3. Definitions + 2.4. Conformance Groups + 3. Instruction Encoding + 3.1. Basic Instruction Encoding + 3.2. Wide Instruction Encoding + 3.3. Instruction Classes + 4. Arithmetic and Jump Instructions + 4.1. Arithmetic Instructions + 4.2. Byte Swap Instructions + 4.3. Jump Instructions + 4.3.1. Helper Functions + 4.3.2. Program-Local Functions + 5. Load and Store Instructions + 5.1. Regular Load and Store Operations + 5.2. Sign-Extension Load Operations + 5.3. Atomic Operations + 5.4. 64-bit Immediate Instructions + 5.4.1. Maps + 5.4.2. Platform Variables + 5.5. Legacy BPF Packet Access Instructions + 6. Security Considerations + 7. IANA Considerations + 7.1. BPF Instruction Conformance Groups Registry + 7.1.1. BPF Instruction Conformance Groups Registration + Template + 7.2. BPF Instruction Set Registry + 7.2.1. BPF Instruction Registration Template + 7.3. Adding Instructions + 7.4. Deprecating Instructions + 7.5. Change Control + 7.6. Expert Review Instructions + 8. References + 8.1. Normative References + 8.2. Informative References + Appendix A. Initial BPF Instruction Set Values + Acknowledgements + Author's Address + +1. Introduction + + eBPF, also commonly referred to as BPF, is a technology with origins + in the Linux kernel that can run untrusted programs in a privileged + context such as an operating system kernel. This document specifies + the BPF instruction set architecture (ISA). + + As a historical note, BPF originally stood for Berkeley Packet + Filter, but now that it can do so much more than packet filtering, + the acronym no longer makes sense. BPF is now considered a + standalone term that does not stand for anything. The original BPF + is sometimes referred to as cBPF (classic BPF) to distinguish it from + the now widely deployed eBPF (extended BPF). + +2. Documentation Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + For brevity and consistency, this document refers to families of + types using a shorthand syntax and refers to several expository, + mnemonic functions when describing the semantics of instructions. + The range of valid values for those types and the semantics of those + functions are defined in the following subsections. + +2.1. Types + + This document refers to integer types with the notation SN to specify + a type's signedness (S) and bit width (N), respectively. + + +===+==========+ + | S | Meaning | + +===+==========+ + | u | unsigned | + +---+----------+ + | s | signed | + +---+----------+ + + Table 1: Meaning of + Signedness Notation + + +=====+===========+ + | N | Bit Width | + +=====+===========+ + | 8 | 8 bits | + +-----+-----------+ + | 16 | 16 bits | + +-----+-----------+ + | 32 | 32 bits | + +-----+-----------+ + | 64 | 64 bits | + +-----+-----------+ + | 128 | 128 bits | + +-----+-----------+ + + Table 2: Meaning of + Bit-Width Notation + + For example, _u32_ is a type whose valid values are all the 32-bit + unsigned numbers and _s16_ is a type whose valid values are all the + 16-bit signed numbers. + +2.2. Functions + + The following byte swap functions are direction agnostic. That is, + the same function is used for conversion in either direction + discussed below. + + * be16: Takes an unsigned 16-bit number and converts it between host + byte order and big-endian byte order [IEN137]. + + * be32: Takes an unsigned 32-bit number and converts it between host + byte order and big-endian byte order. + + * be64: Takes an unsigned 64-bit number and converts it between host + byte order and big-endian byte order. + + * bswap16: Takes an unsigned 16-bit number in either big- or little- + endian format and returns the equivalent number with the same bit + width but opposite endianness. + + * bswap32: Takes an unsigned 32-bit number in either big- or little- + endian format and returns the equivalent number with the same bit + width but opposite endianness. + + * bswap64: Takes an unsigned 64-bit number in either big- or little- + endian format and returns the equivalent number with the same bit + width but opposite endianness. + + * le16: Takes an unsigned 16-bit number and converts it between host + byte order and little-endian byte order. + + * le32: Takes an unsigned 32-bit number and converts it between host + byte order and little-endian byte order. + + * le64: Takes an unsigned 64-bit number and converts it between host + byte order and little-endian byte order. + +2.3. Definitions + + Sign Extend: To sign extend an X-bit number, A, to a Y-bit number, + B, means to + + 1. Copy all X bits from A to the lower X bits of B. + + 2. Set the value of the remaining Y - X bits of B to the value of + the most significant bit of A. + + | *Example* + | + | Sign extend an 8-bit number A to a 16-bit number B on a big- + | endian platform: + | + | A: 10000110 + | B: 11111111 10000110 + +2.4. Conformance Groups + + An implementation does not need to support all instructions specified + in this document (e.g., deprecated instructions). Instead, a number + of conformance groups are specified. An implementation MUST support + the base32 conformance group and MAY support additional conformance + groups, where supporting a conformance group means it MUST support + all instructions in that conformance group. + + The use of named conformance groups enables interoperability between + a runtime that executes instructions, and tools such as compilers + that generate instructions for the runtime. Thus, capability + discovery in terms of conformance groups might be done manually by + users or automatically by tools. + + Each conformance group has a short ASCII label (e.g., "base32") that + corresponds to a set of instructions that are mandatory. That is, + each instruction has one or more conformance groups of which it is a + member. + + This document defines the following conformance groups: + + base32: includes all instructions defined in this specification + unless otherwise noted. + + base64: includes base32, plus instructions explicitly noted as being + in the base64 conformance group. + + atomic32: includes 32-bit atomic operation instructions (see + Section 5.3). + + atomic64: includes atomic32, plus 64-bit atomic operation + instructions. + + divmul32: includes 32-bit division, multiplication, and modulo + instructions. + + divmul64: includes divmul32, plus 64-bit division, multiplication, + and modulo instructions. + + packet: deprecated packet access instructions. + +3. Instruction Encoding + + BPF has two instruction encodings: + + * the basic instruction encoding, which uses 64 bits to encode an + instruction + + * the wide instruction encoding, which appends a second 64 bits + after the basic instruction for a total of 128 bits. + +3.1. Basic Instruction Encoding + + A basic instruction is encoded as follows: + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | opcode | regs | offset | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | imm | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + *opcode:* operation to perform, encoded as follows: + + +-+-+-+-+-+-+-+-+ + |specific |class| + +-+-+-+-+-+-+-+-+ + + *specific:* The format of these bits varies by instruction class + + *class:* the instruction class (see Section 3.3) + + *regs:* the source and destination register numbers, encoded as + follows on a little-endian host: + + +-+-+-+-+-+-+-+-+ + |src_reg|dst_reg| + +-+-+-+-+-+-+-+-+ + + and as follows on a big-endian host: + + +-+-+-+-+-+-+-+-+ + |dst_reg|src_reg| + +-+-+-+-+-+-+-+-+ + + *src_reg:* the source register number (0-10), except where + otherwise specified (64-bit immediate instructions (see + Section 5.4) reuse this field for other purposes) + + *dst_reg:* the destination register number (0-10), unless + otherwise specified (future instructions might reuse this field + for other purposes) + + *offset:* signed integer offset used with pointer arithmetic, except + where otherwise specified (some arithmetic instructions reuse this + field for other purposes) + + *imm:* signed integer immediate value + + Note that the contents of multi-byte fields ('offset' and 'imm') are + stored using big-endian byte ordering on big-endian hosts and little- + endian byte ordering on little-endian hosts. + + For example: + + opcode offset imm assembly + src_reg dst_reg + 07 0 1 00 00 44 33 22 11 r1 += 0x11223344 // little + dst_reg src_reg + 07 1 0 00 00 11 22 33 44 r1 += 0x11223344 // big + + Note that most instructions do not use all of the fields. Unused + fields SHALL be cleared to zero. + +3.2. Wide Instruction Encoding + + Some instructions are defined to use the wide instruction encoding, + which uses two 32-bit immediate values. The 64 bits following the + basic instruction format contain a pseudo instruction with 'opcode', + 'dst_reg', 'src_reg', and 'offset' all set to zero. + + This is depicted in the following figure: + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | opcode | regs | offset | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | imm | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | next_imm | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + *opcode:* operation to perform, encoded as explained above + + *regs:* the source and destination register numbers (unless + otherwise specified), encoded as explained above + + *offset:* signed integer offset used with pointer arithmetic, unless + otherwise specified + + *imm:* signed integer immediate value + + *reserved:* unused, set to zero + + *next_imm:* second signed integer immediate value + +3.3. Instruction Classes + + The three least significant bits of the 'opcode' field store the + instruction class: + + +=======+=======+=================================+===========+ + | class | Value | Description | Reference | + +=======+=======+=================================+===========+ + | LD | 0x0 | non-standard load operations | Section 5 | + +-------+-------+---------------------------------+-----------+ + | LDX | 0x1 | load into register operations | Section 5 | + +-------+-------+---------------------------------+-----------+ + | ST | 0x2 | store from immediate operations | Section 5 | + +-------+-------+---------------------------------+-----------+ + | STX | 0x3 | store from register operations | Section 5 | + +-------+-------+---------------------------------+-----------+ + | ALU | 0x4 | 32-bit arithmetic operations | Section 4 | + +-------+-------+---------------------------------+-----------+ + | JMP | 0x5 | 64-bit jump operations | Section 4 | + +-------+-------+---------------------------------+-----------+ + | JMP32 | 0x6 | 32-bit jump operations | Section 4 | + +-------+-------+---------------------------------+-----------+ + | ALU64 | 0x7 | 64-bit arithmetic operations | Section 4 | + +-------+-------+---------------------------------+-----------+ + + Table 3: Instruction Class + +4. Arithmetic and Jump Instructions + + For arithmetic and jump instructions (ALU, ALU64, JMP, and JMP32), + the 8-bit 'opcode' field is divided into three parts: + + +-+-+-+-+-+-+-+-+ + | code |s|class| + +-+-+-+-+-+-+-+-+ + + *code:* the operation code, whose meaning varies by instruction + class + + *s (source):* the source operand location, which unless otherwise + specified is one of: + + +========+=======+==========================================+ + | source | Value | Description | + +========+=======+==========================================+ + | K | 0 | use 32-bit 'imm' value as source operand | + +--------+-------+------------------------------------------+ + | X | 1 | use 'src_reg' register value as source | + | | | operand | + +--------+-------+------------------------------------------+ + + Table 4: Source Operand Location + + *class:* the instruction class (see Section 3.3) + +4.1. Arithmetic Instructions + + ALU uses 32-bit wide operands while ALU64 uses 64-bit wide operands + for otherwise identical operations. ALU64 instructions belong to the + base64 conformance group unless noted otherwise. The 'code' field + encodes the operation as below, where 'src' refers to the source + operand and 'dst' refers to the value of the destination register. + + +=======+======+=========+=======================================+ + | Name | code | offset | Description | + +=======+======+=========+=======================================+ + | ADD | 0x0 | 0 | dst += src | + +-------+------+---------+---------------------------------------+ + | SUB | 0x1 | 0 | dst -= src | + +-------+------+---------+---------------------------------------+ + | MUL | 0x2 | 0 | dst *= src | + +-------+------+---------+---------------------------------------+ + | DIV | 0x3 | 0 | dst = (src != 0) ? (dst / src) : 0 | + +-------+------+---------+---------------------------------------+ + | SDIV | 0x3 | 1 | dst = (src != 0) ? (dst s/ src) : 0 | + +-------+------+---------+---------------------------------------+ + | OR | 0x4 | 0 | dst |= src | + +-------+------+---------+---------------------------------------+ + | AND | 0x5 | 0 | dst &= src | + +-------+------+---------+---------------------------------------+ + | LSH | 0x6 | 0 | dst <<= (src & mask) | + +-------+------+---------+---------------------------------------+ + | RSH | 0x7 | 0 | dst >>= (src & mask) | + +-------+------+---------+---------------------------------------+ + | NEG | 0x8 | 0 | dst = -dst | + +-------+------+---------+---------------------------------------+ + | MOD | 0x9 | 0 | dst = (src != 0) ? (dst % src) : dst | + +-------+------+---------+---------------------------------------+ + | SMOD | 0x9 | 1 | dst = (src != 0) ? (dst s% src) : dst | + +-------+------+---------+---------------------------------------+ + | XOR | 0xa | 0 | dst ^= src | + +-------+------+---------+---------------------------------------+ + | MOV | 0xb | 0 | dst = src | + +-------+------+---------+---------------------------------------+ + | MOVSX | 0xb | 8/16/32 | dst = (s8,s16,s32)src | + +-------+------+---------+---------------------------------------+ + | ARSH | 0xc | 0 | sign extending (Section 2.3) dst >>= | + | | | | (src & mask) | + +-------+------+---------+---------------------------------------+ + | END | 0xd | 0 | byte swap operations (see | + | | | | Section 4.2) | + +-------+------+---------+---------------------------------------+ + + Table 5: Arithmetic Instructions + + Underflow and overflow are allowed during arithmetic operations, + meaning the 64-bit or 32-bit value will wrap. If BPF program + execution would result in division by zero, the destination register + is instead set to zero. If execution would result in modulo by zero, + for ALU64 the value of the destination register is unchanged whereas + for ALU the upper 32 bits of the destination register are zeroed. + + {ADD, X, ALU}, where 'code' = ADD, 'source' = X, and 'class' = ALU, + means: + + dst = (u32) ((u32) dst + (u32) src) + + where '(u32)' indicates that the upper 32 bits are zeroed. + + {ADD, X, ALU64} means: + + dst = dst + src + + {XOR, K, ALU} means: + + dst = (u32) dst ^ (u32) imm + + {XOR, K, ALU64} means: + + dst = dst ^ imm + + Note that most arithmetic instructions have 'offset' set to 0. Only + three instructions (SDIV, SMOD, MOVSX) have a non-zero 'offset'. + + Division, multiplication, and modulo operations for ALU are part of + the "divmul32" conformance group, and division, multiplication, and + modulo operations for ALU64 are part of the "divmul64" conformance + group. The division and modulo operations support both unsigned and + signed flavors. + + For unsigned operations (DIV and MOD), for ALU, 'imm' is interpreted + as a 32-bit unsigned value. For ALU64, 'imm' is first sign extended + (Section 2.3) from 32 to 64 bits, and then interpreted as a 64-bit + unsigned value. + + For signed operations (SDIV and SMOD), for ALU, 'imm' is interpreted + as a 32-bit signed value. For ALU64, 'imm' is first sign extended + (Section 2.3) from 32 to 64 bits, and then interpreted as a 64-bit + signed value. + + Note that there are varying definitions of the signed modulo + operation when the dividend or divisor are negative, where + implementations often vary by language such that Python, Ruby, etc. + differ from C, Go, Java, etc. This specification requires that + signed modulo MUST use truncated division (where -13 % 3 == -1) as + implemented in C, Go, etc.: + + a % n = a - n * trunc(a / n) + + The MOVSX instruction does a move operation with sign extension. + {MOVSX, X, ALU} sign extends (Section 2.3) 8-bit and 16-bit operands + into 32-bit operands, and zeroes the remaining upper 32 bits. + {MOVSX, X, ALU64} sign extends (Section 2.3) 8-bit, 16-bit, and + 32-bit operands into 64-bit operands. Unlike other arithmetic + instructions, MOVSX is only defined for register source operands (X). + + {MOV, K, ALU64} means: + + dst = (s64)imm + + {MOV, X, ALU} means: + + dst = (u32)src + + {MOVSX, X, ALU} with 'offset' 8 means: + + dst = (u32)(s32)(s8)src + + The NEG instruction is only defined when the source bit is clear (K). + + Shift operations use a mask of 0x3F (63) for 64-bit operations and + 0x1F (31) for 32-bit operations. + +4.2. Byte Swap Instructions + + The byte swap instructions use instruction classes of ALU and ALU64 + and a 4-bit 'code' field of END. + + The byte swap instructions operate on the destination register only + and do not use a separate source register or immediate value. + + For ALU, the 1-bit source operand field in the opcode is used to + select what byte order the operation converts from or to. For ALU64, + the 1-bit source operand field in the opcode is reserved and MUST be + set to 0. + + +=======+==========+=======+===========================+ + | class | source | Value | Description | + +=======+==========+=======+===========================+ + | ALU | LE | 0 | convert between host byte | + | | | | order and little endian | + +-------+----------+-------+---------------------------+ + | ALU | BE | 1 | convert between host byte | + | | | | order and big endian | + +-------+----------+-------+---------------------------+ + | ALU64 | Reserved | 0 | do byte swap | + | | | | unconditionally | + +-------+----------+-------+---------------------------+ + + Table 6: Byte Swap Instructions + + The 'imm' field encodes the width of the swap operations. The + following widths are supported: 16, 32, and 64. Width 64 operations + belong to the base64 conformance group and other swap operations + belong to the base32 conformance group. + + Examples: + + {END, LE, ALU} with 'imm' = 16/32/64 means: + + dst = le16(dst) + dst = le32(dst) + dst = le64(dst) + + {END, BE, ALU} with 'imm' = 16/32/64 means: + + dst = be16(dst) + dst = be32(dst) + dst = be64(dst) + + {END, TO, ALU64} with 'imm' = 16/32/64 means: + + dst = bswap16(dst) + dst = bswap32(dst) + dst = bswap64(dst) + +4.3. Jump Instructions + + JMP32 uses 32-bit wide operands and indicates the base32 conformance + group; JMP uses 64-bit wide operands for otherwise identical + operations and indicates the base64 conformance group unless + otherwise specified. The 'code' field encodes the operation as + below: + + +======+=======+=========+======================+================+ + | code | Value | src_reg | Description | Notes | + +======+=======+=========+======================+================+ + | JA | 0x0 | 0x0 | PC += offset | {JA, K, JMP} | + | | | | | only | + +------+-------+---------+----------------------+----------------+ + | JA | 0x0 | 0x0 | PC += imm | {JA, K, JMP32} | + | | | | | only | + +------+-------+---------+----------------------+----------------+ + | JEQ | 0x1 | any | PC += offset if dst | | + | | | | == src | | + +------+-------+---------+----------------------+----------------+ + | JGT | 0x2 | any | PC += offset if dst | unsigned | + | | | | > src | | + +------+-------+---------+----------------------+----------------+ + | JGE | 0x3 | any | PC += offset if dst | unsigned | + | | | | >= src | | + +------+-------+---------+----------------------+----------------+ + | JSET | 0x4 | any | PC += offset if dst | | + | | | | & src | | + +------+-------+---------+----------------------+----------------+ + | JNE | 0x5 | any | PC += offset if dst | | + | | | | != src | | + +------+-------+---------+----------------------+----------------+ + | JSGT | 0x6 | any | PC += offset if dst | signed | + | | | | > src | | + +------+-------+---------+----------------------+----------------+ + | JSGE | 0x7 | any | PC += offset if dst | signed | + | | | | >= src | | + +------+-------+---------+----------------------+----------------+ + | CALL | 0x8 | 0x0 | call helper function | {CALL, K, JMP} | + | | | | by static ID | only, see | + | | | | | Section 4.3.1 | + +------+-------+---------+----------------------+----------------+ + | CALL | 0x8 | 0x1 | call PC += imm | {CALL, K, JMP} | + | | | | | only, see | + | | | | | Section 4.3.2 | + +------+-------+---------+----------------------+----------------+ + | CALL | 0x8 | 0x2 | call helper function | {CALL, K, JMP} | + | | | | by BTF ID | only, see | + | | | | | Section 4.3.1 | + +------+-------+---------+----------------------+----------------+ + | EXIT | 0x9 | 0x0 | return | {CALL, K, JMP} | + | | | | | only | + +------+-------+---------+----------------------+----------------+ + | JLT | 0xa | any | PC += offset if dst | unsigned | + | | | | < src | | + +------+-------+---------+----------------------+----------------+ + | JLE | 0xb | any | PC += offset if dst | unsigned | + | | | | <= src | | + +------+-------+---------+----------------------+----------------+ + | JSLT | 0xc | any | PC += offset if dst | signed | + | | | | < src | | + +------+-------+---------+----------------------+----------------+ + | JSLE | 0xd | any | PC += offset if dst | signed | + | | | | <= src | | + +------+-------+---------+----------------------+----------------+ + + Table 7: Jump Instructions + + where 'PC' denotes the program counter, and the offset to increment + by is in units of 64-bit instructions relative to the instruction + following the jump instruction. Thus 'PC += 1' skips execution of + the next instruction if it's a basic instruction or results in + undefined behavior if the next instruction is a 128-bit wide + instruction. + + Example: + + {JSGE, X, JMP32} means: + + if (s32)dst s>= (s32)src goto +offset + + where 's>=' indicates a signed '>=' comparison. + + {JLE, K, JMP} means: + + if dst <= (u64)(s64)imm goto +offset + + {JA, K, JMP32} means: + + gotol +imm + + where 'imm' means the branch offset comes from the 'imm' field. + + Note that there are two flavors of JA instructions. The JMP class + permits a 16-bit jump offset specified by the 'offset' field, whereas + the JMP32 class permits a 32-bit jump offset specified by the 'imm' + field. A conditional jump greater than 16 bits may be converted to a + conditional jump less than 16 bits plus a 32-bit unconditional jump. + + All CALL and JA instructions belong to the base32 conformance group. + +4.3.1. Helper Functions + + Helper functions are a concept whereby BPF programs can call into a + set of function calls exposed by the underlying platform. + + Historically, each helper function was identified by a static ID + encoded in the 'imm' field. Further documentation of helper + functions is outside the scope of this document and standardization + is left for future work, but use is widely deployed and more + information can be found in platform-specific documentation (e.g., + Linux kernel documentation). + + Platforms that support the BPF Type Format (BTF) support identifying + a helper function by a BTF ID encoded in the 'imm' field, where the + BTF ID identifies the helper name and type. Further documentation of + BTF is outside the scope of this document and standardization is left + for future work, but use is widely deployed and more information can + be found in platform-specific documentation (e.g., Linux kernel + documentation). + +4.3.2. Program-Local Functions + + Program-local functions are functions exposed by the same BPF program + as the caller, and are referenced by offset from the instruction + following the call instruction, similar to JA. The offset is encoded + in the 'imm' field of the call instruction. An EXIT within the + program-local function will return to the caller. + +5. Load and Store Instructions + + For load and store instructions (LD, LDX, ST, and STX), the 8-bit + 'opcode' field is divided as follows: + + +-+-+-+-+-+-+-+-+ + |mode |sz |class| + +-+-+-+-+-+-+-+-+ + + *mode:* The mode modifier is one of: + + +========+=======+===============================+=============+ + | mode | Value | Description | Reference | + +========+=======+===============================+=============+ + | IMM | 0 | 64-bit immediate instructions | Section 5.4 | + +--------+-------+-------------------------------+-------------+ + | ABS | 1 | legacy BPF packet access | Section 5.5 | + | | | (absolute) | | + +--------+-------+-------------------------------+-------------+ + | IND | 2 | legacy BPF packet access | Section 5.5 | + | | | (indirect) | | + +--------+-------+-------------------------------+-------------+ + | MEM | 3 | regular load and store | Section 5.1 | + | | | operations | | + +--------+-------+-------------------------------+-------------+ + | MEMSX | 4 | sign-extension load | Section 5.2 | + | | | operations | | + +--------+-------+-------------------------------+-------------+ + | ATOMIC | 6 | atomic operations | Section 5.3 | + +--------+-------+-------------------------------+-------------+ + + Table 8: Mode Modifier + + *sz (size):* The size modifier is one of: + + +======+=======+=======================+ + | size | Value | Description | + +======+=======+=======================+ + | W | 0 | word (4 bytes) | + +------+-------+-----------------------+ + | H | 1 | half word (2 bytes) | + +------+-------+-----------------------+ + | B | 2 | byte | + +------+-------+-----------------------+ + | DW | 3 | double word (8 bytes) | + +------+-------+-----------------------+ + + Table 9: Size Modifier + + Instructions using DW belong to the base64 conformance group. + + *class:* The instruction class (see Section 3.3) + +5.1. Regular Load and Store Operations + + The MEM mode modifier is used to encode regular load and store + instructions that transfer data between a register and memory. + + {MEM, <size>, STX} means: + + *(size *) (dst + offset) = src + + {MEM, <size>, ST} means: + + *(size *) (dst + offset) = imm + + {MEM, <size>, LDX} means: + + dst = *(unsigned size *) (src + offset) + + Where '<size>' is one of: B, H, W, or DW, and 'unsigned size' is one + of: u8, u16, u32, or u64. + +5.2. Sign-Extension Load Operations + + The MEMSX mode modifier is used to encode sign-extension load + instructions (Section 2.3) that transfer data between a register and + memory. + + {MEMSX, <size>, LDX} means: + + dst = *(signed size *) (src + offset) + + Where '<size>' is one of: B, H, or W, and 'signed size' is one of: + s8, s16, or s32. + +5.3. Atomic Operations + + Atomic operations operate on memory and cannot be interrupted or + corrupted by other access to the same memory region by other BPF + programs or means outside of this specification. + + All atomic operations supported by BPF are encoded as store + operations that use the ATOMIC mode modifier as follows: + + * {ATOMIC, W, STX} for 32-bit operations, which are part of the + "atomic32" conformance group. + + * {ATOMIC, DW, STX} for 64-bit operations, which are part of the + "atomic64" conformance group. + + * 8-bit and 16-bit wide atomic operations are not supported. + + The 'imm' field is used to encode the actual atomic operation. + Simple atomic operations use a subset of the values defined to encode + arithmetic operations in the 'imm' field to encode the atomic + operation: + + +=====+=======+=============+ + | imm | Value | Description | + +=====+=======+=============+ + | ADD | 0x00 | atomic add | + +-----+-------+-------------+ + | OR | 0x40 | atomic or | + +-----+-------+-------------+ + | AND | 0x50 | atomic and | + +-----+-------+-------------+ + | XOR | 0xa0 | atomic xor | + +-----+-------+-------------+ + + Table 10: Simple Atomic + Operations + + {ATOMIC, W, STX} with 'imm' = ADD means: + + *(u32 *)(dst + offset) += src + + {ATOMIC, DW, STX} with 'imm' = ADD means: + + *(u64 *)(dst + offset) += src + + In addition to the simple atomic operations, there is also a modifier + and two complex atomic operations: + + +=========+==============+=============================+ + | imm | Value | Description | + +=========+==============+=============================+ + | FETCH | 0x01 | modifier: return old value | + +---------+--------------+-----------------------------+ + | XCHG | 0xe0 | FETCH | atomic exchange | + +---------+--------------+-----------------------------+ + | CMPXCHG | 0xf0 | FETCH | atomic compare and exchange | + +---------+--------------+-----------------------------+ + + Table 11: Complex Atomic Operations and a Modifier + + The FETCH modifier is optional for simple atomic operations and is + always set for the complex atomic operations. If the FETCH flag is + set, then the operation also overwrites src with the value that was + in memory before it was modified. + + The XCHG operation atomically exchanges src with the value addressed + by dst + offset. + + The CMPXCHG operation atomically compares the value addressed by dst + + offset with R0. If they match, the value addressed by dst + offset + is replaced with src. In either case, the value that was at dst + + offset before the operation is zero-extended and loaded back to R0. + +5.4. 64-bit Immediate Instructions + + Instructions with the IMM 'mode' modifier use the wide instruction + encoding defined in Section 3, and use the 'src_reg' field of the + basic instruction to hold an opcode subtype. + + The following table defines a set of {IMM, DW, LD} instructions with + opcode subtypes in the 'src_reg' field, using new terms such as "map" + defined further below: + + +=========+================================+==========+==========+ + | src_reg | Pseudocode | imm Type | dst Type | + +=========+================================+==========+==========+ + | 0x0 | dst = (next_imm << 32) | imm | integer | integer | + +---------+--------------------------------+----------+----------+ + | 0x1 | dst = map_by_fd(imm) | map fd | map | + +---------+--------------------------------+----------+----------+ + | 0x2 | dst = map_val(map_by_fd(imm)) | map fd | data | + | | + next_imm | | address | + +---------+--------------------------------+----------+----------+ + | 0x3 | dst = var_addr(imm) | variable | data | + | | | id | address | + +---------+--------------------------------+----------+----------+ + | 0x4 | dst = code_addr(imm) | integer | code | + | | | | address | + +---------+--------------------------------+----------+----------+ + | 0x5 | dst = map_by_idx(imm) | map | map | + | | | index | | + +---------+--------------------------------+----------+----------+ + | 0x6 | dst = map_val(map_by_idx(imm)) | map | data | + | | + next_imm | index | address | + +---------+--------------------------------+----------+----------+ + + Table 12: 64-bit Immediate Instructions + + where + + * map_by_fd(imm) means to convert a 32-bit file descriptor into an + address of a map (see Section 5.4.1) + + * map_by_idx(imm) means to convert a 32-bit index into an address of + a map + + * map_val(map) gets the address of the first value in a given map + + * var_addr(imm) gets the address of a platform variable (see + Section 5.4.2) with a given id + + * code_addr(imm) gets the address of the instruction at a specified + relative offset in number of (64-bit) instructions + + * the 'imm type' can be used by disassemblers for display + + * the 'dst type' can be used for verification and just-in-time + compilation purposes + +5.4.1. Maps + + Maps are shared memory regions accessible by BPF programs on some + platforms. A map can have various semantics as defined in a separate + document, and may or may not have a single contiguous memory region, + but the 'map_val(map)' is currently only defined for maps that do + have a single contiguous memory region. + + Each map can have a file descriptor (fd) if supported by the + platform, where 'map_by_fd(imm)' means to get the map with the + specified file descriptor. Each BPF program can also be defined to + use a set of maps associated with the program at load time, and + 'map_by_idx(imm)' means to get the map with the given index in the + set associated with the BPF program containing the instruction. + +5.4.2. Platform Variables + + Platform variables are memory regions, identified by integer ids, + exposed by the runtime, and accessible by BPF programs on some + platforms. The 'var_addr(imm)' operation means to get the address of + the memory region identified by the given id. + +5.5. Legacy BPF Packet Access Instructions + + BPF previously introduced special instructions for access to packet + data that were carried over from classic BPF. These instructions + used an instruction class of LD, a size modifier of W, H, or B, and a + mode modifier of ABS or IND. The 'dst_reg' and 'offset' fields were + set to zero, and 'src_reg' was set to zero for ABS. However, these + instructions are deprecated and SHOULD no longer be used. All legacy + packet access instructions belong to the "packet" conformance group. + +6. Security Considerations + + BPF programs could use BPF instructions to do malicious things with + memory, CPU, networking, or other system resources. This is not + fundamentally different from any other type of software that may run + on a device. Execution environments should be carefully designed to + only run BPF programs that are trusted and verified, and sandboxing + and privilege level separation are key strategies for limiting + security and abuse impact. For example, BPF verifiers are well-known + and widely deployed and are responsible for ensuring that BPF + programs will terminate within a reasonable time, only interact with + memory in safe ways, adhere to platform-specified API contracts, and + don't use instructions with undefined behavior. This level of + verification can often provide a stronger level of security assurance + than for other software and operating system code. While the details + are out of scope of this document, Linux [LINUX] and PREVAIL + [PREVAIL] provide many details. Future IETF work will document + verifier expectations and building blocks for allowing safe execution + of untrusted BPF programs. + + Executing programs using the BPF instruction set also requires either + an interpreter or a compiler to translate them to built-in hardware + processor instructions. In general, interpreters are considered a + source of insecurity (e.g., gadgets susceptible to side-channel + attacks due to speculative execution) whenever one is used in the + same memory address space as data with confidentiality concerns. As + such, use of a compiler is recommended instead. Compilers should be + audited carefully for vulnerabilities to ensure that compilation of a + trusted and verified BPF program to built-in processor instructions + does not introduce vulnerabilities. + + Exposing functionality via BPF extends the interface between the + component executing the BPF program and the component submitting it. + Careful consideration of what functionality is exposed and how that + impacts the security properties desired is required. + +7. IANA Considerations + + This document defines two registries. + +7.1. BPF Instruction Conformance Groups Registry + + This document defines an IANA registry for BPF instruction + conformance groups, as follows: + + * Name of the registry: BPF Instruction Conformance Groups + + * Name of the registry group: BPF Instructions + + * Required information for registrations: See the BPF Instruction + Conformance Groups Registration Template (Section 7.1.1) + + * Syntax of registry entries: Each entry has the following fields: + name, description, includes, excludes, status, change controller, + and reference. See Section 7.1.1 for more details. + + * Registration policy (see Section 4 of [RFC8126] for details): + + - Permanent: Standards Action or IESG Approval + + - Provisional: Specification Required + + - Historical: Specification Required + + * Contact: BPF Working Group + + * Change Controller: IETF + + Initial entries in this registry are as follows: + + +========+===============+========+========+============+===========+ + |Name | Description |Includes|Excludes| Status | Reference | + +========+===============+========+========+============+===========+ + |atomic32| 32-bit |- |- | Permanent | RFC 9669, | + | | atomic | | | | Section | + | | instructions | | | | 5.3 | + +--------+---------------+--------+--------+------------+-----------+ + |atomic64| 64-bit |atomic32|- | Permanent | RFC 9669, | + | | atomic | | | | Section | + | | instructions | | | | 5.3 | + +--------+---------------+--------+--------+------------+-----------+ + |base32 | 32-bit base |- |- | Permanent | RFC 9669 | + | | instructions | | | | | + +--------+---------------+--------+--------+------------+-----------+ + |base64 | 64-bit base |base32 |- | Permanent | RFC 9669 | + | | instructions | | | | | + +--------+---------------+--------+--------+------------+-----------+ + |divmul32| 32-bit |- |- | Permanent | RFC 9669, | + | | division and | | | | Section | + | | modulo | | | | 4.1 | + +--------+---------------+--------+--------+------------+-----------+ + |divmul64| 64-bit |divmul32|- | Permanent | RFC 9669, | + | | division and | | | | Section | + | | modulo | | | | 4.1 | + +--------+---------------+--------+--------+------------+-----------+ + |packet | Legacy |- |- | Historical | RFC 9669, | + | | packet | | | | Section | + | | instructions | | | | 5.5 | + +--------+---------------+--------+--------+------------+-----------+ + + Table 13: Initial Conformance Groups + +7.1.1. BPF Instruction Conformance Groups Registration Template + + This template describes the fields that must be supplied in a + registration request: + + Name: Alphanumeric label indicating the name of the conformance + group. + + Description: Brief description of the conformance group. + + Includes: Any other conformance groups that are included by this + group. + + Excludes: Any other conformance groups that are excluded by this + group. + + Status: This reflects the status requested and must be one of + 'Permanent', 'Provisional', or 'Historical'. + + Contact: Person (including contact information) to contact for + further information. + + Change Controller: Organization or person (often the author of the + defining specification), including contact information, authorized + to change this. + + Reference: A reference to the defining specification. Include full + citations for all referenced documents. Registration requests for + 'Provisional' registration can be included in an Internet-Draft; + when the documents are approved for publication as an RFC, the + registration will be updated to 'Permanent'. + +7.2. BPF Instruction Set Registry + + This document defines an IANA registry for BPF instructions, as + follows: + + * Name of the registry: BPF Instruction Set + + * Name of the registry group: BPF Instructions + + * Required information for registrations: See the BPF Instruction + Registration Template (Section 7.2.1) + + * Syntax of registry entries: Each entry has the following fields: + opcode, src, offset, imm, description, groups, change controller, + and reference. See Section 7.2.1 for more details. + + * Registration policy: New instructions require a new entry in the + conformance group registry and the same registration policies + apply. + + * Contact: BPF Working Group + + * Change Controller: IETF + + * Initial registrations: See Appendix A. Instructions other than + those listed as deprecated are Permanent. Any listed as + deprecated are Historical. + +7.2.1. BPF Instruction Registration Template + + This template describes the fields that must be supplied in a + registration request: + + Opcode: A 1-byte value in hex format indicating the value of the + opcode field. + + Src_reg: Either a numeric value indicating the value of the src_reg + field, or "any". + + Offset: Either a numeric value indicating the value of the offset + field, or "any". + + Imm: Either a value indicating the value of the imm field, or "any". + + Description: Description of what the instruction does, typically in + pseudocode. + + Groups: A list of one or more comma-separated conformance groups to + which the instruction belongs. + + Contact: Person (including contact information) to contact for + further information. + + Change Controller: Organization or person (often the author), + including contact information, authorized to change this. + + Reference: A reference to the defining specification. Include full + citations for all referenced documents. Registration requests for + 'Provisional' registration can be included in an Internet-Draft; + when the documents are approved for publication as an RFC, the + registration will be updated to 'Permanent'. + +7.3. Adding Instructions + + A specification may add additional instructions to the BPF + Instruction Set registry. Once a conformance group is registered + with a set of instructions, no further instructions can be added to + that conformance group. A specification should instead create a new + conformance group that includes the original conformance group, plus + any newly added instructions. Inclusion of the original conformance + group is done via the "includes" column of the BPF Instruction + Conformance Groups registry, and inclusion of newly added + instructions is done via the "groups" column of the BPF Instruction + Set registry. + + For example, consider an existing hypothetical group called "example" + with two instructions in it. One might add two more instructions by + first adding an "examplev2" group to the BPF Instruction Conformance + Groups registry as follows: + + +===========+==================+==========+==========+===========+ + | Name | Description | Includes | Excludes | Status | + +===========+==================+==========+==========+===========+ + | example | Original example | - | - | Permanent | + | | instructions | | | | + +-----------+------------------+----------+----------+-----------+ + | examplev2 | Newer set of | example | - | Permanent | + | | example | | | | + | | instructions | | | | + +-----------+------------------+----------+----------+-----------+ + + Table 14: Conformance Group Example for Addition + + And then adding the new instructions into the BPF Instruction Set + registry as follows: + + +========+=====+================================+===========+ + | opcode | ... | Description | Groups | + +========+=====+================================+===========+ + | aaa | ... | Original example instruction 1 | example | + +--------+-----+--------------------------------+-----------+ + | bbb | ... | Original example instruction 2 | example | + +--------+-----+--------------------------------+-----------+ + | ccc | ... | Added example instruction 3 | examplev2 | + +--------+-----+--------------------------------+-----------+ + | ddd | ... | Added example instruction 4 | examplev2 | + +--------+-----+--------------------------------+-----------+ + + Table 15: Instruction Addition Example + + Supporting the "examplev2" group thus requires supporting all four + example instructions. + +7.4. Deprecating Instructions + + Deprecating instructions that are part of an existing conformance + group can be done by defining a new conformance group for the newly + deprecated instructions, and defining a new conformance group that + supersedes the existing conformance group containing the + instructions, where the new conformance group includes the existing + one and excludes the deprecated instruction group. + + For example, if deprecating an instruction in an existing + hypothetical group called "example", two new groups ("legacyexample" + and "examplev2") might be registered in the BPF Instruction + Conformance Groups registry as follows: + + +===============+==============+========+===============+==========+ + | Name | Description |Includes| Excludes |Status | + +===============+==============+========+===============+==========+ + | example | Original |- | - |Permanent | + | | example | | | | + | | instructions | | | | + +---------------+--------------+--------+---------------+----------+ + | legacyexample | Legacy |- | - |Historical| + | | example | | | | + | | instructions | | | | + +---------------+--------------+--------+---------------+----------+ + | examplev2 | Example |example | legacyexample |Permanent | + | | instructions | | | | + +---------------+--------------+--------+---------------+----------+ + + Table 16: Conformance Group Example for Deprecation + + The BPF Instruction Set registry entries for the deprecated + instructions would then be updated to add "legacyexample" to the set + of groups for those instructions, as follows: + + +========+=====+=============================+===============+ + | opcode | ... | Description | Groups | + +========+=====+=============================+===============+ + | aaa | ... | Good original instruction 1 | example | + +--------+-----+-----------------------------+---------------+ + | bbb | ... | Good original instruction 2 | example | + +--------+-----+-----------------------------+---------------+ + | ccc | ... | Bad original instruction 3 | example, | + | | | | legacyexample | + +--------+-----+-----------------------------+---------------+ + | ddd | ... | Bad original instruction 4 | example, | + | | | | legacyexample | + +--------+-----+-----------------------------+---------------+ + + Table 17: Instruction Deprecation Example + + Finally, updated implementations that dropped support for the + deprecated instructions would then be able to claim conformance to + "examplev2" rather than "example". + +7.5. Change Control + + Registrations can be updated in a registry by the same mechanism as + required for an initial registration. In cases where the original + definition of an entry is contained in an IESG-approved document, in + which case the IETF would be the change controller, update of the + specification also requires IESG approval. + + 'Provisional' registrations can be updated by the change controller + designated in the existing registration. In addition, the IESG can + reassign responsibility for a 'Provisional' registration or can + request specific changes to an entry. This will enable changes to be + made to entries where the original registrant is out of contact or + unwilling or unable to make changes. + + Transition from 'Provisional' to 'Permanent' status can be requested + and approved in the same manner as a new 'Permanent' registration. + Transition from 'Permanent' to 'Historical' status requires IESG + approval. Transition from 'Provisional' to 'Historical' can be + requested by anyone authorized to update the 'Provisional' + registration. + +7.6. Expert Review Instructions + + The IANA registries established by this document are informed by + written specifications, which themselves are facilitated and approved + by an Expert Review process (see Section 5.3 of [RFC8126]). + + Designated experts are expected to consult with the active BPF + working group (e.g., via email to the working group's mailing list) + if it exists, as well as other interested parties (e.g., via email to + one or more active mailing list(s) for relevant BPF communities and + platforms). The designated expert is expected to verify that the + encoding and semantics for any new instructions are properly + documented in a public-facing specification. In the event of future + RFC documents for ISA extensions, experts may permit early assignment + before the RFC document is available, as long as a specification that + satisfies the above requirements exists. + +8. References + +8.1. Normative References + + [IEN137] Cohen, D., "ON HOLY WARS AND A PLEA FOR PEACE", IEN 137, 1 + April 1980, <https://www.rfc-editor.org/ien/ien137.txt>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for + Writing an IANA Considerations Section in RFCs", BCP 26, + RFC 8126, DOI 10.17487/RFC8126, June 2017, + <https://www.rfc-editor.org/info/rfc8126>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + +8.2. Informative References + + [LINUX] "eBPF verifier", + <https://www.kernel.org/doc/html/latest/bpf/ + verifier.html>. + + [PREVAIL] Gershuni, E., Amit, N., Gurfinkel, A., Narodytska, N., + Navas, J., Rinetzky, N., Ryzhyk, L., and M. Sagiv, "Simple + and Precise Static Analysis of Untrusted Linux Kernel + Extensions", DOI 10.1145/3314221.3314590, June 2019, + <https://doi.org/10.1145/3314221.3314590>. + +Appendix A. Initial BPF Instruction Set Values + + Initial values for the BPF Instruction Set registry are given below. + The descriptions in this table are informative. In case of any + discrepancy, the reference is authoritative. + + +======+=======+====+====+========================+========+=======+ + |opcode|src_reg|off-|imm |Description |Groups |Ref | + | | |set | | | | | + +======+=======+====+====+========================+========+=======+ + |0x00 |0x0 |0 |any |(additional immediate |base64 |RFC | + | | | | |value) | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x04 |0x0 |0 |any |dst = (u32)((u32)dst + |base32 |RFC | + | | | | |(u32)imm) | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x05 |0x0 |any |0x00|goto +offset |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x06 |0x0 |0 |any |goto +imm |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x07 |0x0 |0 |any |dst += imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x0c |any |0 |0x00|dst = (u32)((u32)dst + |base32 |RFC | + | | | | |(u32)src) | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x0f |any |0 |0x00|dst += src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x14 |0x0 |0 |any |dst = (u32)((u32)dst - |base32 |RFC | + | | | | |(u32)imm) | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x15 |0x0 |any |any |if dst == imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x16 |0x0 |any |any |if (u32)dst == imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x17 |0x0 |0 |any |dst -= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x0 |0 |any |dst = (next_imm << 32) ||base64 |RFC | + | | | | |imm | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x1 |0 |any |dst = map_by_fd(imm) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x2 |0 |any |dst = |base64 |RFC | + | | | | |map_val(map_by_fd(imm)) | |9669, | + | | | | |+ next_imm | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x3 |0 |any |dst = var_addr(imm) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x4 |0 |any |dst = code_addr(imm) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x5 |0 |any |dst = map_by_idx(imm) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x18 |0x6 |0 |any |dst = |base64 |RFC | + | | | | |map_val(map_by_idx(imm))| |9669, | + | | | | |+ next_imm | |Section| + | | | | | | |5.4 | + +------+-------+----+----+------------------------+--------+-------+ + |0x1c |any |0 |0x00|dst = (u32)((u32)dst - |base32 |RFC | + | | | | |(u32)src) | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x1d |any |any |0x00|if dst == src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x1e |any |any |0x00|if (u32)dst == (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x1f |any |0 |0x00|dst -= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x20 |0x0 |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x24 |0x0 |0 |any |dst = (u32)(dst * imm) |divmul32|RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x25 |0x0 |any |any |if dst > imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x26 |0x0 |any |any |if (u32)dst > imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x27 |0x0 |0 |any |dst *= imm |divmul64|RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x28 |0x0 |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x2c |any |0 |0x00|dst = (u32)(dst * src) |divmul32|RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x2d |any |any |0x00|if dst > src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x2e |any |any |0x00|if (u32)dst > (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x2f |any |0 |0x00|dst *= src |divmul64|RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x30 |0x0 |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x34 |0x0 |0 |any |dst = (u32)((imm != 0) ?|divmul32|RFC | + | | | | |((u32)dst / (u32)imm) : | |9669, | + | | | | |0) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x34 |0x0 |1 |any |dst = (u32)((imm != 0) ?|divmul32|RFC | + | | | | |((s32)dst s/ imm) : 0) | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x35 |0x0 |any |any |if dst >= imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x36 |0x0 |any |any |if (u32)dst >= imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x37 |0x0 |0 |any |dst = (imm != 0) ? (dst |divmul64|RFC | + | | | | |/ (u32)imm) : 0 | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x37 |0x0 |1 |any |dst = (imm != 0) ? (dst |divmul64|RFC | + | | | | |s/ imm) : 0 | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3c |any |0 |0x00|dst = (u32)((src != 0) ?|divmul32|RFC | + | | | | |((u32)dst / (u32)src) : | |9669, | + | | | | |0) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3c |any |1 |0x00|dst = (u32)((src != 0) ?|divmul32|RFC | + | | | | |((s32)dst s/(s32)src) : | |9669, | + | | | | |0) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3d |any |any |0x00|if dst >= src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3e |any |any |0x00|if (u32)dst >= (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3f |any |0 |0x00|dst = (src != 0) ? (dst |divmul64|RFC | + | | | | |/ src) : 0 | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x3f |any |1 |0x00|dst = (src != 0) ? (dst |divmul64|RFC | + | | | | |s/ src) : 0 | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x40 |any |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x44 |0x0 |0 |any |dst = (u32)(dst | imm) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x45 |0x0 |any |any |if dst & imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x46 |0x0 |any |any |if (u32)dst & imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x47 |0x0 |0 |any |dst |= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x48 |any |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x4c |any |0 |0x00|dst = (u32)(dst | src) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x4d |any |any |0x00|if dst & src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x4e |any |any |0x00|if (u32)dst & (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x4f |any |0 |0x00|dst |= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x50 |any |0 |any |(deprecated, |packet |RFC | + | | | | |implementation-specific)| |9669, | + | | | | | | |Section| + | | | | | | |5.5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x54 |0x0 |0 |any |dst = (u32)(dst & imm) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x55 |0x0 |any |any |if dst != imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x56 |0x0 |any |any |if (u32)dst != imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x57 |0x0 |0 |any |dst &= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x5c |any |0 |0x00|dst = (u32)(dst & src) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x5d |any |any |0x00|if dst != src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x5e |any |any |0x00|if (u32)dst != (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x5f |any |0 |0x00|dst &= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x61 |any |any |0x00|dst = *(u32 *)(src + |base32 |RFC | + | | | | |offset) | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x62 |0x0 |any |any |*(u32 *)(dst + offset) =|base32 |RFC | + | | | | |imm | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x63 |any |any |0x00|*(u32 *)(dst + offset) =|base32 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x64 |0x0 |0 |any |dst = (u32)(dst << imm) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x65 |0x0 |any |any |if dst s> imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x66 |0x0 |any |any |if (s32)dst s> (s32)imm |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x67 |0x0 |0 |any |dst <<= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x69 |any |any |0x00|dst = *(u16 *)(src + |base32 |RFC | + | | | | |offset) | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6a |0x0 |any |any |*(u16 *)(dst + offset) =|base32 |RFC | + | | | | |imm | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6b |any |any |0x00|*(u16 *)(dst + offset) =|base32 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6c |any |0 |0x00|dst = (u32)(dst << src) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6d |any |any |0x00|if dst s> src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6e |any |any |0x00|if (s32)dst s> (s32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x6f |any |0 |0x00|dst <<= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x71 |any |any |0x00|dst = *(u8 *)(src + |base32 |RFC | + | | | | |offset) | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x72 |0x0 |any |any |*(u8 *)(dst + offset) = |base32 |RFC | + | | | | |imm | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x73 |any |any |0x00|*(u8 *)(dst + offset) = |base32 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x74 |0x0 |0 |any |dst = (u32)(dst >> imm) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x75 |0x0 |any |any |if dst s>= imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x76 |0x0 |any |any |if (s32)dst s>= (s32)imm|base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x77 |0x0 |0 |any |dst >>= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x79 |any |any |0x00|dst = *(u64 *)(src + |base64 |RFC | + | | | | |offset) | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7a |0x0 |any |any |*(u64 *)(dst + offset) =|base64 |RFC | + | | | | |imm | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7b |any |any |0x00|*(u64 *)(dst + offset) =|base64 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |5 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7c |any |0 |0x00|dst = (u32)(dst >> src) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7d |any |any |0x00|if dst s>= src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7e |any |any |0x00|if (s32)dst s>= (s32)src|base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x7f |any |0 |0x00|dst >>= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x84 |0x0 |0 |0x00|dst = (u32)-dst |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x85 |0x0 |0 |any |call helper function by |base32 |RFC | + | | | | |static ID | |9669, | + | | | | | | |Section| + | | | | | | |4.3.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x85 |0x1 |0 |any |call PC += imm |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.3.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0x85 |0x2 |0 |any |call helper function by |base32 |RFC | + | | | | |BTF ID | |9669, | + | | | | | | |Section| + | | | | | | |4.3.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x87 |0x0 |0 |0x00|dst = -dst |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x94 |0x0 |0 |any |dst = (u32)((imm != |divmul32|RFC | + | | | | |0)?((u32)dst % (u32)imm)| |9669, | + | | | | |: dst) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x94 |0x0 |1 |any |dst = (u32)((imm != 0) ?|divmul32|RFC | + | | | | |((s32)dst s% imm) : dst)| |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x95 |0x0 |0 |0x00|return |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0x97 |0x0 |0 |any |dst = (imm != 0) ? (dst |divmul64|RFC | + | | | | |% (u32)imm) : dst | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x97 |0x0 |1 |any |dst = (imm != 0) ? (dst |divmul64|RFC | + | | | | |s% imm) : dst | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x9c |any |0 |0x00|dst = (u32)((src != |divmul32|RFC | + | | | | |0)?((u32)dst % (u32)src)| |9669, | + | | | | |: dst) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x9c |any |1 |0x00|dst = (u32)((src != |divmul32|RFC | + | | | | |0)?((s32)dst s% | |9669, | + | | | | |(s32)src) :dst) | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x9f |any |0 |0x00|dst = (src != 0) ? (dst |divmul64|RFC | + | | | | |% src) : dst | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0x9f |any |1 |0x00|dst = (src != 0) ? (dst |divmul64|RFC | + | | | | |s% src) : dst | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xa4 |0x0 |0 |any |dst = (u32)(dst ^ imm) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xa5 |0x0 |any |any |if dst < imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xa6 |0x0 |any |any |if (u32)dst < imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xa7 |0x0 |0 |any |dst ^= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xac |any |0 |0x00|dst = (u32)(dst ^ src) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xad |any |any |0x00|if dst < src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xae |any |any |0x00|if (u32)dst < (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xaf |any |0 |0x00|dst ^= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xb4 |0x0 |0 |any |dst = (u32) imm |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xb5 |0x0 |any |any |if dst <= imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xb6 |0x0 |any |any |if (u32)dst <= imm goto |base32 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xb7 |0x0 |0 |any |dst = imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbc |any |0 |0x00|dst = (u32) src |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbc |any |8 |0x00|dst = (u32) (s32) (s8) |base32 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbc |any |16 |0x00|dst = (u32) (s32) (s16) |base32 |RFC | + | | | | |src | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbd |any |any |0x00|if dst <= src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbe |any |any |0x00|if (u32)dst <= (u32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbf |any |0 |0x00|dst = src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbf |any |8 |0x00|dst = (s64) (s8) src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbf |any |16 |0x00|dst = (s64) (s16) src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xbf |any |32 |0x00|dst = (s64) (s32) src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x00|lock *(u32 *)(dst + |atomic32|RFC | + | | | | |offset) += src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x01|src = |atomic32|RFC | + | | | | |atomic_fetch_add_32((u32| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x40|lock *(u32 *)(dst + |atomic32|RFC | + | | | | |offset) |= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x41|src = |atomic32|RFC | + | | | | |atomic_fetch_or_32((u32 | |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x50|lock *(u32 *)(dst + |atomic32|RFC | + | | | | |offset) &= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0x51|src = |atomic32|RFC | + | | | | |atomic_fetch_and_32((u32| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0xa0|lock *(u32 *)(dst + |atomic32|RFC | + | | | | |offset) ^= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0xa1|src = |atomic32|RFC | + | | | | |atomic_fetch_xor_32((u32| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0xe1|src = xchg_32((u32 |atomic32|RFC | + | | | | |*)(dst + offset), src) | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc3 |any |any |0xf1|r0 = cmpxchg_32((u32 |atomic32|RFC | + | | | | |*)(dst + offset), r0, | |9669, | + | | | | |src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc4 |0x0 |0 |any |dst = (u32)(dst s>> imm)|base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc5 |0x0 |any |any |if dst s< imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc6 |0x0 |any |any |if (s32)dst s< (s32)imm |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xc7 |0x0 |0 |any |dst s>>= imm |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xcc |any |0 |0x00|dst = (u32)(dst s>> src)|base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xcd |any |any |0x00|if dst s< src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xce |any |any |0x00|if (s32)dst s< (s32)src |base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xcf |any |0 |0x00|dst s>>= src |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.1 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd4 |0x0 |0 |0x10|dst = htole16(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd4 |0x0 |0 |0x20|dst = htole32(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd4 |0x0 |0 |0x40|dst = htole64(dst) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd5 |0x0 |any |any |if dst s<= imm goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd6 |0x0 |any |any |if (s32)dst s<= (s32)imm|base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd7 |0x0 |0 |0x10|dst = bswap16(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd7 |0x0 |0 |0x20|dst = bswap32(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xd7 |0x0 |0 |0x40|dst = bswap64(dst) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x00|lock *(u64 *)(dst + |atomic64|RFC | + | | | | |offset) += src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x01|src = |atomic64|RFC | + | | | | |atomic_fetch_add_64((u64| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x40|lock *(u64 *)(dst + |atomic64|RFC | + | | | | |offset) |= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x41|src = |atomic64|RFC | + | | | | |atomic_fetch_or_64((u64 | |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x50|lock *(u64 *)(dst + |atomic64|RFC | + | | | | |offset) &= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0x51|src = |atomic64|RFC | + | | | | |atomic_fetch_and_64((u64| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0xa0|lock *(u64 *)(dst + |atomic64|RFC | + | | | | |offset) ^= src | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0xa1|src = |atomic64|RFC | + | | | | |atomic_fetch_xor_64((u64| |9669, | + | | | | |*)(dst + offset), src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0xe1|src = xchg_64((u64 |atomic64|RFC | + | | | | |*)(dst + offset), src) | |9669, | + | | | | | | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdb |any |any |0xf1|r0 = cmpxchg_64((u64 |atomic64|RFC | + | | | | |*)(dst + offset), r0, | |9669, | + | | | | |src) | |Section| + | | | | | | |5.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdc |0x0 |0 |0x10|dst = htobe16(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdc |0x0 |0 |0x20|dst = htobe32(dst) |base32 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdc |0x0 |0 |0x40|dst = htobe64(dst) |base64 |RFC | + | | | | | | |9669, | + | | | | | | |Section| + | | | | | | |4.2 | + +------+-------+----+----+------------------------+--------+-------+ + |0xdd |any |any |0x00|if dst s<= src goto |base64 |RFC | + | | | | |+offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + |0xde |any |any |0x00|if (s32)dst s<= (s32)src|base32 |RFC | + | | | | |goto +offset | |9669, | + | | | | | | |Section| + | | | | | | |4.3 | + +------+-------+----+----+------------------------+--------+-------+ + + Table 18: Initial BPF Instruction Set Values + +Acknowledgements + + This document was generated from instruction-set.rst in the Linux + kernel repository, to which a number of other individuals have + authored contributions over time, including Akhil Raj, Alexei + Starovoitov, Brendan Jackman, Christoph Hellwig, Daniel Borkmann, + Ilya Leoshkevich, Jiong Wang, Jose E. Marchesi, Kosuke Fujimoto, + Shahab Vahedi, Tiezhu Yang, Will Hawkins, and Zheng Yejian, with + review and suggestions by many others including Alan Jowett, Andrii + Nakryiko, David Vernet, Jim Harris, Quentin Monnet, Song Liu, Shung- + Hsi Yu, Stanislav Fomichev, Watson Ladd, and Yonghong Song. + +Author's Address + + Dave Thaler (editor) + Redmond, WA 98052 + United States of America + Email: dave.thaler.ietf@gmail.com |