* Add a "callx" conformance group * Add callx rows to table * Update helper function to section to be agnostic between BPF_K vs BPF_X * Rename "legacy" conformance group to "packet" Based on mailing list discussion at https://mailarchive.ietf.org/arch/msg/bpf/l5tNEgL-Wo7qSEuaGssOl5VChKk/ v1->v2: Incorporated feedback from Will Hawkins v2->v3: Use "dst" not "imm" field Signed-off-by: Dave Thaler <dthaler1968@xxxxxxxxx> --- .../bpf/standardization/instruction-set.rst | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Documentation/bpf/standardization/instruction-set.rst b/Documentation/bpf/standardization/instruction-set.rst index bdfe0cd0e..4bba656b6 100644 --- a/Documentation/bpf/standardization/instruction-set.rst +++ b/Documentation/bpf/standardization/instruction-set.rst @@ -127,7 +127,7 @@ This document defines the following conformance groups: * divmul32: includes 32-bit division, multiplication, and modulo instructions. * divmul64: includes divmul32, plus 64-bit division, multiplication, and modulo instructions. -* legacy: deprecated packet access instructions. +* packet: deprecated packet access instructions. Instruction encoding ==================== @@ -404,9 +404,12 @@ 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 by address BPF_JMP | BPF_K only, see `Helper functions`_ +BPF_CALL 0x8 0x0 call_by_address(imm) BPF_JMP | BPF_K only +BPF_CALL 0x8 0x0 call_by_address(dst) BPF_JMP | BPF_X only BPF_CALL 0x8 0x1 call PC += imm BPF_JMP | BPF_K only, see `Program-local functions`_ -BPF_CALL 0x8 0x2 call helper function by BTF ID BPF_JMP | BPF_K only, see `Helper functions`_ +BPF_CALL 0x8 0x1 call PC += dst BPF_JMP | BPF_X only, see `Program-local functions`_ +BPF_CALL 0x8 0x2 call_by_btfid(imm) BPF_JMP | BPF_K only +BPF_CALL 0x8 0x2 call_by_btfid(dst) BPF_JMP | BPF_X only BPF_EXIT 0x9 0x0 return BPF_JMP | BPF_K only BPF_JLT 0xa any PC += offset if dst < src unsigned BPF_JLE 0xb any PC += offset if dst <= src unsigned @@ -414,6 +417,11 @@ BPF_JSLT 0xc any PC += offset if dst < src signed BPF_JSLE 0xd any PC += offset if dst <= src signed ======== ===== === =============================== ============================================= +where + +* call_by_address(value) means to call a helper function by the address specified by 'value' (see `Helper functions`_ for details) +* call_by_btfid(value) means to call a helper function by the BTF ID specified by 'value' (see `Helper functions`_ for details) + The BPF program needs to store the return value into register R0 before doing a ``BPF_EXIT``. @@ -438,8 +446,9 @@ specified by the 'imm' field. A > 16-bit conditional jump may be converted to a < 16-bit conditional jump plus a 32-bit unconditional jump. -All ``BPF_CALL`` and ``BPF_JA`` instructions belong to the -base32 conformance group. +All ``BPF_CALL | BPF_X`` instructions belong to the callx +conformance group. All other ``BPF_CALL`` instructions and all +``BPF_JA`` instructions belong to the base32 conformance group. Helper functions ~~~~~~~~~~~~~~~~ @@ -447,13 +456,13 @@ Helper functions Helper functions are a concept whereby BPF programs can call into a set of function calls exposed by the underlying platform. -Historically, each helper function was identified by an address -encoded in the imm field. The available helper functions may differ -for each program type, but address values are unique across all program types. +Historically, each helper function was identified by an address. +The available helper functions may differ for each program type, +but address values are unique across all program types. Platforms that support the BPF Type Format (BTF) support identifying -a helper function by a BTF ID encoded in the imm field, where the BTF ID -identifies the helper name and type. +a helper function by a BTF ID, where the BTF ID identifies the helper +name and type. Program-local functions ~~~~~~~~~~~~~~~~~~~~~~~ @@ -660,4 +669,4 @@ carried over from classic BPF. These instructions used an instruction class of BPF_LD, a size modifier of BPF_W, BPF_H, or BPF_B, and a mode modifier of BPF_ABS or BPF_IND. However, these instructions are deprecated and should no longer be used. All legacy packet access -instructions belong to the "legacy" conformance group. +instructions belong to the "packet" conformance group. -- 2.40.1