1.. contents:: 2.. sectnum:: 3 4======================================== 5eBPF Instruction Set Specification, v1.0 6======================================== 7 8This document specifies version 1.0 of the eBPF instruction set. 9 10Documentation conventions 11========================= 12 13For brevity and consistency, this document refers to families 14of types using a shorthand syntax and refers to several expository, 15mnemonic functions when describing the semantics of instructions. 16The range of valid values for those types and the semantics of those 17functions are defined in the following subsections. 18 19Types 20----- 21This document refers to integer types with the notation `SN` to specify 22a type's signedness (`S`) and bit width (`N`), respectively. 23 24.. table:: Meaning of signedness notation. 25 26 ==== ========= 27 `S` Meaning 28 ==== ========= 29 `u` unsigned 30 `s` signed 31 ==== ========= 32 33.. table:: Meaning of bit-width notation. 34 35 ===== ========= 36 `N` Bit width 37 ===== ========= 38 `8` 8 bits 39 `16` 16 bits 40 `32` 32 bits 41 `64` 64 bits 42 `128` 128 bits 43 ===== ========= 44 45For example, `u32` is a type whose valid values are all the 32-bit unsigned 46numbers and `s16` is a types whose valid values are all the 16-bit signed 47numbers. 48 49Functions 50--------- 51* `htobe16`: Takes an unsigned 16-bit number in host-endian format and 52 returns the equivalent number as an unsigned 16-bit number in big-endian 53 format. 54* `htobe32`: Takes an unsigned 32-bit number in host-endian format and 55 returns the equivalent number as an unsigned 32-bit number in big-endian 56 format. 57* `htobe64`: Takes an unsigned 64-bit number in host-endian format and 58 returns the equivalent number as an unsigned 64-bit number in big-endian 59 format. 60* `htole16`: Takes an unsigned 16-bit number in host-endian format and 61 returns the equivalent number as an unsigned 16-bit number in little-endian 62 format. 63* `htole32`: Takes an unsigned 32-bit number in host-endian format and 64 returns the equivalent number as an unsigned 32-bit number in little-endian 65 format. 66* `htole64`: Takes an unsigned 64-bit number in host-endian format and 67 returns the equivalent number as an unsigned 64-bit number in little-endian 68 format. 69* `bswap16`: Takes an unsigned 16-bit number in either big- or little-endian 70 format and returns the equivalent number with the same bit width but 71 opposite endianness. 72* `bswap32`: Takes an unsigned 32-bit number in either big- or little-endian 73 format and returns the equivalent number with the same bit width but 74 opposite endianness. 75* `bswap64`: Takes an unsigned 64-bit number in either big- or little-endian 76 format and returns the equivalent number with the same bit width but 77 opposite endianness. 78 79 80Definitions 81----------- 82 83.. glossary:: 84 85 Sign Extend 86 To `sign extend an` ``X`` `-bit number, A, to a` ``Y`` `-bit number, B ,` means to 87 88 #. Copy all ``X`` bits from `A` to the lower ``X`` bits of `B`. 89 #. Set the value of the remaining ``Y`` - ``X`` bits of `B` to the value of 90 the most-significant bit of `A`. 91 92.. admonition:: Example 93 94 Sign extend an 8-bit number ``A`` to a 16-bit number ``B`` on a big-endian platform: 95 :: 96 97 A: 10000110 98 B: 11111111 10000110 99 100Registers and calling convention 101================================ 102 103eBPF has 10 general purpose registers and a read-only frame pointer register, 104all of which are 64-bits wide. 105 106The eBPF calling convention is defined as: 107 108* R0: return value from function calls, and exit value for eBPF programs 109* R1 - R5: arguments for function calls 110* R6 - R9: callee saved registers that function calls will preserve 111* R10: read-only frame pointer to access stack 112 113R0 - R5 are scratch registers and eBPF programs needs to spill/fill them if 114necessary across calls. 115 116Instruction encoding 117==================== 118 119eBPF has two instruction encodings: 120 121* the basic instruction encoding, which uses 64 bits to encode an instruction 122* the wide instruction encoding, which appends a second 64-bit immediate (i.e., 123 constant) value after the basic instruction for a total of 128 bits. 124 125The fields conforming an encoded basic instruction are stored in the 126following order:: 127 128 opcode:8 src_reg:4 dst_reg:4 offset:16 imm:32 // In little-endian BPF. 129 opcode:8 dst_reg:4 src_reg:4 offset:16 imm:32 // In big-endian BPF. 130 131**imm** 132 signed integer immediate value 133 134**offset** 135 signed integer offset used with pointer arithmetic 136 137**src_reg** 138 the source register number (0-10), except where otherwise specified 139 (`64-bit immediate instructions`_ reuse this field for other purposes) 140 141**dst_reg** 142 destination register number (0-10) 143 144**opcode** 145 operation to perform 146 147Note that the contents of multi-byte fields ('imm' and 'offset') are 148stored using big-endian byte ordering in big-endian BPF and 149little-endian byte ordering in little-endian BPF. 150 151For example:: 152 153 opcode offset imm assembly 154 src_reg dst_reg 155 07 0 1 00 00 44 33 22 11 r1 += 0x11223344 // little 156 dst_reg src_reg 157 07 1 0 00 00 11 22 33 44 r1 += 0x11223344 // big 158 159Note that most instructions do not use all of the fields. 160Unused fields shall be cleared to zero. 161 162As discussed below in `64-bit immediate instructions`_, a 64-bit immediate 163instruction uses a 64-bit immediate value that is constructed as follows. 164The 64 bits following the basic instruction contain a pseudo instruction 165using the same format but with opcode, dst_reg, src_reg, and offset all set to zero, 166and imm containing the high 32 bits of the immediate value. 167 168This is depicted in the following figure:: 169 170 basic_instruction 171 .-----------------------------. 172 | | 173 code:8 regs:8 offset:16 imm:32 unused:32 imm:32 174 | | 175 '--------------' 176 pseudo instruction 177 178Thus the 64-bit immediate value is constructed as follows: 179 180 imm64 = (next_imm << 32) | imm 181 182where 'next_imm' refers to the imm value of the pseudo instruction 183following the basic instruction. The unused bytes in the pseudo 184instruction are reserved and shall be cleared to zero. 185 186Instruction classes 187------------------- 188 189The three LSB bits of the 'opcode' field store the instruction class: 190 191========= ===== =============================== =================================== 192class value description reference 193========= ===== =============================== =================================== 194BPF_LD 0x00 non-standard load operations `Load and store instructions`_ 195BPF_LDX 0x01 load into register operations `Load and store instructions`_ 196BPF_ST 0x02 store from immediate operations `Load and store instructions`_ 197BPF_STX 0x03 store from register operations `Load and store instructions`_ 198BPF_ALU 0x04 32-bit arithmetic operations `Arithmetic and jump instructions`_ 199BPF_JMP 0x05 64-bit jump operations `Arithmetic and jump instructions`_ 200BPF_JMP32 0x06 32-bit jump operations `Arithmetic and jump instructions`_ 201BPF_ALU64 0x07 64-bit arithmetic operations `Arithmetic and jump instructions`_ 202========= ===== =============================== =================================== 203 204Arithmetic and jump instructions 205================================ 206 207For arithmetic and jump instructions (``BPF_ALU``, ``BPF_ALU64``, ``BPF_JMP`` and 208``BPF_JMP32``), the 8-bit 'opcode' field is divided into three parts: 209 210============== ====== ================= 2114 bits (MSB) 1 bit 3 bits (LSB) 212============== ====== ================= 213code source instruction class 214============== ====== ================= 215 216**code** 217 the operation code, whose meaning varies by instruction class 218 219**source** 220 the source operand location, which unless otherwise specified is one of: 221 222 ====== ===== ============================================== 223 source value description 224 ====== ===== ============================================== 225 BPF_K 0x00 use 32-bit 'imm' value as source operand 226 BPF_X 0x08 use 'src_reg' register value as source operand 227 ====== ===== ============================================== 228 229**instruction class** 230 the instruction class (see `Instruction classes`_) 231 232Arithmetic instructions 233----------------------- 234 235``BPF_ALU`` uses 32-bit wide operands while ``BPF_ALU64`` uses 64-bit wide operands for 236otherwise identical operations. 237The 'code' field encodes the operation as below, where 'src' and 'dst' refer 238to the values of the source and destination registers, respectively. 239 240========= ===== ======= ========================================================== 241code value offset description 242========= ===== ======= ========================================================== 243BPF_ADD 0x00 0 dst += src 244BPF_SUB 0x10 0 dst -= src 245BPF_MUL 0x20 0 dst \*= src 246BPF_DIV 0x30 0 dst = (src != 0) ? (dst / src) : 0 247BPF_SDIV 0x30 1 dst = (src != 0) ? (dst s/ src) : 0 248BPF_OR 0x40 0 dst \|= src 249BPF_AND 0x50 0 dst &= src 250BPF_LSH 0x60 0 dst <<= (src & mask) 251BPF_RSH 0x70 0 dst >>= (src & mask) 252BPF_NEG 0x80 0 dst = -dst 253BPF_MOD 0x90 0 dst = (src != 0) ? (dst % src) : dst 254BPF_SMOD 0x90 1 dst = (src != 0) ? (dst s% src) : dst 255BPF_XOR 0xa0 0 dst ^= src 256BPF_MOV 0xb0 0 dst = src 257BPF_MOVSX 0xb0 8/16/32 dst = (s8,s16,s32)src 258BPF_ARSH 0xc0 0 :term:`sign extending<Sign Extend>` dst >>= (src & mask) 259BPF_END 0xd0 0 byte swap operations (see `Byte swap instructions`_ below) 260========= ===== ======= ========================================================== 261 262Underflow and overflow are allowed during arithmetic operations, meaning 263the 64-bit or 32-bit value will wrap. If eBPF program execution would 264result in division by zero, the destination register is instead set to zero. 265If execution would result in modulo by zero, for ``BPF_ALU64`` the value of 266the destination register is unchanged whereas for ``BPF_ALU`` the upper 26732 bits of the destination register are zeroed. 268 269``BPF_ADD | BPF_X | BPF_ALU`` means:: 270 271 dst = (u32) ((u32) dst + (u32) src) 272 273where '(u32)' indicates that the upper 32 bits are zeroed. 274 275``BPF_ADD | BPF_X | BPF_ALU64`` means:: 276 277 dst = dst + src 278 279``BPF_XOR | BPF_K | BPF_ALU`` means:: 280 281 dst = (u32) dst ^ (u32) imm32 282 283``BPF_XOR | BPF_K | BPF_ALU64`` means:: 284 285 dst = dst ^ imm32 286 287Note that most instructions have instruction offset of 0. Only three instructions 288(``BPF_SDIV``, ``BPF_SMOD``, ``BPF_MOVSX``) have a non-zero offset. 289 290The division and modulo operations support both unsigned and signed flavors. 291 292For unsigned operations (``BPF_DIV`` and ``BPF_MOD``), for ``BPF_ALU``, 293'imm' is interpreted as a 32-bit unsigned value. For ``BPF_ALU64``, 294'imm' is first :term:`sign extended<Sign Extend>` from 32 to 64 bits, and then 295interpreted as a 64-bit unsigned value. 296 297For signed operations (``BPF_SDIV`` and ``BPF_SMOD``), for ``BPF_ALU``, 298'imm' is interpreted as a 32-bit signed value. For ``BPF_ALU64``, 'imm' 299is first :term:`sign extended<Sign Extend>` from 32 to 64 bits, and then 300interpreted as a 64-bit signed value. 301 302The ``BPF_MOVSX`` instruction does a move operation with sign extension. 303``BPF_ALU | BPF_MOVSX`` :term:`sign extends<Sign Extend>` 8-bit and 16-bit operands into 32 304bit operands, and zeroes the remaining upper 32 bits. 305``BPF_ALU64 | BPF_MOVSX`` :term:`sign extends<Sign Extend>` 8-bit, 16-bit, and 32-bit 306operands into 64 bit operands. 307 308Shift operations use a mask of 0x3F (63) for 64-bit operations and 0x1F (31) 309for 32-bit operations. 310 311Byte swap instructions 312---------------------- 313 314The byte swap instructions use instruction classes of ``BPF_ALU`` and ``BPF_ALU64`` 315and a 4-bit 'code' field of ``BPF_END``. 316 317The byte swap instructions operate on the destination register 318only and do not use a separate source register or immediate value. 319 320For ``BPF_ALU``, the 1-bit source operand field in the opcode is used to 321select what byte order the operation converts from or to. For 322``BPF_ALU64``, the 1-bit source operand field in the opcode is reserved 323and must be set to 0. 324 325========= ========= ===== ================================================= 326class source value description 327========= ========= ===== ================================================= 328BPF_ALU BPF_TO_LE 0x00 convert between host byte order and little endian 329BPF_ALU BPF_TO_BE 0x08 convert between host byte order and big endian 330BPF_ALU64 Reserved 0x00 do byte swap unconditionally 331========= ========= ===== ================================================= 332 333The 'imm' field encodes the width of the swap operations. The following widths 334are supported: 16, 32 and 64. 335 336Examples: 337 338``BPF_ALU | BPF_TO_LE | BPF_END`` with imm = 16/32/64 means:: 339 340 dst = htole16(dst) 341 dst = htole32(dst) 342 dst = htole64(dst) 343 344``BPF_ALU | BPF_TO_BE | BPF_END`` with imm = 16/32/64 means:: 345 346 dst = htobe16(dst) 347 dst = htobe32(dst) 348 dst = htobe64(dst) 349 350``BPF_ALU64 | BPF_TO_LE | BPF_END`` with imm = 16/32/64 means:: 351 352 dst = bswap16(dst) 353 dst = bswap32(dst) 354 dst = bswap64(dst) 355 356Jump instructions 357----------------- 358 359``BPF_JMP32`` uses 32-bit wide operands while ``BPF_JMP`` uses 64-bit wide operands for 360otherwise identical operations. 361The 'code' field encodes the operation as below: 362 363======== ===== === =========================================== ========================================= 364code value src description notes 365======== ===== === =========================================== ========================================= 366BPF_JA 0x0 0x0 PC += offset BPF_JMP class 367BPF_JA 0x0 0x0 PC += imm BPF_JMP32 class 368BPF_JEQ 0x1 any PC += offset if dst == src 369BPF_JGT 0x2 any PC += offset if dst > src unsigned 370BPF_JGE 0x3 any PC += offset if dst >= src unsigned 371BPF_JSET 0x4 any PC += offset if dst & src 372BPF_JNE 0x5 any PC += offset if dst != src 373BPF_JSGT 0x6 any PC += offset if dst > src signed 374BPF_JSGE 0x7 any PC += offset if dst >= src signed 375BPF_CALL 0x8 0x0 call helper function by address see `Helper functions`_ 376BPF_CALL 0x8 0x1 call PC += offset see `Program-local functions`_ 377BPF_CALL 0x8 0x2 call helper function by BTF ID see `Helper functions`_ 378BPF_EXIT 0x9 0x0 return BPF_JMP only 379BPF_JLT 0xa any PC += offset if dst < src unsigned 380BPF_JLE 0xb any PC += offset if dst <= src unsigned 381BPF_JSLT 0xc any PC += offset if dst < src signed 382BPF_JSLE 0xd any PC += offset if dst <= src signed 383======== ===== === =========================================== ========================================= 384 385The eBPF program needs to store the return value into register R0 before doing a 386``BPF_EXIT``. 387 388Example: 389 390``BPF_JSGE | BPF_X | BPF_JMP32`` (0x7e) means:: 391 392 if (s32)dst s>= (s32)src goto +offset 393 394where 's>=' indicates a signed '>=' comparison. 395 396``BPF_JA | BPF_K | BPF_JMP32`` (0x06) means:: 397 398 gotol +imm 399 400where 'imm' means the branch offset comes from insn 'imm' field. 401 402Note that there are two flavors of ``BPF_JA`` instructions. The 403``BPF_JMP`` class permits a 16-bit jump offset specified by the 'offset' 404field, whereas the ``BPF_JMP32`` class permits a 32-bit jump offset 405specified by the 'imm' field. A > 16-bit conditional jump may be 406converted to a < 16-bit conditional jump plus a 32-bit unconditional 407jump. 408 409Helper functions 410~~~~~~~~~~~~~~~~ 411 412Helper functions are a concept whereby BPF programs can call into a 413set of function calls exposed by the underlying platform. 414 415Historically, each helper function was identified by an address 416encoded in the imm field. The available helper functions may differ 417for each program type, but address values are unique across all program types. 418 419Platforms that support the BPF Type Format (BTF) support identifying 420a helper function by a BTF ID encoded in the imm field, where the BTF ID 421identifies the helper name and type. 422 423Program-local functions 424~~~~~~~~~~~~~~~~~~~~~~~ 425Program-local functions are functions exposed by the same BPF program as the 426caller, and are referenced by offset from the call instruction, similar to 427``BPF_JA``. A ``BPF_EXIT`` within the program-local function will return to 428the caller. 429 430Load and store instructions 431=========================== 432 433For load and store instructions (``BPF_LD``, ``BPF_LDX``, ``BPF_ST``, and ``BPF_STX``), the 4348-bit 'opcode' field is divided as: 435 436============ ====== ================= 4373 bits (MSB) 2 bits 3 bits (LSB) 438============ ====== ================= 439mode size instruction class 440============ ====== ================= 441 442The mode modifier is one of: 443 444 ============= ===== ==================================== ============= 445 mode modifier value description reference 446 ============= ===== ==================================== ============= 447 BPF_IMM 0x00 64-bit immediate instructions `64-bit immediate instructions`_ 448 BPF_ABS 0x20 legacy BPF packet access (absolute) `Legacy BPF Packet access instructions`_ 449 BPF_IND 0x40 legacy BPF packet access (indirect) `Legacy BPF Packet access instructions`_ 450 BPF_MEM 0x60 regular load and store operations `Regular load and store operations`_ 451 BPF_MEMSX 0x80 sign-extension load operations `Sign-extension load operations`_ 452 BPF_ATOMIC 0xc0 atomic operations `Atomic operations`_ 453 ============= ===== ==================================== ============= 454 455The size modifier is one of: 456 457 ============= ===== ===================== 458 size modifier value description 459 ============= ===== ===================== 460 BPF_W 0x00 word (4 bytes) 461 BPF_H 0x08 half word (2 bytes) 462 BPF_B 0x10 byte 463 BPF_DW 0x18 double word (8 bytes) 464 ============= ===== ===================== 465 466Regular load and store operations 467--------------------------------- 468 469The ``BPF_MEM`` mode modifier is used to encode regular load and store 470instructions that transfer data between a register and memory. 471 472``BPF_MEM | <size> | BPF_STX`` means:: 473 474 *(size *) (dst + offset) = src 475 476``BPF_MEM | <size> | BPF_ST`` means:: 477 478 *(size *) (dst + offset) = imm32 479 480``BPF_MEM | <size> | BPF_LDX`` means:: 481 482 dst = *(unsigned size *) (src + offset) 483 484Where size is one of: ``BPF_B``, ``BPF_H``, ``BPF_W``, or ``BPF_DW`` and 485'unsigned size' is one of u8, u16, u32 or u64. 486 487Sign-extension load operations 488------------------------------ 489 490The ``BPF_MEMSX`` mode modifier is used to encode :term:`sign-extension<Sign Extend>` load 491instructions that transfer data between a register and memory. 492 493``BPF_MEMSX | <size> | BPF_LDX`` means:: 494 495 dst = *(signed size *) (src + offset) 496 497Where size is one of: ``BPF_B``, ``BPF_H`` or ``BPF_W``, and 498'signed size' is one of s8, s16 or s32. 499 500Atomic operations 501----------------- 502 503Atomic operations are operations that operate on memory and can not be 504interrupted or corrupted by other access to the same memory region 505by other eBPF programs or means outside of this specification. 506 507All atomic operations supported by eBPF are encoded as store operations 508that use the ``BPF_ATOMIC`` mode modifier as follows: 509 510* ``BPF_ATOMIC | BPF_W | BPF_STX`` for 32-bit operations 511* ``BPF_ATOMIC | BPF_DW | BPF_STX`` for 64-bit operations 512* 8-bit and 16-bit wide atomic operations are not supported. 513 514The 'imm' field is used to encode the actual atomic operation. 515Simple atomic operation use a subset of the values defined to encode 516arithmetic operations in the 'imm' field to encode the atomic operation: 517 518======== ===== =========== 519imm value description 520======== ===== =========== 521BPF_ADD 0x00 atomic add 522BPF_OR 0x40 atomic or 523BPF_AND 0x50 atomic and 524BPF_XOR 0xa0 atomic xor 525======== ===== =========== 526 527 528``BPF_ATOMIC | BPF_W | BPF_STX`` with 'imm' = BPF_ADD means:: 529 530 *(u32 *)(dst + offset) += src 531 532``BPF_ATOMIC | BPF_DW | BPF_STX`` with 'imm' = BPF ADD means:: 533 534 *(u64 *)(dst + offset) += src 535 536In addition to the simple atomic operations, there also is a modifier and 537two complex atomic operations: 538 539=========== ================ =========================== 540imm value description 541=========== ================ =========================== 542BPF_FETCH 0x01 modifier: return old value 543BPF_XCHG 0xe0 | BPF_FETCH atomic exchange 544BPF_CMPXCHG 0xf0 | BPF_FETCH atomic compare and exchange 545=========== ================ =========================== 546 547The ``BPF_FETCH`` modifier is optional for simple atomic operations, and 548always set for the complex atomic operations. If the ``BPF_FETCH`` flag 549is set, then the operation also overwrites ``src`` with the value that 550was in memory before it was modified. 551 552The ``BPF_XCHG`` operation atomically exchanges ``src`` with the value 553addressed by ``dst + offset``. 554 555The ``BPF_CMPXCHG`` operation atomically compares the value addressed by 556``dst + offset`` with ``R0``. If they match, the value addressed by 557``dst + offset`` is replaced with ``src``. In either case, the 558value that was at ``dst + offset`` before the operation is zero-extended 559and loaded back to ``R0``. 560 56164-bit immediate instructions 562----------------------------- 563 564Instructions with the ``BPF_IMM`` 'mode' modifier use the wide instruction 565encoding defined in `Instruction encoding`_, and use the 'src' field of the 566basic instruction to hold an opcode subtype. 567 568The following table defines a set of ``BPF_IMM | BPF_DW | BPF_LD`` instructions 569with opcode subtypes in the 'src' field, using new terms such as "map" 570defined further below: 571 572========================= ====== === ========================================= =========== ============== 573opcode construction opcode src pseudocode imm type dst type 574========================= ====== === ========================================= =========== ============== 575BPF_IMM | BPF_DW | BPF_LD 0x18 0x0 dst = imm64 integer integer 576BPF_IMM | BPF_DW | BPF_LD 0x18 0x1 dst = map_by_fd(imm) map fd map 577BPF_IMM | BPF_DW | BPF_LD 0x18 0x2 dst = map_val(map_by_fd(imm)) + next_imm map fd data pointer 578BPF_IMM | BPF_DW | BPF_LD 0x18 0x3 dst = var_addr(imm) variable id data pointer 579BPF_IMM | BPF_DW | BPF_LD 0x18 0x4 dst = code_addr(imm) integer code pointer 580BPF_IMM | BPF_DW | BPF_LD 0x18 0x5 dst = map_by_idx(imm) map index map 581BPF_IMM | BPF_DW | BPF_LD 0x18 0x6 dst = map_val(map_by_idx(imm)) + next_imm map index data pointer 582========================= ====== === ========================================= =========== ============== 583 584where 585 586* map_by_fd(imm) means to convert a 32-bit file descriptor into an address of a map (see `Maps`_) 587* map_by_idx(imm) means to convert a 32-bit index into an address of a map 588* map_val(map) gets the address of the first value in a given map 589* var_addr(imm) gets the address of a platform variable (see `Platform Variables`_) with a given id 590* code_addr(imm) gets the address of the instruction at a specified relative offset in number of (64-bit) instructions 591* the 'imm type' can be used by disassemblers for display 592* the 'dst type' can be used for verification and JIT compilation purposes 593 594Maps 595~~~~ 596 597Maps are shared memory regions accessible by eBPF programs on some platforms. 598A map can have various semantics as defined in a separate document, and may or 599may not have a single contiguous memory region, but the 'map_val(map)' is 600currently only defined for maps that do have a single contiguous memory region. 601 602Each map can have a file descriptor (fd) if supported by the platform, where 603'map_by_fd(imm)' means to get the map with the specified file descriptor. Each 604BPF program can also be defined to use a set of maps associated with the 605program at load time, and 'map_by_idx(imm)' means to get the map with the given 606index in the set associated with the BPF program containing the instruction. 607 608Platform Variables 609~~~~~~~~~~~~~~~~~~ 610 611Platform variables are memory regions, identified by integer ids, exposed by 612the runtime and accessible by BPF programs on some platforms. The 613'var_addr(imm)' operation means to get the address of the memory region 614identified by the given id. 615 616Legacy BPF Packet access instructions 617------------------------------------- 618 619eBPF previously introduced special instructions for access to packet data that were 620carried over from classic BPF. However, these instructions are 621deprecated and should no longer be used. 622