From: David Vernet <void@manifault.com>
To: Dave Thaler <dthaler1968=40googlemail.com@dmarc.ietf.org>
Cc: bpf@vger.kernel.org, bpf@ietf.org, Dave Thaler <dthaler@microsoft.com>
Subject: Re: [Bpf] [PATCH bpf-next v3] bpf, docs: Add docs on extended 64-bit immediate instructions
Date: Sat, 25 Mar 2023 22:28:39 -0500 [thread overview]
Message-ID: <20230326032839.GF363182@maniforge> (raw)
In-Reply-To: <20230325224305.2157-1-dthaler1968@googlemail.com>
On Sat, Mar 25, 2023 at 10:43:05PM +0000, Dave Thaler wrote:
> From: Dave Thaler <dthaler@microsoft.com>
>
> Add docs on extended 64-bit immediate instructions, including six instructions
> previously undocumented. Include a brief description of map objects, and variables,
> as used by those instructions.
>
> ---
> V1 -> V2: rebased on top of latest master
>
> V2 -> V3: addressed comments from Alexei
>
> Signed-off-by: Dave Thaler <dthaler@microsoft.com>
> ---
> Documentation/bpf/instruction-set.rst | 56 +++++++++++++++++++++++----
> Documentation/bpf/linux-notes.rst | 13 +++++++
> 2 files changed, 61 insertions(+), 8 deletions(-)
>
> diff --git a/Documentation/bpf/instruction-set.rst b/Documentation/bpf/instruction-set.rst
> index db8789e6969..2c8347d63e7 100644
> --- a/Documentation/bpf/instruction-set.rst
> +++ b/Documentation/bpf/instruction-set.rst
> @@ -385,14 +385,54 @@ and loaded back to ``R0``.
> -----------------------------
>
> Instructions with the ``BPF_IMM`` 'mode' modifier use the wide instruction
> -encoding for an extra imm64 value.
> -
> -There is currently only one such instruction.
> -
> -``BPF_LD | BPF_DW | BPF_IMM`` means::
> -
> - dst = imm64
> -
> +encoding defined in `Instruction encoding`_, and use the 'src' field of the
> +basic instruction to hold an opcode subtype.
> +
> +The following instructions are defined, and use additional concepts defined below:
nit: Perhaps this is a bit clearer? Wdyt?
The following opcode subtypes are defined for `BPF_IMM | BPF_DQ |
BPF_LD` instructions, with new terms such as "map" defined further
below:
> +
> +========================= ====== === ========================================= =========== ==============
> +opcode construction opcode src pseudocode imm type dst type
> +========================= ====== === ========================================= =========== ==============
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x0 dst = imm64 integer integer
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x1 dst = map_by_fd(imm) map fd map
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x2 dst = map_val(map_by_fd(imm)) + next_imm map fd data pointer
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x3 dst = var_addr(imm) variable id data pointer
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x4 dst = code_addr(imm) integer code pointer
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x5 dst = map_by_idx(imm) map index map
> +BPF_IMM | BPF_DW | BPF_LD 0x18 0x6 dst = map_val(map_by_idx(imm)) + next_imm map index data pointer
> +========================= ====== === ========================================= =========== ==============
> +
> +where
> +
> +* map_by_fd(imm) means to convert a 32-bit POSIX file descriptor into an address of a map object (see `Map objects`_)
> +* map_by_idx(imm) means to convert a 32-bit index into an address of a map object
> +* map_val(map) gets the address of the first value in a given map object
> +* var_addr(imm) gets the address of a platform variable (see `Platform Variables`_) with a given id
> +* code_addr(imm) gets the address of the instruction at a specified relative offset in number of (64-bit) instructions
> +* the 'imm type' can be used by disassemblers for display
> +* the 'dst type' can be used for verification and JIT compilation purposes
> +
> +Map objects
> +~~~~~~~~~~~
> +
> +Maps are shared memory regions accessible by eBPF programs on some platforms, where we use the term "map object"
> +to refer to an object containing the data and metadata (e.g., size) about the memory region.
> +A map can have various semantics as defined in a separate document, and may or may not have a single
> +contiguous memory region, but the 'map_val(map)' is currently only defined for maps that do have a single
> +contiguous memory region.
> +
> +Each map object can have a POSIX file descriptor (fd) if supported by the platform,
> +where 'map_by_fd(imm)' means to get the map with the specified file descriptor.
> +Each BPF program can also be defined to use a set of maps associated with the program
> +at load time, and 'map_by_idx(imm)' means to get the map with the given index in the set
> +associated with the BPF program containing the instruction.
> +
> +Platform Variables
> +~~~~~~~~~~~~~~~~~~
> +
> +Platform variables are memory regions, identified by integer ids, exposed by the runtime and accessible by BPF programs on
> +some platforms. The 'var_addr(imm)' operation means to get the address of the memory region
> +identified by the given id.
>
> Legacy BPF Packet access instructions
> -------------------------------------
> diff --git a/Documentation/bpf/linux-notes.rst b/Documentation/bpf/linux-notes.rst
> index 956b0c86699..2d161467105 100644
> --- a/Documentation/bpf/linux-notes.rst
> +++ b/Documentation/bpf/linux-notes.rst
> @@ -12,6 +12,19 @@ Byte swap instructions
>
> ``BPF_FROM_LE`` and ``BPF_FROM_BE`` exist as aliases for ``BPF_TO_LE`` and ``BPF_TO_BE`` respectively.
>
> +Map objects
> +===========
> +
> +Linux only supports the 'map_val(map)' operation on array maps with a single element.
> +
> +Linux uses an fd_array to store maps associated with a BPF program. Thus,
> +map_by_index(index) uses the fd at that index in the array.
> +
> +Variables
> +=========
> +
> +Linux uses BTF ids to identify variables.
Not quite sure exactly what this means. Linux uses BTF ids to identify
_types_, right? This doesn't seem like something that needs to be
specified as Linux specific either, even if it's not yet supported
elsewhere. Certain legacy things such as Linux-specific helpers make
sense, but not sure about BTF ids.
> +
> Legacy BPF Packet access instructions
> =====================================
>
> --
> 2.33.4
>
> --
> Bpf mailing list
> Bpf@ietf.org
> https://www.ietf.org/mailman/listinfo/bpf
next prev parent reply other threads:[~2023-03-26 3:28 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-25 22:43 [PATCH bpf-next v3] bpf, docs: Add docs on extended 64-bit immediate instructions Dave Thaler
2023-03-26 3:28 ` David Vernet [this message]
2023-03-26 5:00 ` [Bpf] " David Vernet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230326032839.GF363182@maniforge \
--to=void@manifault.com \
--cc=bpf@ietf.org \
--cc=bpf@vger.kernel.org \
--cc=dthaler1968=40googlemail.com@dmarc.ietf.org \
--cc=dthaler@microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.