@@ -265,24 +265,26 @@ otherwise identical operations.
The 4-bit 'code' field encodes the operation as below, where PC is the program counter:
-======== ===== ========================= ============
-code value description notes
-======== ===== ========================= ============
-BPF_JA 0x00 PC += off BPF_JMP only
-BPF_JEQ 0x10 PC += off if dst == src
-BPF_JGT 0x20 PC += off if dst > src unsigned
-BPF_JGE 0x30 PC += off if dst >= src unsigned
-BPF_JSET 0x40 PC += off if dst & src
-BPF_JNE 0x50 PC += off if dst != src
-BPF_JSGT 0x60 PC += off if dst > src signed
-BPF_JSGE 0x70 PC += off if dst >= src signed
-BPF_CALL 0x80 function call see `Helper functions`_
-BPF_EXIT 0x90 function / program return BPF_JMP only
-BPF_JLT 0xa0 PC += off if dst < src unsigned
-BPF_JLE 0xb0 PC += off if dst <= src unsigned
-BPF_JSLT 0xc0 PC += off if dst < src signed
-BPF_JSLE 0xd0 PC += off if dst <= src signed
-======== ===== ========================= ============
+======== ===== === ========================== ========================
+code value src description notes
+======== ===== === ========================== ========================
+BPF_JA 0x0 0x0 PC += offset BPF_JMP only
+BPF_JEQ 0x1 any PC += offset if dst == src
+BPF_JGT 0x2 any PC += offset if dst > src unsigned
+BPF_JGE 0x3 any PC += offset if dst >= src unsigned
+BPF_JSET 0x4 any PC += offset if dst & src
+BPF_JNE 0x5 any PC += offset if dst != src
+BPF_JSGT 0x6 any PC += offset if dst > src signed
+BPF_JSGE 0x7 any PC += offset if dst >= src signed
+BPF_CALL 0x8 0x0 call helper function imm see `Helper functions`_
+BPF_CALL 0x8 0x1 call PC += offset see `eBPF functions`_
+BPF_CALL 0x8 0x2 call runtime function imm see `Runtime functions`_
+BPF_EXIT 0x9 0x0 return BPF_JMP only
+BPF_JLT 0xa any PC += offset if dst < src unsigned
+BPF_JLE 0xb any PC += offset if dst <= src unsigned
+BPF_JSLT 0xc any PC += offset if dst < src signed
+BPF_JSLE 0xd any PC += offset if dst <= src signed
+======== ===== === ========================== ========================
Helper functions
~~~~~~~~~~~~~~~~
@@ -301,6 +303,18 @@ with the remaining registers being ignored. The definition of a helper function
is responsible for specifying the type (e.g., integer, pointer, etc.) of the value returned,
the number of arguments, and the type of each argument.
+Runtime functions
+~~~~~~~~~~~~~~~~~
+Runtime functions are like helper functions except that they are not specific
+to eBPF programs. They use a different numbering space from helper functions,
+but otherwise the same considerations apply.
+
+eBPF functions
+~~~~~~~~~~~~~~
+eBPF functions are functions exposed by the same eBPF program as the caller,
+and are referenced by offset from the call instruction, similar to ``BPF_JA``.
+A ``BPF_EXIT`` within the eBPF function will return to the caller.
+
Load and store instructions
===========================
@@ -585,6 +599,8 @@ opcode src imm description referenc
0x7f any 0x00 dst >>= src `Arithmetic instructions`_
0x84 0x0 0x00 dst = (uint32_t)-dst `Arithmetic instructions`_
0x85 0x0 any call helper function imm `Helper functions`_
+0x85 0x1 any call PC += offset `eBPF functions`_
+0x85 0x2 any call runtime function imm `Runtime functions`_
0x87 0x0 0x00 dst = -dst `Arithmetic instructions`_
0x94 0x0 any dst = (uint32_t)((imm != 0) ? (dst % imm) : dst) `Arithmetic instructions`_
0x95 0x0 0x00 return `Jump instructions`_