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