rfc9669xml2.original.xml   rfc9669.xml 
<?xml version="1.0" encoding="UTF-8"?> <?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<!-- generated by https://github.com/dthaler/rst2rfcxml version 0.1 -->
<!DOCTYPE rfc [ <!DOCTYPE rfc [
<!ENTITY nbsp "&#160;">
<!ENTITY zwsp "&#8203;">
<!ENTITY nbhy "&#8209;">
<!ENTITY wj "&#8288;">
]> ]>
<?rfc rfcedstyle="yes"?> <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft
<?rfc toc="yes"?> -ietf-bpf-isa-04" number="9669" updates="" obsoletes="" consensus="true" catego
<?rfc tocindent="yes"?> ry="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true"
<?rfc sortrefs="yes"?> version="3" xml:lang="en">
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>
<rfc ipr="trust200902" docName="draft-ietf-bpf-isa-04" category="std" submission <front>
Type="IETF"> <title abbrev="BPF ISA">BPF Instruction Set Architecture (ISA)</title>
<front> <seriesInfo name="RFC" value="9669"/>
<title abbrev="BPF ISA"> <author initials="D." surname="Thaler" fullname="Dave Thaler" role="editor">
BPF Instruction Set Architecture (ISA) <address>
</title> <postal>
<author initials="D." surname="Thaler" fullname="Dave Thaler" role="editor"> <city>Redmond</city>
<address> <code>98052</code>
<postal> <country>United States of America</country>
<city>Redmond</city> <region>WA</region>
<code>98052</code> </postal>
<country>USA</country> <email>dave.thaler.ietf@gmail.com</email>
<region>WA</region> </address>
</postal> </author>
<email>dave.thaler.ietf@gmail.com</email> <date month="October" year="2024"/>
</address> <area>INT</area>
</author> <workgroup>bdf</workgroup>
<abstract>
<t> <keyword>eBPF</keyword>
eBPF (which is no longer an acronym for anything), also commonly referred to <keyword>virtual machine</keyword>
as BPF, is a technology with origins in the Linux kernel that can run untrusted <keyword>extensibility</keyword>
programs in a privileged context such as an operating system kernel. This docum
ent specifies the BPF instruction set architecture (ISA). <abstract>
</t> <t> eBPF (which is no longer an acronym for anything), also commonly
</abstract> referred to as BPF, is a technology with origins in the Linux kernel
</front> that can run untrusted programs in a privileged context such as an
<middle> operating system kernel. This document specifies the BPF instruction set
<section anchor="introduction" title="Introduction"> architecture (ISA).
<t> </t>
</abstract>
</front>
<middle>
<section anchor="introduction">
<name>Introduction</name>
<t>
eBPF, also commonly eBPF, 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).
</t> </t>
<t> <t>
As a historical note, BPF originally stood for Berkeley Packet Filter, As a historical note, BPF originally stood for Berkeley Packet Filter,
but now that it can do so much more than packet filtering, the acronym but now that it can do so much more than packet filtering, the acronym
no longer makes sense. BPF is now considered a standalone term that no longer makes sense. BPF is now considered a standalone term that
does not stand for anything. The original BPF is sometimes referred to does not stand for anything. The original BPF is sometimes referred to
as cBPF (classic BPF) to distinguish it from the now widely deployed as cBPF (classic BPF) to distinguish it from the now widely deployed
eBPF (extended BPF). eBPF (extended BPF).
</t> </t>
</section> </section>
<section anchor="documentation-conventions" title="Documentation conventions"> <section anchor="documentation-conventions">
<t> <name>Documentation Conventions</name>
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", <t>
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
"OPTIONAL" in this document are to be interpreted as described in "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>
BCP 14 <xref target="RFC2119"></xref> ",
<xref target="RFC8174"></xref> "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
when, and only when, they appear in all capitals, as shown here. "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
</t> "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to
<t> be
interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/> <xref
target="RFC8174"/> when, and only when, they appear in all capitals, as
shown here.
</t>
<t>
For brevity and consistency, this document refers to families For brevity and consistency, this document refers to families
of types using a shorthand syntax and refers to several expository, of 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.
</t> </t>
<section anchor="types" title="Types"> <section anchor="types">
<t> <name>Types</name>
This document refers to integer types with the notation <em>SN</em> to spec
ify
a type's signedness (<em>S</em>) and bit width (<em>N</em>), respectively.
</t>
<table>
<name>Meaning of signedness notation</name>
<thead>
<tr>
<th>S</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t> <t>
u This document refers to integer types with the notation SN to specify
a type's signedness (S) and bit width (N), respectively.
</t> </t>
</td> <table>
<td> <name>Meaning of Signedness Notation</name>
<t> <thead>
<tr>
<th>S</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
u
</t>
</td>
<td>
<t>
unsigned unsigned
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
s s
</t> </t>
</td> </td>
<td> <td>
<t> <t>
signed signed
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<table> <table>
<name>Meaning of bit-width notation</name> <name>Meaning of Bit-Width Notation</name>
<thead> <thead>
<tr> <tr>
<th>N</th> <th>N</th>
<th>Bit width</th> <th>Bit Width</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<t> <t>
8 8
</t> </t>
</td> </td>
<td> <td>
<t> <t>
8 bits 8 bits
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
16 16
</t> </t>
</td> </td>
<td> <td>
<t> <t>
16 bits 16 bits
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
32 32
</t> </t>
</td> </td>
<td> <td>
<t> <t>
32 bits 32 bits
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
64 64
</t> </t>
</td> </td>
<td> <td>
<t> <t>
64 bits 64 bits
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
128 128
</t> </t>
</td> </td>
<td> <td>
<t> <t>
128 bits 128 bits
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
For example, <em>u32</em> is a type whose valid values are all the 32-bit u nsigned For example, <em>u32</em> is a type whose valid values are all the 32-bit u nsigned
numbers and <em>s16</em> is a type whose valid values are all the 16-bit si gned numbers and <em>s16</em> is a type whose valid values are all the 16-bit si gned
numbers. numbers.
</t> </t>
</section> </section>
<section anchor="functions" title="Functions"> <section anchor="functions">
<t> <name>Functions</name>
The following byteswap functions are direction-agnostic. That is, <t>
The following byte swap functions are direction agnostic. That is,
the same function is used for conversion in either direction discussed the same function is used for conversion in either direction discussed
below. below.
</t> </t>
<ul> <ul>
<li> <li>
be16: Takes an unsigned 16-bit number and converts it between be16: Takes an unsigned 16-bit number and converts it between
host byte order and big-endian host byte order and big-endian
(<xref target="IEN137">IEN137</xref>) byte order. byte order <xref target="IEN137"/>.
</li> </li>
<li> <li>
be32: Takes an unsigned 32-bit number and converts it between be32: Takes an unsigned 32-bit number and converts it between
host byte order and big-endian byte order. host byte order and big-endian byte order.
</li> </li>
<li> <li>
be64: Takes an unsigned 64-bit number and converts it between be64: Takes an unsigned 64-bit number and converts it between
host byte order and big-endian byte order. host byte order and big-endian byte order.
</li> </li>
<li> <li>
bswap16: Takes an unsigned 16-bit number in either big- or little-endian bswap16: Takes an unsigned 16-bit number in either big- or little-endian
format and returns the equivalent number with the same bit width but format and returns the equivalent number with the same bit width but
opposite endianness. opposite endianness.
</li> </li>
<li> <li>
bswap32: Takes an unsigned 32-bit number in either big- or little-endian bswap32: Takes an unsigned 32-bit number in either big- or little-endian
format and returns the equivalent number with the same bit width but format and returns the equivalent number with the same bit width but
opposite endianness. opposite endianness.
</li> </li>
<li> <li>
bswap64: Takes an unsigned 64-bit number in either big- or little-endian bswap64: Takes an unsigned 64-bit number in either big- or little-endian
format and returns the equivalent number with the same bit width but format and returns the equivalent number with the same bit width but
opposite endianness. opposite endianness.
</li> </li>
<li> <li>
le16: Takes an unsigned 16-bit number and converts it between le16: Takes an unsigned 16-bit number and converts it between
host byte order and little-endian byte order. host byte order and little-endian byte order.
</li> </li>
<li> <li>
le32: Takes an unsigned 32-bit number and converts it between le32: Takes an unsigned 32-bit number and converts it between
host byte order and little-endian byte order. host byte order and little-endian byte order.
</li> </li>
<li> <li>
le64: Takes an unsigned 64-bit number and converts it between le64: Takes an unsigned 64-bit number and converts it between
host byte order and little-endian byte order. host byte order and little-endian byte order.
</li> </li>
</ul> </ul>
</section> </section>
<section anchor="definitions" title="Definitions"> <section anchor="definitions">
<dl> <name>Definitions</name>
<dt anchor="term-sign-extend"> <dl>
Sign Extend <dt anchor="term-sign-extend">
</dt> Sign Extend:
<dd> </dt>
<t> <dd>
To <em>sign extend an</em> <tt>X</tt> <em>-bit number, A, to a</em> <tt>Y <t>To sign extend an <tt>X</tt>-bit number, A, to a <tt>Y</tt>-bit
</tt> <em>-bit number, B ,</em> means to number, B, means to
</t> </t>
<ol> <ol>
<li> <li>
Copy all <tt>X</tt> bits from <em>A</em> to the lower <tt>X</tt> bits of <em>B</em>. Copy all <tt>X</tt> bits from A to the lower <tt>X</tt> bits of B.
</li> </li>
<li> <li>
Set the value of the remaining <tt>Y</tt> - <tt>X</tt> bits of <em>B</em Set the value of the remaining <tt>Y</tt> - <tt>X</tt> bits of B to the
> to the value of value of
the most-significant bit of <em>A</em>. the most significant bit of A.
</li> </li>
</ol> </ol>
</dd> </dd>
</dl> </dl>
<aside> <aside>
<t><strong>Example</strong></t> <t><strong>Example</strong></t>
<t> <t>
Sign extend an 8-bit number <tt>A</tt> to a 16-bit number <tt>B</tt> on a Sign extend an 8-bit number A to a 16-bit number B on a big-endian platfor
big-endian platform: m:
</t> </t>
<artwork> <artwork><![CDATA[
A: 10000110 A: 10000110
B: 11111111 10000110 B: 11111111 10000110
</artwork> ]]></artwork>
</aside> </aside>
</section> </section>
<section anchor="conformance-groups" title="Conformance groups"> <section anchor="conformance-groups">
<t> <name>Conformance Groups</name>
<t>
An implementation does not need to support all instructions specified in th is An implementation does not need to support all instructions specified in th is
document (e.g., deprecated instructions). Instead, a number of conformance document (e.g., deprecated instructions). Instead, a number of conformance
groups are specified. An implementation MUST support the base32 conformanc groups are specified. An implementation <bcp14>MUST</bcp14> support the ba
e se32 conformance
group and MAY support additional conformance groups, where supporting a group and <bcp14>MAY</bcp14> support additional conformance groups, where s
conformance group means it MUST support all instructions in that conformanc upporting a
e conformance group means it <bcp14>MUST</bcp14> support all instructions in
that conformance
group. group.
</t> </t>
<t> <t>
The use of named conformance groups enables interoperability between a runt ime The use of named conformance groups enables interoperability between a runt ime
that executes instructions, and tools such as compilers that generate that executes instructions, and tools such as compilers that generate
instructions for the runtime. Thus, capability discovery in terms of instructions for the runtime. Thus, capability discovery in terms of
conformance groups might be done manually by users or automatically by tool s. conformance groups might be done manually by users or automatically by tool s.
</t> </t>
<t> <t>
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, each corresponds to a set of instructions that are mandatory. That is, each
instruction has one or more conformance groups of which it is a member. instruction has one or more conformance groups of which it is a member.
</t> </t>
<t> <t>
This document defines the following conformance groups: This document defines the following conformance groups:
</t> </t>
<ul> <dl>
<li> <dt>base32:</dt><dd> includes all instructions defined in this
base32: includes all instructions defined in this specification unless otherwise noted.</dd>
specification unless otherwise noted. <dt>
</li> base64:</dt><dd> includes base32, plus instructions explicitly noted
<li> as being in the base64 conformance group.</dd>
base64: includes base32, plus instructions explicitly noted
as being in the base64 conformance group. <dt>
</li> atomic32:</dt><dd> includes 32-bit atomic operation instructions (see <xre
<li> f target="atomic-operations"/>).</dd>
atomic32: includes 32-bit atomic operation instructions (see <xref target=
"atomic-operations">Atomic operations</xref>). <dt>
</li> atomic64:</dt><dd> includes atomic32, plus 64-bit atomic operation instruc
<li> tions.
atomic64: includes atomic32, plus 64-bit atomic operation instructions. </dd>
</li> <dt>
<li> divmul32:</dt><dd> includes 32-bit division, multiplication, and modulo in
divmul32: includes 32-bit division, multiplication, and modulo instruction structions.
s. </dd>
</li> <dt>
<li> divmul64:</dt><dd> includes divmul32, plus 64-bit division, multiplication
divmul64: includes divmul32, plus 64-bit division, multiplication, ,
and modulo instructions. and modulo instructions.
</li> </dd>
<li> <dt>
packet: deprecated packet access instructions. packet:</dt> <dd>deprecated packet access instructions.
</li> </dd>
</ul> </dl>
</section> </section>
</section> </section>
<section anchor="instruction-encoding" title="Instruction encoding"> <section anchor="instruction-encoding">
<t> <name>Instruction Encoding</name>
<t>
BPF has two instruction encodings: BPF has two instruction encodings:
</t> </t>
<ul> <ul>
<li> <li>
the basic instruction encoding, which uses 64 bits to encode an instruction the basic instruction encoding, which uses 64 bits to encode an instruction
</li> </li>
<li> <li>
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.
</li> </li>
</ul> </ul>
<section anchor="basic-instruction-encoding" title="Basic instruction encodin <section anchor="basic-instruction-encoding">
g"> <name>Basic Instruction Encoding</name>
<t> <t>
A basic instruction is encoded as follows: A basic instruction is encoded as follows:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| opcode | regs | offset | | opcode | regs | offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| imm | | imm |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---opcode--"> <dt anchor="term---opcode--">
<strong>opcode</strong> <strong>opcode:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
operation to perform, encoded as follows: operation to perform, encoded as follows:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|specific |class| |specific |class|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---specific--"> <dt anchor="term---specific--">
<strong>specific</strong> <strong>specific:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The format of these bits varies by instruction class The format of these bits varies by instruction class
</t> </t>
</dd> </dd>
<dt anchor="term---class--"> <dt anchor="term---class--">
<strong>class</strong> <strong>class:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The instruction class (see <xref target="instruction-classes">Instructi the instruction class (see <xref target="instruction-classes"/>)
on classes</xref>) </t>
</t> </dd>
</dd> </dl>
</dl> </dd>
</dd> <dt anchor="term---regs--">
<dt anchor="term---regs--"> <strong>regs:</strong>
<strong>regs</strong> </dt>
</dt> <dd>
<dd> <t>
<t> the source and destination register numbers, encoded as follows
The source and destination register numbers, encoded as follows
on a little-endian host: on a little-endian host:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|src_reg|dst_reg| |src_reg|dst_reg|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<t> <t>
and as follows on a big-endian host: and as follows on a big-endian host:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|dst_reg|src_reg| |dst_reg|src_reg|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---src_reg--"> <dt anchor="term---src_reg--">
<strong>src_reg</strong> <strong>src_reg:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
the source register number (0-10), except where otherwise specified the source register number (0-10), except where otherwise specified
(<xref target="-4-bit-immediate-instructions">64-bit immediate instruct (64-bit immediate instructions (see <xref target="_4-bit-immediate-inst
ions</xref> reuse this field for other purposes) ructions"/>) reuse this field for other purposes)
</t> </t>
</dd> </dd>
<dt anchor="term---dst_reg--"> <dt anchor="term---dst_reg--">
<strong>dst_reg</strong> <strong>dst_reg:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
destination register number (0-10), unless otherwise specified the destination register number (0-10), unless otherwise specified
(future instructions might reuse this field for other purposes) (future instructions might reuse this field for other purposes)
</t> </t>
</dd> </dd>
</dl> </dl>
</dd> </dd>
<dt anchor="term---offset--"> <dt anchor="term---offset--">
<strong>offset</strong> <strong>offset:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
signed integer offset used with pointer arithmetic, except where signed integer offset used with pointer arithmetic, except where
otherwise specified (some arithmetic instructions reuse this field otherwise specified (some arithmetic instructions reuse this field
for other purposes) for other purposes)
</t> </t>
</dd> </dd>
<dt anchor="term---imm--"> <dt anchor="term---imm--">
<strong>imm</strong> <strong>imm:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
signed integer immediate value signed integer immediate value
</t> </t>
</dd> </dd>
</dl> </dl>
<t> <t>
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 stored using big-endian byte ordering on big-endian hosts and
little-endian byte ordering on little-endian hosts. little-endian byte ordering on little-endian hosts.
</t> </t>
<t> <t>
For example: For example:
</t> </t>
<artwork> <artwork><![CDATA[
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
</artwork> ]]></artwork>
<t> <t>
Note that most instructions do not use all of the fields. Note that most instructions do not use all of the fields.
Unused fields SHALL be cleared to zero. Unused fields <bcp14>SHALL</bcp14> be cleared to zero.
</t> </t>
</section> </section>
<section anchor="wide-instruction-encoding" title="Wide instruction encoding" <section anchor="wide-instruction-encoding">
> <name>Wide Instruction Encoding</name>
<t> <t>
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 which uses two 32-bit immediate values. The 64 bits following
the basic instruction format contain a pseudo instruction the basic instruction format contain a pseudo instruction
with 'opcode', 'dst_reg', 'src_reg', and 'offset' all set to zero. with 'opcode', 'dst_reg', 'src_reg', and 'offset' all set to zero.
</t> </t>
<t> <t>
This is depicted in the following figure: This is depicted in the following figure:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| opcode | regs | offset | | opcode | regs | offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| imm | | imm |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| reserved | | reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| next_imm | | next_imm |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---opcode---"> <dt anchor="term---opcode---">
<strong>opcode</strong> <strong>opcode:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
operation to perform, encoded as explained above operation to perform, encoded as explained above
</t> </t>
</dd> </dd>
<dt anchor="term---regs---"> <dt anchor="term---regs---">
<strong>regs</strong> <strong>regs:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The source and destination register numbers (unless otherwise the source and destination register numbers (unless otherwise
specified), encoded as explained above specified), encoded as explained above
</t> </t>
</dd> </dd>
<dt anchor="term---offset---"> <dt anchor="term---offset---">
<strong>offset</strong> <strong>offset:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
signed integer offset used with pointer arithmetic, unless signed integer offset used with pointer arithmetic, unless
otherwise specified otherwise specified
</t> </t>
</dd> </dd>
<dt anchor="term---imm---"> <dt anchor="term---imm---">
<strong>imm</strong> <strong>imm:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
signed integer immediate value signed integer immediate value
</t> </t>
</dd> </dd>
<dt anchor="term---reserved--"> <dt anchor="term---reserved--">
<strong>reserved</strong> <strong>reserved:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
unused, set to zero unused, set to zero
</t> </t>
</dd> </dd>
<dt anchor="term---next_imm--"> <dt anchor="term---next_imm--">
<strong>next_imm</strong> <strong>next_imm:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
second signed integer immediate value second signed integer immediate value
</t> </t>
</dd> </dd>
</dl> </dl>
</section> </section>
<section anchor="instruction-classes" title="Instruction classes"> <section anchor="instruction-classes">
<t> <name>Instruction Classes</name>
The three least significant bits of the 'opcode' field store the instructio
n class:
</t>
<table>
<name>Instruction class</name>
<thead>
<tr>
<th>class</th>
<th>value</th>
<th>description</th>
<th>reference</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t> <t>
LD The three least significant bits of the 'opcode' field store the instructio n class:
</t> </t>
</td> <table>
<td> <name>Instruction Class</name>
<t> <thead>
<tr>
<th>class</th>
<th>Value</th>
<th>Description</th>
<th>Reference</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
LD
</t>
</td>
<td>
<t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
non-standard load operations non-standard load operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions< <xref target="load-and-store-instructions"/>
/xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
LDX LDX
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x1 0x1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
load into register operations load into register operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions< <xref target="load-and-store-instructions"/>
/xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
ST ST
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x2 0x2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
store from immediate operations store from immediate operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions< <xref target="load-and-store-instructions"/>
/xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
STX STX
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x3 0x3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
store from register operations store from register operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions< <xref target="load-and-store-instructions"/>
/xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
ALU ALU
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x4 0x4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
32-bit arithmetic operations 32-bit arithmetic operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-and-jump-instructions">Arithmetic and jump ins <xref target="arithmetic-and-jump-instructions"/>
tructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
JMP JMP
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x5 0x5
</t> </t>
</td> </td>
<td> <td>
<t> <t>
64-bit jump operations 64-bit jump operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-and-jump-instructions">Arithmetic and jump ins <xref target="arithmetic-and-jump-instructions"/>
tructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
JMP32 JMP32
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x6 0x6
</t> </t>
</td> </td>
<td> <td>
<t> <t>
32-bit jump operations 32-bit jump operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-and-jump-instructions">Arithmetic and jump ins <xref target="arithmetic-and-jump-instructions"/>
tructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
ALU64 ALU64
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x7 0x7
</t> </t>
</td> </td>
<td> <td>
<t> <t>
64-bit arithmetic operations 64-bit arithmetic operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-and-jump-instructions">Arithmetic and jump ins <xref target="arithmetic-and-jump-instructions"/>
tructions</xref> </t>
</t> </td>
</td> </tr>
</tr> </tbody>
</tbody> </table>
</table> </section>
</section> </section>
</section> <section anchor="arithmetic-and-jump-instructions">
<section anchor="arithmetic-and-jump-instructions" title="Arithmetic and jump <name>Arithmetic and Jump Instructions</name>
instructions"> <t>
<t> For arithmetic and jump instructions (<tt>ALU</tt>, <tt>ALU64</tt>, <tt>JMP<
For arithmetic and jump instructions (<tt>ALU</tt>, <tt>ALU64</tt>, <tt>JMP< /tt>, and
/tt> and
<tt>JMP32</tt>), the 8-bit 'opcode' field is divided into three parts: <tt>JMP32</tt>), the 8-bit 'opcode' field is divided into three parts:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| code |s|class| | code |s|class|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---code--"> <dt anchor="term---code--">
<strong>code</strong> <strong>code:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
the operation code, whose meaning varies by instruction class the operation code, whose meaning varies by instruction class
</t> </t>
</dd> </dd>
<dt anchor="term---s--source---"> <dt anchor="term---s--source---">
<strong>s (source)</strong> <strong>s (source):</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
the source operand location, which unless otherwise specified is one of: the source operand location, which unless otherwise specified is one of:
</t> </t>
<table> <table>
<name>Source operand location</name> <name>Source Operand Location</name>
<thead> <thead>
<tr> <tr>
<th>source</th> <th>source</th>
<th>value</th> <th>Value</th>
<th>description</th> <th>Description</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<t> <t>
K K
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
use 32-bit 'imm' value as source operand use 32-bit 'imm' value as source operand
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
X X
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
use 'src_reg' register value as source operand use 'src_reg' register value as source operand
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</dd> </dd>
<dt anchor="term---instruction-class--"> <dt anchor="term---instruction-class--">
<strong>instruction class</strong> <strong>class:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
the instruction class (see <xref target="instruction-classes">Instruction the instruction class (see <xref target="instruction-classes"/>)
classes</xref>) </t>
</t> </dd>
</dd> </dl>
</dl> <section anchor="arithmetic-instructions">
<section anchor="arithmetic-instructions" title="Arithmetic instructions"> <name>Arithmetic Instructions</name>
<t> <t>
<tt>ALU</tt> uses 32-bit wide operands while <tt>ALU64</tt> uses 64-bit wid e operands for <tt>ALU</tt> uses 32-bit wide operands while <tt>ALU64</tt> uses 64-bit wid e operands for
otherwise identical operations. <tt>ALU64</tt> instructions belong to the otherwise identical operations. <tt>ALU64</tt> instructions belong to the
base64 conformance group unless noted otherwise. base64 conformance group unless noted otherwise.
The 'code' field encodes the operation as below, where 'src' refers to the The 'code' field encodes the operation as below, where 'src' refers to the
the source operand and 'dst' refers to the value of the destination source operand and 'dst' refers to the value of the destination
register. register.
</t>
<table>
<name>Arithmetic instructions</name>
<thead>
<tr>
<th>name</th>
<th>code</th>
<th>offset</th>
<th>description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ADD
</t> </t>
</td> <table>
<td> <name>Arithmetic Instructions</name>
<t> <thead>
<tr>
<th>Name</th>
<th>code</th>
<th>offset</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ADD
</t>
</td>
<td>
<t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst += src dst += src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
SUB SUB
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x1 0x1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst -= src dst -= src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
MUL MUL
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x2 0x2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst *= src dst *= src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
DIV DIV
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x3 0x3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = (src != 0) ? (dst / src) : 0 dst = (src != 0) ? (dst / src) : 0
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
SDIV SDIV
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x3 0x3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = (src != 0) ? (dst s/ src) : 0 dst = (src != 0) ? (dst s/ src) : 0
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
OR OR
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x4 0x4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst |= src dst |= src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
AND AND
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x5 0x5
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst &amp;= src dst &amp;= src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
LSH LSH
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x6 0x6
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst &lt;&lt;= (src &amp; mask) dst &lt;&lt;= (src &amp; mask)
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
RSH RSH
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x7 0x7
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst &gt;&gt;= (src &amp; mask) dst &gt;&gt;= (src &amp; mask)
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
NEG NEG
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x8 0x8
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = -dst dst = -dst
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
MOD MOD
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x9 0x9
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = (src != 0) ? (dst % src) : dst dst = (src != 0) ? (dst % src) : dst
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
SMOD SMOD
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x9 0x9
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = (src != 0) ? (dst s% src) : dst dst = (src != 0) ? (dst s% src) : dst
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
XOR XOR
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xa 0xa
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst ^= src dst ^= src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
MOV MOV
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xb 0xb
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = src dst = src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
MOVSX MOVSX
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xb 0xb
</t> </t>
</td> </td>
<td> <td>
<t> <t>
8/16/32 8/16/32
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = (s8,s16,s32)src dst = (s8,s16,s32)src
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ARSH ARSH
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xc 0xc
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="term-sign-extend">sign extending</xref> dst &gt;&gt;= (sr sign extending (<xref target="term-sign-extend"/>) dst &gt;&gt;= (src &
c &amp; mask) amp; mask)
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
END END
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xd 0xd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t>
byte swap operations (see <xref target="byte-swap-instructions"/>)
</t>
</td>
</tr>
</tbody>
</table>
<t> <t>
byte swap operations (see <xref target="byte-swap-instructions">Byte sw
ap instructions</xref> below)
</t>
</td>
</tr>
</tbody>
</table>
<t>
Underflow and overflow are allowed during arithmetic operations, meaning Underflow and overflow are allowed during arithmetic operations, meaning
the 64-bit or 32-bit value will wrap. If BPF program execution would the 64-bit or 32-bit value will wrap. If BPF program execution would
result in division by zero, the destination register is instead set to zero . result in division by zero, the destination register is instead set to zero .
If execution would result in modulo by zero, for <tt>ALU64</tt> the value o f If execution would result in modulo by zero, for <tt>ALU64</tt> the value o f
the destination register is unchanged whereas for <tt>ALU</tt> the upper the destination register is unchanged whereas for <tt>ALU</tt> the upper
32 bits of the destination register are zeroed. 32 bits of the destination register are zeroed.
</t> </t>
<t> <t>
<tt>{ADD, X, ALU}</tt>, where 'code' = <tt>ADD</tt>, 'source' = <tt>X</tt>, and 'class' = <tt>ALU</tt>, means: <tt>{ADD, X, ALU}</tt>, where 'code' = <tt>ADD</tt>, 'source' = <tt>X</tt>, and 'class' = <tt>ALU</tt>, means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = (u32) ((u32) dst + (u32) src) dst = (u32) ((u32) dst + (u32) src)
</artwork> ]]></artwork>
<t> <t>
where '(u32)' indicates that the upper 32 bits are zeroed. where '(u32)' indicates that the upper 32 bits are zeroed.
</t> </t>
<t> <t>
<tt>{ADD, X, ALU64}</tt> means: <tt>{ADD, X, ALU64}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = dst + src dst = dst + src
</artwork> ]]></artwork>
<t> <t>
<tt>{XOR, K, ALU}</tt> means: <tt>{XOR, K, ALU}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = (u32) dst ^ (u32) imm dst = (u32) dst ^ (u32) imm
</artwork> ]]></artwork>
<t> <t>
<tt>{XOR, K, ALU64}</tt> means: <tt>{XOR, K, ALU64}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = dst ^ imm dst = dst ^ imm
</artwork> ]]></artwork>
<t> <t>
Note that most arithmetic instructions have 'offset' set to 0. Only three i nstructions Note that most arithmetic instructions have 'offset' set to 0. Only three i nstructions
(<tt>SDIV</tt>, <tt>SMOD</tt>, <tt>MOVSX</tt>) have a non-zero 'offset'. (<tt>SDIV</tt>, <tt>SMOD</tt>, <tt>MOVSX</tt>) have a non-zero 'offset'.
</t> </t>
<t> <t>
Division, multiplication, and modulo operations for <tt>ALU</tt> are part Division, multiplication, and modulo operations for <tt>ALU</tt> are part
of the "divmul32" conformance group, and division, multiplication, and of the "divmul32" conformance group, and division, multiplication, and
modulo operations for <tt>ALU64</tt> are part of the "divmul64" conformance modulo operations for <tt>ALU64</tt> are part of the "divmul64" conformance
group. group.
The division and modulo operations support both unsigned and signed flavors . The division and modulo operations support both unsigned and signed flavors .
</t> </t>
<t> <t>
For unsigned operations (<tt>DIV</tt> and <tt>MOD</tt>), for <tt>ALU</tt>, For unsigned operations (<tt>DIV</tt> and <tt>MOD</tt>), for <tt>ALU</tt>,
'imm' is interpreted as a 32-bit unsigned value. For <tt>ALU64</tt>, 'imm' is interpreted as a 32-bit unsigned value. For <tt>ALU64</tt>,
'imm' is first <xref target="term-sign-extend">sign extended</xref> from 32 to 64 bits, and then 'imm' is first sign extended (<xref target="term-sign-extend"/>) from 32 to 64 bits, and then
interpreted as a 64-bit unsigned value. interpreted as a 64-bit unsigned value.
</t> </t>
<t> <t>
For signed operations (<tt>SDIV</tt> and <tt>SMOD</tt>), for <tt>ALU</tt>, For signed operations (<tt>SDIV</tt> and <tt>SMOD</tt>), for <tt>ALU</tt>,
'imm' is interpreted as a 32-bit signed value. For <tt>ALU64</tt>, 'imm' 'imm' is interpreted as a 32-bit signed value. For <tt>ALU64</tt>, 'imm'
is first <xref target="term-sign-extend">sign extended</xref> from 32 to 64 bits, and then is first sign extended (<xref target="term-sign-extend"/>) from 32 to 64 bi ts, and then
interpreted as a 64-bit signed value. interpreted as a 64-bit signed value.
</t> </t>
<t> <t>
Note that there are varying definitions of the signed modulo operation Note that there are varying definitions of the signed modulo operation
when the dividend or divisor are negative, where implementations often when the dividend or divisor are negative, where implementations often
vary by language such that Python, Ruby, etc. differ from C, Go, Java, vary by language such that Python, Ruby, etc. differ from C, Go, Java,
etc. This specification requires that signed modulo MUST use truncated divi sion etc. This specification requires that signed modulo <bcp14>MUST</bcp14> use truncated division
(where -13 % 3 == -1) as implemented in C, Go, etc.: (where -13 % 3 == -1) as implemented in C, Go, etc.:
</t> </t>
<artwork> <artwork><![CDATA[
a % n = a - n * trunc(a / n) a % n = a - n * trunc(a / n)
</artwork> ]]></artwork>
<t> <t>
The <tt>MOVSX</tt> instruction does a move operation with sign extension. The <tt>MOVSX</tt> instruction does a move operation with sign extension.
<tt>{MOVSX, X, ALU}</tt> <xref target="term-sign-extend">sign extends</xref > 8-bit and 16-bit operands into <tt>{MOVSX, X, ALU}</tt> sign extends (<xref target="term-sign-extend"/>) 8 -bit and 16-bit operands into
32-bit operands, and zeroes the remaining upper 32 bits. 32-bit operands, and zeroes the remaining upper 32 bits.
<tt>{MOVSX, X, ALU64}</tt> <xref target="term-sign-extend">sign extends</xr ef> 8-bit, 16-bit, and 32-bit <tt>{MOVSX, X, ALU64}</tt> sign extends (<xref target="term-sign-extend"/>) 8-bit, 16-bit, and 32-bit
operands into 64-bit operands. Unlike other arithmetic instructions, operands into 64-bit operands. Unlike other arithmetic instructions,
<tt>MOVSX</tt> is only defined for register source operands (<tt>X</tt>). <tt>MOVSX</tt> is only defined for register source operands (<tt>X</tt>).
</t> </t>
<t> <t>
<tt>{MOV, K, ALU64}</tt> means: <tt>{MOV, K, ALU64}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = (s64)imm dst = (s64)imm
</artwork> ]]></artwork>
<t> <t>
<tt>{MOV, X, ALU}</tt> means: <tt>{MOV, X, ALU}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = (u32)src dst = (u32)src
</artwork> ]]></artwork>
<t> <t>
<tt>{MOVSX, X, ALU}</tt> with 'offset' 8 means: <tt>{MOVSX, X, ALU}</tt> with 'offset' 8 means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = (u32)(s32)(s8)src dst = (u32)(s32)(s8)src
]]></artwork>
</artwork> <t>
<t>
The <tt>NEG</tt> instruction is only defined when the source bit is clear The <tt>NEG</tt> instruction is only defined when the source bit is clear
(<tt>K</tt>). (<tt>K</tt>).
</t> </t>
<t> <t>
Shift operations use a mask of 0x3F (63) for 64-bit operations and 0x1F (31 ) Shift operations use a mask of 0x3F (63) for 64-bit operations and 0x1F (31 )
for 32-bit operations. for 32-bit operations.
</t> </t>
</section> </section>
<section anchor="byte-swap-instructions" title="Byte swap instructions"> <section anchor="byte-swap-instructions">
<t> <name>Byte Swap Instructions</name>
<t>
The byte swap instructions use instruction classes of <tt>ALU</tt> and <tt> ALU64</tt> The byte swap instructions use instruction classes of <tt>ALU</tt> and <tt> ALU64</tt>
and a 4-bit 'code' field of <tt>END</tt>. and a 4-bit 'code' field of <tt>END</tt>.
</t> </t>
<t> <t>
The byte swap instructions operate on the destination register The byte swap instructions operate on the destination register
only and do not use a separate source register or immediate value. only and do not use a separate source register or immediate value.
</t> </t>
<t> <t>
For <tt>ALU</tt>, the 1-bit source operand field in the opcode is used to For <tt>ALU</tt>, the 1-bit source operand field in the opcode is used to
select what byte order the operation converts from or to. For select what byte order the operation converts from or to. For
<tt>ALU64</tt>, the 1-bit source operand field in the opcode is reserved <tt>ALU64</tt>, the 1-bit source operand field in the opcode is reserved
and MUST be set to 0. and <bcp14>MUST</bcp14> be set to 0.
</t>
<table>
<name>Byte swap instructions</name>
<thead>
<tr>
<th>class</th>
<th>source</th>
<th>value</th>
<th>description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ALU
</t> </t>
</td> <table>
<td> <name>Byte Swap Instructions</name>
<t> <thead>
<tr>
<th>class</th>
<th>source</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ALU
</t>
</td>
<td>
<t>
LE LE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
convert between host byte order and little endian convert between host byte order and little endian
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ALU ALU
</t> </t>
</td> </td>
<td> <td>
<t> <t>
BE BE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
convert between host byte order and big endian convert between host byte order and big endian
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ALU64 ALU64
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Reserved Reserved
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
do byte swap unconditionally do byte swap unconditionally
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
The 'imm' field encodes the width of the swap operations. The following wi dths The 'imm' field encodes the width of the swap operations. The following wi dths
are supported: 16, 32 and 64. Width 64 operations belong to the base64 are supported: 16, 32, and 64. Width 64 operations belong to the base64
conformance group and other swap operations belong to the base32 conformance group and other swap operations belong to the base32
conformance group. conformance group.
</t>
<t>
Examples:
</t>
<t>
<tt>{END, LE, ALU}</tt> with 'imm' = 16/32/64 means:
</t>
<artwork>
dst = le16(dst)
dst = le32(dst)
dst = le64(dst)
</artwork>
<t>
<tt>{END, BE, ALU}</tt> with 'imm' = 16/32/64 means:
</t>
<artwork>
dst = be16(dst)
dst = be32(dst)
dst = be64(dst)
</artwork>
<t>
<tt>{END, TO, ALU64}</tt> with 'imm' = 16/32/64 means:
</t>
<artwork>
dst = bswap16(dst)
dst = bswap32(dst)
dst = bswap64(dst)
</artwork>
</section>
<section anchor="jump-instructions" title="Jump instructions">
<t>
<tt>JMP32</tt> uses 32-bit wide operands and indicates the base32
conformance group, while <tt>JMP</tt> uses 64-bit wide operands for
otherwise identical operations, and indicates the base64 conformance
group unless otherwise specified.
The 'code' field encodes the operation as below:
</t>
<table>
<name>Jump instructions</name>
<thead>
<tr>
<th>code</th>
<th>value</th>
<th>src_reg</th>
<th>description</th>
<th>notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
JA
</t> </t>
</td>
<td>
<t> <t>
0x0 Examples:
</t> </t>
</td>
<td>
<t> <t>
0x0 <tt>{END, LE, ALU}</tt> with 'imm' = 16/32/64 means:
</t> </t>
</td> <artwork><![CDATA[
<td> dst = le16(dst)
dst = le32(dst)
dst = le64(dst)]]></artwork>
<t> <t>
PC += offset <tt>{END, BE, ALU}</tt> with 'imm' = 16/32/64 means:
</t> </t>
</td> <artwork><![CDATA[
<td> dst = be16(dst)
dst = be32(dst)
dst = be64(dst)]]></artwork>
<t> <t>
{JA, K, JMP} only <tt>{END, TO, ALU64}</tt> with 'imm' = 16/32/64 means:
</t> </t>
</td> <artwork><![CDATA[
</tr> dst = bswap16(dst)
<tr> dst = bswap32(dst)
<td> dst = bswap64(dst)]]></artwork>
</section>
<section anchor="jump-instructions">
<name>Jump Instructions</name>
<t> <t>
JA <tt>JMP32</tt> uses 32-bit wide operands and indicates the base32 conformance
group; <tt>JMP</tt> uses 64-bit wide operands for otherwise identical
operations and indicates the base64 conformance group unless
otherwise specified.
The 'code' field encodes the operation as below:
</t> </t>
</td> <table>
<td> <name>Jump Instructions</name>
<t> <thead>
<tr>
<th>code</th>
<th>Value</th>
<th>src_reg</th>
<th>Description</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
JA
</t>
</td>
<td>
<t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset
</t>
</td>
<td>
<t>
{JA, K, JMP} only
</t>
</td>
</tr>
<tr>
<td>
<t>
JA
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
PC += imm PC += imm
</t> </t>
</td> </td>
<td> <td>
<t> <t>
{JA, K, JMP32} only {JA, K, JMP32} only
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JEQ JEQ
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x1 0x1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst == src PC += offset if dst == src
</t> </t>
</td> </td>
<td> <td>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JGT JGT
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x2 0x2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &gt; src PC += offset if dst &gt; src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
unsigned unsigned
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JGE JGE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x3 0x3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &gt;= src PC += offset if dst &gt;= src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
unsigned unsigned
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JSET JSET
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x4 0x4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &amp; src PC += offset if dst &amp; src
</t> </t>
</td> </td>
<td> <td>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JNE JNE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x5 0x5
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst != src PC += offset if dst != src
</t> </t>
</td> </td>
<td> <td>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JSGT JSGT
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x6 0x6
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &gt; src PC += offset if dst &gt; src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
signed signed
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JSGE JSGE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x7 0x7
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &gt;= src PC += offset if dst &gt;= src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
signed signed
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
CALL CALL
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x8 0x8
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
call helper function by static ID call helper function by static ID
</t> </t>
</td> </td>
<td> <td>
<t> <t>
{CALL, K, JMP} only, see <xref target="helper-functions">Helper functio {CALL, K, JMP} only, see <xref target="helper-functions"/>
ns</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
CALL CALL
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x8 0x8
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x1 0x1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
call PC += imm call PC += imm
</t> </t>
</td> </td>
<td> <td>
<t> <t>
{CALL, K, JMP} only, see <xref target="program-local-functions">Program {CALL, K, JMP} only, see <xref target="program-local-functions"/>
-local functions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
CALL CALL
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x8 0x8
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x2 0x2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
call helper function by BTF ID call helper function by BTF ID
</t> </t>
</td> </td>
<td> <td>
<t> <t>
{CALL, K, JMP} only, see <xref target="helper-functions">Helper functio {CALL, K, JMP} only, see <xref target="helper-functions"/>
ns</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
EXIT EXIT
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x9 0x9
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x0 0x0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
return return
</t> </t>
</td> </td>
<td> <td>
<t> <t>
{CALL, K, JMP} only {CALL, K, JMP} only
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JLT JLT
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xa 0xa
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &lt; src PC += offset if dst &lt; src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
unsigned unsigned
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JLE JLE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xb 0xb
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &lt;= src PC += offset if dst &lt;= src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
unsigned unsigned
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JSLT JSLT
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xc 0xc
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &lt; src PC += offset if dst &lt; src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
signed signed
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
JSLE JSLE
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xd 0xd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
any any
</t> </t>
</td> </td>
<td> <td>
<t> <t>
PC += offset if dst &lt;= src PC += offset if dst &lt;= src
</t> </t>
</td> </td>
<td> <td>
<t> <t>
signed signed
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
where 'PC' denotes the program counter, and the offset to increment by where 'PC' denotes the program counter, and the offset to increment by
is in units of 64-bit instructions relative to the instruction following is in units of 64-bit instructions relative to the instruction following
the jump instruction. Thus 'PC += 1' skips execution of the next the jump instruction. Thus 'PC += 1' skips execution of the next
instruction if it's a basic instruction or results in undefined behavior instruction if it's a basic instruction or results in undefined behavior
if the next instruction is a 128-bit wide instruction. if the next instruction is a 128-bit wide instruction.
</t> </t>
<t> <t>
Example: Example:
</t> </t>
<t> <t>
<tt>{JSGE, X, JMP32}</tt> means: <tt>{JSGE, X, JMP32}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
if (s32)dst s&gt;= (s32)src goto +offset if (s32)dst s>= (s32)src goto +offset]]></artwork>
</artwork> <t>
<t>
where 's&gt;=' indicates a signed '&gt;=' comparison. where 's&gt;=' indicates a signed '&gt;=' comparison.
</t> </t>
<t> <t>
<tt>{JLE, K, JMP}</tt> means: <tt>{JLE, K, JMP}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
if dst &lt;= (u64)(s64)imm goto +offset if dst <= (u64)(s64)imm goto +offset]]></artwork>
</artwork> <t>
<t>
<tt>{JA, K, JMP32}</tt> means: <tt>{JA, K, JMP32}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
gotol +imm gotol +imm]]></artwork>
</artwork> <t>
<t>
where 'imm' means the branch offset comes from the 'imm' field. where 'imm' means the branch offset comes from the 'imm' field.
</t> </t>
<t> <t>
Note that there are two flavors of <tt>JA</tt> instructions. The Note that there are two flavors of <tt>JA</tt> instructions. The
<tt>JMP</tt> class permits a 16-bit jump offset specified by the 'offset' <tt>JMP</tt> class permits a 16-bit jump offset specified by the 'offset'
field, whereas the <tt>JMP32</tt> class permits a 32-bit jump offset field, whereas the <tt>JMP32</tt> class permits a 32-bit jump offset
specified by the 'imm' field. A &gt; 16-bit conditional jump may be specified by the 'imm' field. A conditional jump greater than 16 bits may b
converted to a &lt; 16-bit conditional jump plus a 32-bit unconditional e
converted to a conditional jump less than 16 bits plus a 32-bit uncondition
al
jump. jump.
</t> </t>
<t> <t>
All <tt>CALL</tt> and <tt>JA</tt> instructions belong to the All <tt>CALL</tt> and <tt>JA</tt> instructions belong to the
base32 conformance group. base32 conformance group.
</t> </t>
<section anchor="helper-functions" title="Helper functions"> <section anchor="helper-functions">
<t> <name>Helper Functions</name>
<t>
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.
</t> </t>
<t> <t>
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 functions encoded in the 'imm' field. Further documentation of helper functions
is outside the scope of this document and standardization is left for is outside the scope of this document and standardization is left for
future work, but use is widely deployed and more information can be future work, but use is widely deployed and more information can be
found in platform-specific documentation (e.g., Linux kernel documentation ). found in platform-specific documentation (e.g., Linux kernel documentation ).
</t> </t>
<t> <t>
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 BTF ID 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 identifies the helper name and type. Further documentation of BTF
is outside the scope of this document and standardization is left for is outside the scope of this document and standardization is left for
future work, but use is widely deployed and more information can be future work, but use is widely deployed and more information can be
found in platform-specific documentation (e.g., Linux kernel documentation ). found in platform-specific documentation (e.g., Linux kernel documentation ).
</t> </t>
</section> </section>
<section anchor="program-local-functions" title="Program-local functions"> <section anchor="program-local-functions">
<t> <name>Program-Local Functions</name>
<t>
Program-local functions are functions exposed by the same BPF program as t he Program-local functions are functions exposed by the same BPF program as t he
caller, and are referenced by offset from the instruction following the ca ll caller, and are referenced by offset from the instruction following the ca ll
instruction, similar to <tt>JA</tt>. The offset is encoded in the 'imm' f ield of instruction, similar to <tt>JA</tt>. The offset is encoded in the 'imm' f ield of
the call instruction. An <tt>EXIT</tt> within the program-local function w ill the call instruction. An <tt>EXIT</tt> within the program-local function w ill
return to the caller. return to the caller.
</t> </t>
</section>
</section>
</section> </section>
</section> <section anchor="load-and-store-instructions">
</section> <name>Load and Store Instructions</name>
<section anchor="load-and-store-instructions" title="Load and store instructio <t>
ns">
<t>
For load and store instructions (<tt>LD</tt>, <tt>LDX</tt>, <tt>ST</tt>, and <tt>STX</tt>), the For load and store instructions (<tt>LD</tt>, <tt>LDX</tt>, <tt>ST</tt>, and <tt>STX</tt>), the
8-bit 'opcode' field is divided as follows: 8-bit 'opcode' field is divided as follows:
</t> </t>
<artwork> <artwork><![CDATA[
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|mode |sz |class| |mode |sz |class|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
</artwork> ]]></artwork>
<dl> <dl>
<dt anchor="term---mode--"> <dt anchor="term---mode--">
<strong>mode</strong> <strong>mode:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The mode modifier is one of: The mode modifier is one of:
</t> </t>
<table> <table>
<name>Mode modifier</name> <name>Mode Modifier</name>
<thead> <thead>
<tr> <tr>
<th>mode modifier</th> <th>mode</th>
<th>value</th> <th>Value</th>
<th>description</th> <th>Description</th>
<th>reference</th> <th>Reference</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<t> <t>
IMM IMM
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
64-bit immediate instructions 64-bit immediate instructions
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="-4-bit-immediate-instructions">64-bit immediate instruct <xref target="_4-bit-immediate-instructions"/>
ions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
ABS ABS
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
legacy BPF packet access (absolute) legacy BPF packet access (absolute)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet <xref target="legacy-bpf-packet-access-instructions"/>
access instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
IND IND
</t> </t>
</td> </td>
<td> <td>
<t> <t>
2 2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
legacy BPF packet access (indirect) legacy BPF packet access (indirect)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet <xref target="legacy-bpf-packet-access-instructions"/>
access instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
MEM MEM
</t> </t>
</td> </td>
<td> <td>
<t> <t>
3 3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
regular load and store operations regular load and store operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="regular-load-and-store-operations">Regular load and stor <xref target="regular-load-and-store-operations"/>
e operations</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
MEMSX MEMSX
</t> </t>
</td> </td>
<td> <td>
<t> <t>
4 4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
sign-extension load operations sign-extension load operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="sign-extension-load-operations">Sign-extension load oper <xref target="sign-extension-load-operations"/>
ations</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t>
<t>
ATOMIC ATOMIC
</t> </t>
</td> </td>
<td> <td>
<t> <t>
6 6
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic operations atomic operations
</t> </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="atomic-operations">Atomic operations</xref> <xref target="atomic-operations"/>
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</dd> </dd>
<dt anchor="term---sz--size---"> <dt anchor="term---sz--size---">
<strong>sz (size)</strong> <strong>sz (size):</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The size modifier is one of: The size modifier is one of:
</t> </t>
<table> <table>
<name>Size modifier</name> <name>Size Modifier</name>
<thead> <thead>
<tr> <tr>
<th>size</th> <th>size</th>
<th>value</th> <th>Value</th>
<th>description</th> <th>Description</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<t> <t>
W W
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0 0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
word (4 bytes) word (4 bytes)
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
H H
</t> </t>
</td> </td>
<td> <td>
<t> <t>
1 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
half word (2 bytes) half word (2 bytes)
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
B B
</t> </t>
</td> </td>
<td> <td>
<t> <t>
2 2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
byte byte
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
DW DW
</t> </t>
</td> </td>
<td> <td>
<t> <t>
3 3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
double word (8 bytes) double word (8 bytes)
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
Instructions using <tt>DW</tt> belong to the base64 conformance group. Instructions using <tt>DW</tt> belong to the base64 conformance group.
</t> </t>
</dd> </dd>
<dt anchor="term---class---"> <dt anchor="term---class---">
<strong>class</strong> <strong>class:</strong>
</dt> </dt>
<dd> <dd>
<t> <t>
The instruction class (see <xref target="instruction-classes">Instruction The instruction class (see <xref target="instruction-classes"/>)
classes</xref>) </t>
</t> </dd>
</dd> </dl>
</dl> <section anchor="regular-load-and-store-operations">
<section anchor="regular-load-and-store-operations" title="Regular load and s <name>Regular Load and Store Operations</name>
tore operations"> <t>
<t>
The <tt>MEM</tt> mode modifier is used to encode regular load and store The <tt>MEM</tt> 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.
</t> </t>
<t> <t>
<tt>{MEM, &lt;size&gt;, STX}</tt> means: <tt>{MEM, &lt;size&gt;, STX}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
*(size *) (dst + offset) = src *(size *) (dst + offset) = src]]></artwork>
</artwork> <t>
<t>
<tt>{MEM, &lt;size&gt;, ST}</tt> means: <tt>{MEM, &lt;size&gt;, ST}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
*(size *) (dst + offset) = imm *(size *) (dst + offset) = imm]]></artwork>
</artwork> <t>
<t>
<tt>{MEM, &lt;size&gt;, LDX}</tt> means: <tt>{MEM, &lt;size&gt;, LDX}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = *(unsigned size *) (src + offset) dst = *(unsigned size *) (src + offset)]]></artwork>
</artwork> <t>
<t>
Where '&lt;size&gt;' is one of: <tt>B</tt>, <tt>H</tt>, <tt>W</tt>, or <tt> DW</tt>, and Where '&lt;size&gt;' is one of: <tt>B</tt>, <tt>H</tt>, <tt>W</tt>, or <tt> DW</tt>, and
'unsigned size' is one of: u8, u16, u32, or u64. 'unsigned size' is one of: u8, u16, u32, or u64.
</t> </t>
</section> </section>
<section anchor="sign-extension-load-operations" title="Sign-extension load o <section anchor="sign-extension-load-operations">
perations"> <name>Sign-Extension Load Operations</name>
<t> <t>
The <tt>MEMSX</tt> mode modifier is used to encode <xref target="term-sign- The <tt>MEMSX</tt> mode modifier is used to encode sign-extension load inst
extend">sign-extension</xref> load ructions (<xref target="term-sign-extend"/>)
instructions that transfer data between a register and memory. that transfer data between a register and memory.
</t> </t>
<t> <t>
<tt>{MEMSX, &lt;size&gt;, LDX}</tt> means: <tt>{MEMSX, &lt;size&gt;, LDX}</tt> means:
</t> </t>
<artwork> <artwork><![CDATA[
dst = *(signed size *) (src + offset) dst = *(signed size *) (src + offset)]]></artwork>
</artwork> <t>
<t>
Where '&lt;size&gt;' is one of: <tt>B</tt>, <tt>H</tt>, or <tt>W</tt>, and Where '&lt;size&gt;' is one of: <tt>B</tt>, <tt>H</tt>, or <tt>W</tt>, and
'signed size' is one of: s8, s16, or s32. 'signed size' is one of: s8, s16, or s32.
</t> </t>
</section> </section>
<section anchor="atomic-operations" title="Atomic operations"> <section anchor="atomic-operations">
<t> <name>Atomic Operations</name>
Atomic operations are operations that operate on memory and can not be <t>
Atomic operations operate on memory and cannot be
interrupted or corrupted by other access to the same memory region interrupted or corrupted by other access to the same memory region
by other BPF programs or means outside of this specification. by other BPF programs or means outside of this specification.
</t> </t>
<t> <t>
All atomic operations supported by BPF are encoded as store operations All atomic operations supported by BPF are encoded as store operations
that use the <tt>ATOMIC</tt> mode modifier as follows: that use the <tt>ATOMIC</tt> mode modifier as follows:
</t> </t>
<ul> <ul>
<li> <li>
<tt>{ATOMIC, W, STX}</tt> for 32-bit operations, which are <tt>{ATOMIC, W, STX}</tt> for 32-bit operations, which are
part of the "atomic32" conformance group. part of the "atomic32" conformance group.
</li> </li>
<li> <li>
<tt>{ATOMIC, DW, STX}</tt> for 64-bit operations, which are <tt>{ATOMIC, DW, STX}</tt> for 64-bit operations, which are
part of the "atomic64" conformance group. part of the "atomic64" conformance group.
</li> </li>
<li> <li>
8-bit and 16-bit wide atomic operations are not supported. 8-bit and 16-bit wide atomic operations are not supported.
</li> </li>
</ul> </ul>
<t> <t>
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 operation: arithmetic operations in the 'imm' field to encode the atomic operation:
</t>
<table>
<name>Simple atomic operations</name>
<thead>
<tr>
<th>imm</th>
<th>value</th>
<th>description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ADD
</t> </t>
</td> <table>
<td> <name>Simple Atomic Operations</name>
<t> <thead>
<tr>
<th>imm</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
ADD
</t>
</td>
<td>
<t>
0x00 0x00
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic add atomic add
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
OR OR
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x40 0x40
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic or atomic or
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
AND AND
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0x50 0x50
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic and atomic and
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
XOR XOR
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xa0 0xa0
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic xor atomic xor
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t>
<tt>{ATOMIC, W, STX}</tt> with 'imm' = ADD means:
</t>
<artwork>
*(u32 *)(dst + offset) += src
</artwork>
<t>
<tt>{ATOMIC, DW, STX}</tt> with 'imm' = ADD means:
</t>
<artwork>
*(u64 *)(dst + offset) += src
</artwork>
<t>
In addition to the simple atomic operations, there also is a modifier and
two complex atomic operations:
</t>
<table>
<name>Complex atomic operations</name>
<thead>
<tr>
<th>imm</th>
<th>value</th>
<th>description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t> <t>
FETCH <tt>{ATOMIC, W, STX}</tt> with 'imm' = ADD means:
</t> </t>
</td> <artwork><![CDATA[
<td> *(u32 *)(dst + offset) += src]]></artwork>
<t> <t>
0x01 <tt>{ATOMIC, DW, STX}</tt> with 'imm' = ADD means:
</t> </t>
</td> <artwork><![CDATA[
<td> *(u64 *)(dst + offset) += src]]></artwork>
<t> <t>
modifier: return old value In addition to the simple atomic operations, there is also a modifier and
two complex atomic operations:
</t> </t>
</td>
</tr> <table>
<tr> <name>Complex Atomic Operations and a Modifier</name>
<td> <thead>
<t> <tr>
<th>imm</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
FETCH
</t>
</td>
<td>
<t>
0x01
</t>
</td>
<td>
<t>
modifier: return old value
</t>
</td>
</tr>
<tr>
<td>
<t>
XCHG XCHG
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xe0 | FETCH 0xe0 | FETCH
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic exchange atomic exchange
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
CMPXCHG CMPXCHG
</t> </t>
</td> </td>
<td> <td>
<t> <t>
0xf0 | FETCH 0xf0 | FETCH
</t> </t>
</td> </td>
<td> <td>
<t> <t>
atomic compare and exchange atomic compare and exchange
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
The <tt>FETCH</tt> modifier is optional for simple atomic operations, and The <tt>FETCH</tt> modifier is optional for simple atomic operations and
always set for the complex atomic operations. If the <tt>FETCH</tt> flag is always set for the complex atomic operations. If the <tt>FETCH</tt> fla
g
is set, then the operation also overwrites <tt>src</tt> with the value that is set, then the operation also overwrites <tt>src</tt> with the value that
was in memory before it was modified. was in memory before it was modified.
</t> </t>
<t> <t>
The <tt>XCHG</tt> operation atomically exchanges <tt>src</tt> with the valu e The <tt>XCHG</tt> operation atomically exchanges <tt>src</tt> with the valu e
addressed by <tt>dst + offset</tt>. addressed by <tt>dst + offset</tt>.
</t> </t>
<t> <t>
The <tt>CMPXCHG</tt> operation atomically compares the value addressed by The <tt>CMPXCHG</tt> operation atomically compares the value addressed by
<tt>dst + offset</tt> with <tt>R0</tt>. If they match, the value addressed by <tt>dst + offset</tt> with <tt>R0</tt>. If they match, the value addressed by
<tt>dst + offset</tt> is replaced with <tt>src</tt>. In either case, the <tt>dst + offset</tt> is replaced with <tt>src</tt>. In either case, the
value that was at <tt>dst + offset</tt> before the operation is zero-extend ed value that was at <tt>dst + offset</tt> before the operation is zero-extend ed
and loaded back to <tt>R0</tt>. and loaded back to <tt>R0</tt>.
</t> </t>
</section> </section>
<section anchor="-4-bit-immediate-instructions" title="64-bit immediate instr <section anchor="_4-bit-immediate-instructions">
uctions"> <name>64-bit Immediate Instructions</name>
<t> <t>
Instructions with the <tt>IMM</tt> 'mode' modifier use the wide instruction Instructions with the <tt>IMM</tt> 'mode' modifier use the wide instruction
encoding defined in <xref target="instruction-encoding">Instruction encodin g</xref>, and use the 'src_reg' field of the encoding defined in <xref target="instruction-encoding"/>, and use the 'src _reg' field of the
basic instruction to hold an opcode subtype. basic instruction to hold an opcode subtype.
</t> </t>
<t> <t>
The following table defines a set of <tt>{IMM, DW, LD}</tt> instructions The following table defines a set of <tt>{IMM, DW, LD}</tt> instructions
with opcode subtypes in the 'src_reg' field, using new terms such as "map" with opcode subtypes in the 'src_reg' field, using new terms such as "map"
defined further below: defined further below:
</t>
<table>
<name>64-bit immediate instructions</name>
<thead>
<tr>
<th>src_reg</th>
<th>pseudocode</th>
<th>imm type</th>
<th>dst type</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
0x0
</t> </t>
</td> <table>
<td> <name>64-bit Immediate Instructions</name>
<t> <thead>
<tr>
<th>src_reg</th>
<th>Pseudocode</th>
<th>imm Type</th>
<th>dst Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
dst = (next_imm &lt;&lt; 32) | imm dst = (next_imm &lt;&lt; 32) | imm
</t> </t>
</td> </td>
<td> <td>
<t> <t>
integer integer
</t> </t>
</td> </td>
<td> <td>
<t> <t>
integer integer
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x1 0x1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = map_by_fd(imm) dst = map_by_fd(imm)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map fd map fd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map map
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x2 0x2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = map_val(map_by_fd(imm)) + next_imm dst = map_val(map_by_fd(imm)) + next_imm
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map fd map fd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
data address data address
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x3 0x3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = var_addr(imm) dst = var_addr(imm)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
variable id variable id
</t> </t>
</td> </td>
<td> <td>
<t> <t>
data address data address
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x4 0x4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = code_addr(imm) dst = code_addr(imm)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
integer integer
</t> </t>
</td> </td>
<td> <td>
<t> <t>
code address code address
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x5 0x5
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = map_by_idx(imm) dst = map_by_idx(imm)
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map index map index
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map map
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
0x6 0x6
</t> </t>
</td> </td>
<td> <td>
<t> <t>
dst = map_val(map_by_idx(imm)) + next_imm dst = map_val(map_by_idx(imm)) + next_imm
</t> </t>
</td> </td>
<td> <td>
<t> <t>
map index map index
</t> </t>
</td> </td>
<td> <td>
<t> <t>
data address data address
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
where where
</t> </t>
<ul> <ul>
<li> <li>
map_by_fd(imm) means to convert a 32-bit file descriptor into an address o map_by_fd(imm) means to convert a 32-bit file descriptor into an address o
f a map (see <xref target="maps">Maps</xref>) f a map (see <xref target="maps"/>)
</li> </li>
<li> <li>
map_by_idx(imm) means to convert a 32-bit index into an address of a map map_by_idx(imm) means to convert a 32-bit index into an address of a map
</li> </li>
<li> <li>
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
</li> </li>
<li> <li>
var_addr(imm) gets the address of a platform variable (see <xref target="p var_addr(imm) gets the address of a platform variable (see <xref target="p
latform-variables">Platform Variables</xref>) with a given id latform-variables"/>) with a given id
</li> </li>
<li> <li>
code_addr(imm) gets the address of the instruction at a specified relative offset in number of (64-bit) instructions code_addr(imm) gets the address of the instruction at a specified relative offset in number of (64-bit) instructions
</li> </li>
<li> <li>
the 'imm type' can be used by disassemblers for display the 'imm type' can be used by disassemblers for display
</li> </li>
<li>
the 'dst type' can be used for verification and JIT compilation purposes <li>
the 'dst type' can be used for verification and just-in-time compilation p
urposes
</li> </li>
</ul> </ul>
<section anchor="maps" title="Maps"> <section anchor="maps">
<t> <name>Maps</name>
<t>
Maps are shared memory regions accessible by BPF programs on some platform s. Maps are shared memory regions accessible by BPF programs on some platform s.
A map can have various semantics as defined in a separate document, and ma y or A map can have various semantics as defined in a separate document, and ma y or
may not have a single contiguous memory region, but the 'map_val(map)' is 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 re gion. currently only defined for maps that do have a single contiguous memory re gion.
</t> </t>
<t> <t>
Each map can have a file descriptor (fd) if supported by the platform, whe re Each map can have a file descriptor (fd) if supported by the platform, whe re
'map_by_fd(imm)' means to get the map with the specified file descriptor. Each '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 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 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 instructio n. index in the set associated with the BPF program containing the instructio n.
</t> </t>
</section> </section>
<section anchor="platform-variables" title="Platform Variables"> <section anchor="platform-variables">
<t> <name>Platform Variables</name>
<t>
Platform variables are memory regions, identified by integer ids, exposed by Platform variables are memory regions, identified by integer ids, exposed by
the runtime and accessible by BPF programs on some platforms. The the runtime, and accessible by BPF programs on some platforms. The
'var_addr(imm)' operation means to get the address of the memory region 'var_addr(imm)' operation means to get the address of the memory region
identified by the given id. identified by the given id.
</t> </t>
</section> </section>
</section> </section>
<section anchor="legacy-bpf-packet-access-instructions" title="Legacy BPF Pac <section anchor="legacy-bpf-packet-access-instructions">
ket access instructions"> <name>Legacy BPF Packet Access Instructions</name>
<t> <t>
BPF previously introduced special instructions for access to packet data th at were BPF previously introduced special instructions for access to packet data th at were
carried over from classic BPF. These instructions used an instruction carried over from classic BPF. These instructions used an instruction
class of <tt>LD</tt>, a size modifier of <tt>W</tt>, <tt>H</tt>, or <tt>B</ tt>, and a class of <tt>LD</tt>, a size modifier of <tt>W</tt>, <tt>H</tt>, or <tt>B</ tt>, and a
mode modifier of <tt>ABS</tt> or <tt>IND</tt>. The 'dst_reg' and 'offset' fields were mode modifier of <tt>ABS</tt> or <tt>IND</tt>. The 'dst_reg' and 'offset' fields were
set to zero, and 'src_reg' was set to zero for <tt>ABS</tt>. However, thes e set to zero, and 'src_reg' was set to zero for <tt>ABS</tt>. However, thes e
instructions are deprecated and SHOULD no longer be used. All legacy packe t instructions are deprecated and <bcp14>SHOULD</bcp14> no longer be used. A ll legacy packet
access instructions belong to the "packet" conformance group. access instructions belong to the "packet" conformance group.
</t> </t>
</section> </section>
</section> </section>
<section anchor="security-considerations" title="Security Considerations"> <section anchor="security-considerations">
<t> <name>Security Considerations</name>
<t>
BPF programs could use BPF instructions to do malicious things with memory, CPU, networking, BPF programs could use BPF instructions to do malicious things with memory, CPU, networking,
or other system resources. This is not fundamentally different from any oth er type of or other system resources. This is not fundamentally different from any oth er type of
software that may run on a device. Execution environments should be careful ly designed software that may run on a device. Execution environments should be careful ly designed
to only run BPF programs that are trusted and verified, and sandboxing and p rivilege level to only run BPF programs that are trusted and verified, and sandboxing and p rivilege level
separation are key strategies for limiting security and abuse impact. For e xample, BPF separation are key strategies for limiting security and abuse impact. For e xample, BPF
verifiers are well-known and widely deployed and are responsible for ensurin g that BPF programs verifiers are well-known and widely deployed and are responsible for ensurin g that BPF programs
will terminate within a reasonable time, only interact with memory in safe w ays, adhere to will terminate within a reasonable time, only interact with memory in safe w ays, adhere to
platform-specified API contracts, and don't use instructions with undefined behavior. platform-specified API contracts, and don't use instructions with undefined behavior.
This level of verification can often provide a stronger level This level of verification can often provide a stronger level
of security assurance than for other software and operating system code. of security assurance than for other software and operating system code.
While the details are out of scope of this document, While the details are out of scope of this document,
<xref target="LINUX">Linux</xref> and Linux <xref target="LINUX"/> and PREVAIL
<xref target="PREVAIL">PREVAIL</xref> do provide many details. Future IETF <xref target="PREVAIL"/> provide many details. Future IETF work will docume
work will document verifier expectations nt verifier expectations
and building blocks for allowing safe execution of untrusted BPF programs. and building blocks for allowing safe execution of untrusted BPF programs.
</t> </t>
<t>
<t>
Executing programs using the BPF instruction set also requires either an int erpreter or a compiler Executing programs using the BPF instruction set also requires either an int erpreter or a compiler
to translate them to hardware processor native instructions. In general, int erpreters are considered a to translate them to built-in hardware processor instructions. In general, i nterpreters are considered a
source of insecurity (e.g., gadgets susceptible to side-channel attacks due to speculative execution) source of insecurity (e.g., gadgets susceptible to side-channel attacks due to speculative execution)
whenever one is used in the same memory address space as data with confident iality whenever one is used in the same memory address space as data with confident iality
concerns. As such, use of a compiler is recommended instead. Compilers sho uld be audited concerns. As such, use of a compiler is recommended instead. Compilers sho uld be audited
carefully for vulnerabilities to ensure that compilation of a trusted and ve rified BPF program carefully for vulnerabilities to ensure that compilation of a trusted and ve rified BPF program
to native processor instructions does not introduce vulnerabilities. to built-in processor instructions does not introduce vulnerabilities.
</t> </t>
<t> <t>
Exposing functionality via BPF extends the interface between the component e xecuting the BPF program and the Exposing functionality via BPF extends the interface between the component e xecuting the BPF program and the
component submitting it. Careful consideration of what functionality is expo sed and how component submitting it. Careful consideration of what functionality is expo sed and how
that impacts the security properties desired is required. that impacts the security properties desired is required.
</t> </t>
</section> </section>
<section anchor="iana-considerations" title="IANA Considerations"> <section anchor="iana-considerations">
<t> <name>IANA Considerations</name>
<t>
This document defines two registries. This document defines two registries.
</t> </t>
<section anchor="bpf-instruction-conformance-group-registry" title="BPF Instr <section anchor="bpf-instruction-conformance-group-registry">
uction Conformance Group Registry"> <name>BPF Instruction Conformance Groups Registry</name>
<t> <t>
This document defines an IANA registry for BPF instruction conformance grou ps, as follows: This document defines an IANA registry for BPF instruction conformance grou ps, as follows:
</t> </t>
<ul> <ul>
<li> <li>
Name of the registry: BPF Instruction Conformance Groups Name of the registry: BPF Instruction Conformance Groups
</li> </li>
<li> <li>
Name of the registry group: BPF Instructions Name of the registry group: BPF Instructions
</li> </li>
<li> <li>
Required information for registrations: See <xref target="bpf-instruction- Required information for registrations: See the BPF Instruction Conformanc
conformance-group-registration-template">BPF Instruction Conformance Group Regis e Groups Registration Template (<xref target="bpf-instruction-conformance-group-
tration Template</xref> registration-template"/>)
</li> </li>
<li> <li>
Syntax of registry entries: Each entry has the following fields: name, des cription, includes, excludes, Syntax of registry entries: Each entry has the following fields: name, des cription, includes, excludes,
status, and reference. See <xref target="bpf-instruction-conformance-group -registration-template">BPF Instruction Conformance Group Registration Template< /xref> for more details. status, change controller, and reference. See <xref target="bpf-instructio n-conformance-group-registration-template"/> for more details.
</li> </li>
<li> <li>
<t>
Registration policy (see <xref target="RFC8126" section="4"/> for details) : Registration policy (see <xref target="RFC8126" section="4"/> for details) :
<ul> </t>
<li> <ul>
Permanent: Standards action or IESG Approval <li>
Permanent: Standards Action or IESG Approval
</li> </li>
<li> <li>
Provisional: Specification required Provisional: Specification Required
</li> </li>
<li> <li>
Historical: Specification required Historical: Specification Required
</li> </li>
</ul> </ul>
</li> </li>
</ul> <li>Contact: The IESG</li>
<t> <li>Change Controller: IETF</li>
Initial entries in this registry are as follows:
</t> </ul>
<table>
<name>Initial conformance groups</name>
<thead>
<tr>
<th>name</th>
<th>description</th>
<th>includes</th>
<th>excludes</th>
<th>status</th>
<th>reference</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
32-bit atomic instructions
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX <xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
64-bit atomic instructions
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX <xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
base32
</t>
</td>
<td>
<t>
32-bit base instructions
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX
</t>
</td>
</tr>
<tr>
<td>
<t>
base64
</t>
</td>
<td>
<t>
64-bit base instructions
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX
</t>
</td>
</tr>
<tr>
<td>
<t>
divmul32
</t>
</td>
<td>
<t>
32-bit division and modulo
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX <xref target="arithmetic-instructions">Arithmetic instructions</
xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
divmul64
</t>
</td>
<td>
<t>
64-bit division and modulo
</t>
</td>
<td>
<t>
divmul32
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Permanent
</t>
</td>
<td>
<t>
RFCXXX <xref target="arithmetic-instructions">Arithmetic instructions</
xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
packet
</t>
</td>
<td>
<t>
Legacy packet instructions
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
-
</t>
</td>
<td>
<t>
Historical
</t>
</td>
<td>
<t> <t>
RFCXXX <xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet access instructions</xref> Initial entries in this registry are as follows:
</t> </t>
</td> <table>
</tr> <name>Initial Conformance Groups</name>
</tbody> <thead>
</table> <tr>
<t> <th>Name</th>
NOTE TO RFC-EDITOR: Upon publication, please replace RFCXXX above with refe <th>Description</th>
rence to this document. <th>Includes</th>
</t> <th>Excludes</th>
<section anchor="bpf-instruction-conformance-group-registration-template" ti <th>Status</th>
tle="BPF Instruction Conformance Group Registration Template"> <th>Reference</th>
<t> </tr>
This template describes the fields that must be supplied in a registration </thead>
request <tbody>
suitable for adding to the registry: <tr>
</t> <td>
<dl> <t> atomic32 </t>
<dt anchor="term-name:"> </td>
<td>
<t>
32-bit atomic instructions
</t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t>
RFC 9669,
<xref target="atomic-operations"/>
</t>
</td>
</tr>
<tr>
<td>
<t> atomic64 </t>
</td>
<td>
<t>
64-bit atomic instructions
</t>
</td>
<td>
<t> atomic32 </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t>
RFC 9669,
<xref target="atomic-operations"/>
</t>
</td>
</tr>
<tr>
<td>
<t> base32 </t>
</td>
<td>
<t>
32-bit base instructions
</t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t> RFC 9669 </t>
</td>
</tr>
<tr>
<td>
<t> base64 </t>
</td>
<td>
<t>
64-bit base instructions
</t>
</td>
<td>
<t> base32 </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t> RFC 9669 </t>
</td>
</tr>
<tr>
<td>
<t> divmul32 </t>
</td>
<td>
<t>
32-bit division and modulo
</t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t>
RFC 9669,
<xref target="arithmetic-instructions"/>
</t>
</td>
</tr>
<tr>
<td>
<t> divmul64 </t>
</td>
<td>
<t>
64-bit division and modulo
</t>
</td>
<td>
<t> divmul32 </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Permanent </t>
</td>
<td>
<t>
RFC 9669,
<xref target="arithmetic-instructions"/>
</t>
</td>
</tr>
<tr>
<td>
<t> packet </t>
</td>
<td>
<t>
Legacy packet instructions
</t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> - </t>
</td>
<td>
<t> Historical </t>
</td>
<td>
<t>
RFC 9669,
<xref target="legacy-bpf-packet-access-instructions"/>
</t>
</td>
</tr>
</tbody>
</table>
<section anchor="bpf-instruction-conformance-group-registration-template
">
<name>BPF Instruction Conformance Groups Registration Template</name>
<t>
This template describes the fields that must be supplied in a registration
request:
</t>
<dl>
<dt anchor="term-name_">
Name: Name:
</dt> </dt>
<dd> <dd>
<t> <t>
Alphanumeric label indicating the name of the conformance group. Alphanumeric label indicating the name of the conformance group.
</t> </t>
</dd> </dd>
<dt anchor="term-description:"> <dt anchor="term-description_">
Description: Description:
</dt> </dt>
<dd> <dd>
<t> <t>
Brief description of the conformance group. Brief description of the conformance group.
</t> </t>
</dd> </dd>
<dt anchor="term-includes:"> <dt anchor="term-includes_">
Includes: Includes:
</dt> </dt>
<dd> <dd>
<t> <t>
Any other conformance groups that are included by this group. Any other conformance groups that are included by this group.
</t> </t>
</dd> </dd>
<dt anchor="term-excludes:"> <dt anchor="term-excludes_">
Excludes: Excludes:
</dt> </dt>
<dd> <dd>
<t> <t>
Any other conformance groups that are excluded by this group. Any other conformance groups that are excluded by this group.
</t> </t>
</dd> </dd>
<dt anchor="term-status:"> <dt anchor="term-status_">
Status: Status:
</dt> </dt>
<dd> <dd>
<t> <t>
This reflects the status requested and must be one of 'Permanent', This reflects the status requested and must be one of 'Permanent',
'Provisional', or 'Historical'. 'Provisional', or 'Historical'.
</t> </t>
</dd> </dd>
<dt anchor="term-contact:"> <dt anchor="term-contact_">
Contact: Contact:
</dt> </dt>
<dd> <dd>
<t> <t>
Person (including contact information) to contact for further informatio n. Person (including contact information) to contact for further informatio n.
</t> </t>
</dd> </dd>
<dt anchor="term-change-controller:"> <dt anchor="term-change-controller_">
Change controller: Change Controller:
</dt> </dt>
<dd> <dd>
<t> <t>
Organization or person (often the author), including contact information Organization or person (often the author of the defining specification),
, including contact information,
authorized to change this. authorized to change this.
</t> </t>
</dd> </dd>
<dt anchor="term-reference:"> <dt anchor="term-reference_">
Reference: Reference:
</dt> </dt>
<dd> <dd>
<t> <t>
A reference to the defining specification. A reference to the defining specification. Include full
Include full citations for all referenced documents. citations for all referenced documents. Registration requests for
Registration requests for 'Provisional' registration can be 'Provisional' registration can be included in an Internet-Draft;
included in an Internet-Draft; when the documents are when the documents are approved for publication as an RFC, the
approved for publication as an RFC, the registration will be registration will be updated to 'Permanent'.
updated. </t>
</t> </dd>
</dd> </dl>
</dl> </section>
</section> </section>
</section> <section anchor="bpf-instruction-set-registry">
<section anchor="bpf-instruction-set-registry" title="BPF Instruction Set Reg <name>BPF Instruction Set Registry</name>
istry"> <t>
<t> This document defines an IANA registry for BPF instructions, as follows:
This document proposes a new IANA registry for BPF instructions, as follows </t>
: <ul>
</t> <li>
<ul>
<li>
Name of the registry: BPF Instruction Set Name of the registry: BPF Instruction Set
</li> </li>
<li> <li>
Name of the registry group: BPF Instructions Name of the registry group: BPF Instructions
</li> </li>
<li> <li>
Required information for registrations: See <xref target="bpf-instruction- Required information for registrations: See the BPF Instruction Registrati
registration-template">BPF Instruction Registration Template</xref> on Template (<xref target="bpf-instruction-registration-template"/>)
</li> </li>
<li> <li>
Syntax of registry entries: Each entry has the following fields: opcode, s Syntax of registry entries: Each entry has the following fields: opcode, s
rc, imm, offset, description, rc, offset, imm, description,
groups, and reference. See <xref target="bpf-instruction-registration-temp groups, change controller, and reference. See <xref target="bpf-instructio
late">BPF Instruction Registration Template</xref> for more details. n-registration-template"/> for more details.
</li> </li>
<li>
<li>
Registration policy: New instructions require a new entry in the conforman ce group Registration policy: New instructions require a new entry in the conforman ce group
registry and the same registration policies apply. registry and the same registration policies apply.
</li> </li>
<li> <li>Contact: The IESG</li>
Initial registrations: See the Appendix. Instructions other than those lis <li>Change Controller: IETF</li>
ted <li>
Initial registrations: See <xref target="appendix"/>. Instructions other t
han those listed
as deprecated are Permanent. Any listed as deprecated are Historical. as deprecated are Permanent. Any listed as deprecated are Historical.
</li> </li>
</ul> </ul>
<section anchor="bpf-instruction-registration-template" title="BPF Instructi <section anchor="bpf-instruction-registration-template">
on Registration Template"> <name>BPF Instruction Registration Template</name>
<t> <t>
This template describes the fields that must be supplied in a registration This template describes the fields that must be supplied in a registration
request request:
suitable for adding to the registry: </t>
</t> <dl>
<dl> <dt anchor="term-opcode_">
<dt anchor="term-opcode:">
Opcode: Opcode:
</dt> </dt>
<dd> <dd>
<t> <t>
A 1-byte value in hex format indicating the value of the opcode field A 1-byte value in hex format indicating the value of the opcode field.
</t> </t>
</dd> </dd>
<dt anchor="term-src:"> <dt anchor="term-src_">
Src: Src_reg:
</dt> </dt>
<dd> <dd>
<t> <t>
Either a numeric value indicating the value of the src field, or "any" Either a numeric value indicating the value of the src_reg field, or "an
</t> y".
</dd> </t>
<dt anchor="term-imm:"> </dd>
Imm:
</dt> <dt anchor="term-offset_">
<dd>
<t>
Either a value indicating the value of the imm field, or "any"
</t>
</dd>
<dt anchor="term-offset:">
Offset: Offset:
</dt> </dt>
<dd> <dd>
<t> <t>
Either a numeric value indicating the value of the offset field, or "any Either a numeric value indicating the value of the offset field, or "any
" ".
</t> </t>
</dd> </dd>
<dt anchor="term-description:-">
<dt anchor="term-imm_">
Imm:
</dt>
<dd>
<t>
Either a value indicating the value of the imm field, or "any".
</t>
</dd>
<dt anchor="term-description_-">
Description: Description:
</dt> </dt>
<dd> <dd>
<t> <t>
Description of what the instruction does, typically in pseudocode Description of what the instruction does, typically in pseudocode.
</t> </t>
</dd> </dd>
<dt anchor="term-groups:"> <dt anchor="term-groups_">
Groups: Groups:
</dt> </dt>
<dd> <dd>
<t> <t>
A list of one or more comma-separated conformance groups to which the in A list of one or more comma-separated conformance groups to which the in
struction belongs struction belongs.
</t> </t>
</dd> </dd>
<dt anchor="term-contact:-"> <dt anchor="term-contact_-">
Contact: Contact:
</dt> </dt>
<dd> <dd>
<t> <t>
Person (including contact information) to contact for further informatio n. Person (including contact information) to contact for further informatio n.
</t> </t>
</dd> </dd>
<dt anchor="term-change-controller:-"> <dt anchor="term-change-controller_-">
Change controller: Change Controller:
</dt> </dt>
<dd> <dd>
<t> <t>
Organization or person (often the author), including contact information , Organization or person (often the author), including contact information ,
authorized to change this. authorized to change this.
</t> </t>
</dd> </dd>
<dt anchor="term-reference:-"> <dt anchor="term-reference_-">
Reference: Reference:
</dt> </dt>
<dd> <dd>
<t> <t>
A reference to the defining specification. A reference to the defining specification. Include full
Include full citations for all referenced documents. citations for all referenced documents. Registration requests for
Registration requests for 'Provisional' registration can be 'Provisional' registration can be included in an Internet-Draft;
included in an Internet-Draft; when the documents are when the documents are approved for publication as an RFC, the
approved for publication as an RFC, the registration will be registration will be updated to 'Permanent'.
updated. </t>
</t> </dd>
</dd> </dl>
</dl> </section>
</section> </section>
</section> <section anchor="adding-instructions">
<section anchor="adding-instructions" title="Adding instructions"> <name>Adding Instructions</name>
<t> <t>
A specification may add additional instructions to the BPF Instruction Set registry. A specification may add additional instructions to the BPF Instruction Set registry.
Once a conformance group is registered with a set of instructions, Once a conformance group is registered with a set of instructions,
no further instructions can be added to that conformance group. A specifica tion no further instructions can be added to that conformance group. A specifica tion
should instead create a new conformance group that includes the original co nformance group, should instead create a new conformance group that includes the original co nformance group,
plus any newly added instructions. Inclusion of the original conformance g roup is done plus any newly added instructions. Inclusion of the original conformance g roup is done
via the "includes" column of the BPF Instruction Conformance Group Registry via the "includes" column of the BPF Instruction Conformance Groups registr
, and inclusion y, and inclusion
of newly added instructions is done via the "groups" column of the BPF Inst of newly added instructions is done via the "groups" column of the BPF Inst
ruction Set Registry. ruction Set registry.
</t> </t>
<t> <t>
For example, consider an existing hypothetical group called "example" with two instructions in it. For example, consider an existing hypothetical group called "example" with two instructions in it.
One might add two more instructions by first adding an "examplev2" group to the One might add two more instructions by first adding an "examplev2" group to the
BPF Instruction Conformance Group Registry as follows: BPF Instruction Conformance Groups registry as follows:
</t>
<table>
<name>Conformance group example for addition</name>
<thead>
<tr>
<th>name</th>
<th>description</th>
<th>includes</th>
<th>excludes</th>
<th>status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
example
</t> </t>
</td> <table>
<td> <name>Conformance Group Example for Addition</name>
<t> <thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Includes</th>
<th>Excludes</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
example
</t>
</td>
<td>
<t>
Original example instructions Original example instructions
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Permanent Permanent
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
examplev2 examplev2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Newer set of example instructions Newer set of example instructions
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Permanent Permanent
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t>
And then adding the new instructions into the BPF Instruction Set Registry
as follows:
</t>
<table>
<name>Instruction addition example</name>
<thead>
<tr>
<th>opcode</th>
<th>...</th>
<th>description</th>
<th>groups</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t> <t>
aaa And then adding the new instructions into the BPF Instruction Set registry as follows:
</t> </t>
</td> <table>
<td> <name>Instruction Addition Example</name>
<t> <thead>
<tr>
<th>opcode</th>
<th>...</th>
<th>Description</th>
<th>Groups</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
aaa
</t>
</td>
<td>
<t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Original example instruction 1 Original example instruction 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
bbb bbb
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Original example instruction 2 Original example instruction 2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ccc ccc
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Added example instruction 3 Added example instruction 3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
examplev2 examplev2
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ddd ddd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Added example instruction 4 Added example instruction 4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
examplev2 examplev2
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
Supporting the "examplev2" group thus requires supporting all four example instructions. Supporting the "examplev2" group thus requires supporting all four example instructions.
</t> </t>
</section> </section>
<section anchor="deprecating-instructions" title="Deprecating instructions"> <section anchor="deprecating-instructions">
<t> <name>Deprecating Instructions</name>
<t>
Deprecating instructions that are part of an existing conformance group can be done by defining a Deprecating instructions that are part of an existing conformance group can be done by defining a
new conformance group for the newly deprecated instructions, and defining a new conformance group new conformance group for the newly deprecated instructions, and defining a new conformance group
that supersedes the existing conformance group containing the instructions, where the new conformance that supersedes the existing conformance group containing the instructions, where the new conformance
group includes the existing one and excludes the deprecated instruction gro up. group includes the existing one and excludes the deprecated instruction gro up.
</t>
<t>
For example, if deprecating an instruction in an existing hypothetical grou
p called "example", two new groups
("legacyexample" and "examplev2") might be registered in the BPF Instructio
n Conformance Group
Registry as follows:
</t>
<table>
<name>Conformance group example for deprecation</name>
<thead>
<tr>
<th>name</th>
<th>description</th>
<th>includes</th>
<th>excludes</th>
<th>status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
example
</t> </t>
</td>
<td>
<t> <t>
Original example instructions For example, if deprecating an instruction in an existing hypothetical grou
p called "example", two new groups
("legacyexample" and "examplev2") might be registered in the BPF Instructio
n Conformance Groups
registry as follows:
</t> </t>
</td> <table>
<td> <name>Conformance Group Example for Deprecation</name>
<t> <thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Includes</th>
<th>Excludes</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
example
</t>
</td>
<td>
<t>
Original example instructions
</t>
</td>
<td>
<t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Permanent Permanent
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
legacyexample legacyexample
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Legacy example instructions Legacy example instructions
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
- -
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Historical Historical
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
examplev2 examplev2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Example instructions Example instructions
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
<td> <td>
<t> <t>
legacyexample legacyexample
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Permanent Permanent
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t>
The BPF Instruction Set Registry entries for the deprecated instructions wo
uld then be updated
to add "legacyexample" to the set of groups for those instructions, as foll
ows:
</t>
<table>
<name>Instruction deprecation example</name>
<thead>
<tr>
<th>opcode</th>
<th>...</th>
<th>description</th>
<th>groups</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t> <t>
aaa The BPF Instruction Set registry entries for the deprecated instructions wo
uld then be updated
to add "legacyexample" to the set of groups for those instructions, as foll
ows:
</t> </t>
</td> <table>
<td> <name>Instruction Deprecation Example</name>
<t> <thead>
<tr>
<th>opcode</th>
<th>...</th>
<th>Description</th>
<th>Groups</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<t>
aaa
</t>
</td>
<td>
<t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Good original instruction 1 Good original instruction 1
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
bbb bbb
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Good original instruction 2 Good original instruction 2
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example example
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ccc ccc
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Bad original instruction 3 Bad original instruction 3
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example, legacyexample example, legacyexample
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t>
ddd ddd
</t> </t>
</td> </td>
<td> <td>
<t> <t>
... ...
</t> </t>
</td> </td>
<td> <td>
<t> <t>
Bad original instruction 4 Bad original instruction 4
</t> </t>
</td> </td>
<td> <td>
<t> <t>
example, legacyexample example, legacyexample
</t> </t>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<t> <t>
Finally, updated implementations that dropped support for the deprecated in structions Finally, updated implementations that dropped support for the deprecated in structions
would then be able to claim conformance to "examplev2" rather than "example ". would then be able to claim conformance to "examplev2" rather than "example ".
</t> </t>
</section> </section>
<section anchor="change-control" title="Change Control"> <section anchor="change-control">
<t> <name>Change Control</name>
Registrations can be updated in a registry by the same mechanism as
required for an initial registration. In cases where the original <t>
definition of an entry is contained in an IESG-approved document, Registrations can be updated in a registry by the same mechanism as
update of the specification also requires IESG approval. required for an initial registration. In cases where the original
</t> definition of an entry is contained in an IESG-approved document,
<t> in which case the IETF would be the change controller,
update of the specification also requires IESG approval.
</t>
<t>
'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 designated in the existing registration. In addition, the
IESG can reassign responsibility for a 'Provisional' registration IESG can reassign responsibility for a 'Provisional' registration
or can request specific changes to an entry. or can request specific changes to an entry.
This will enable changes to be made to entries where the original This will enable changes to be made to entries where the original
registrant is out of contact or unwilling or unable to make changes. registrant is out of contact or unwilling or unable to make changes.
</t> </t>
<t> <t>
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.
</t> </t>
</section> </section>
<section anchor="expert-review-instructions" title="Expert Review Instruction <section anchor="expert-review-instructions">
s"> <name>Expert Review Instructions</name>
<t> <t>
The IANA registries established by this document are informed by written The IANA registries established by this document are informed by written
specifications, which themselves are facilitated and approved by specifications, which themselves are facilitated and approved by
an Expert Review <xref target="RFC8126" section="5.3"/> an Expert Review process (see <xref target="RFC8126" section="5.3"/>).
process. </t>
</t> <t>
<t> Designated experts are expected to consult with the active
Designated Experts are expected to consult with the active
BPF working group (e.g., via email to the working group's mailing list) BPF 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 encoding platforms). The designated expert is expected to verify that the encoding
and semantics for any new instructions are properly documented in a and semantics for any new instructions are properly documented in a
public-facing specification. In the event of future RFC documents for ISA public-facing specification. In the event of future RFC documents for ISA
extensions, experts may permit early assignment before the RFC document extensions, experts may permit early assignment before the RFC document
is available, as long as a specification exists which satisfies the above is available, as long as a specification that satisfies the above
requirements. requirements exists.
</t> </t>
</section> </section>
</section> </section>
<section anchor="acknowledgements" title="Acknowledgements">
<t> </middle>
This draft was generated from instruction-set.rst in the Linux <back>
kernel repository, to which a number of other individuals have authored cont <references>
ributions <name>References</name>
over time, including Akhil Raj, Alexei Starovoitov, Brendan Jackman, Christo <references>
ph Hellwig, Daniel Borkmann, <name>Normative References</name>
Ilya Leoshkevich, Jiong Wang, Jose E. Marchesi, Kosuke Fujimoto,
Shahab Vahedi, Tiezhu Yang, Will Hawkins, and Zheng Yejian, with review and <reference anchor="IEN137" target="https://www.rfc-editor.org/ien/ien137
suggestions by many others including .txt">
Alan Jowett, Andrii Nakryiko, David Vernet, Jim Harris, <front>
Quentin Monnet, Song Liu, Shung-Hsi Yu, Stanislav Fomichev, Watson Ladd, and <title>ON HOLY WARS AND A PLEA FOR PEACE</title>
Yonghong Song. <author fullname="D. Cohen" initials="D." surname="Cohen"/>
</t> <date month="April" year="1980" day="1"/>
</section> </front>
<section anchor="appendix" title="Appendix"> <seriesInfo name="IEN" value="137"/>
<t> </reference>
Initial values for the BPF Instruction sub-registry are given below.
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2
119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8
126.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8
174.xml"/>
</references>
<references>
<name>Informative References</name>
<reference anchor="LINUX" target="https://www.kernel.org/doc/html/latest
/bpf/verifier.html">
<front>
<title>eBPF verifier</title>
<author/>
</front>
</reference>
<reference anchor="PREVAIL">
<front>
<title>Simple and Precise Static Analysis of Untrusted Linux Kernel
Extensions</title>
<author fullname="E. Gershuni" initials="E." surname="Gershuni"/>
<author fullname="N. Amit" initials="N." surname="Amit"/>
<author fullname="A. Gurfinkel" initials="A." surname="Gurfinkel"/>
<author fullname="N. Narodytska" initials="N." surname="Narodytska"/
>
<author fullname="J. Navas" initials="J." surname="Navas"/>
<author fullname="N. Rinetzky" initials="N." surname="Rinetzky"/>
<author fullname="L. Ryzhyk" initials="L." surname="Ryzhyk"/>
<author fullname="M. Sagiv" initials="M." surname="Sagiv"/>
<date month="June" year="2019"/>
</front>
<seriesInfo name="DOI" value="10.1145/3314221.3314590"/>
</reference>
</references>
</references>
<section anchor="appendix">
<name>Initial BPF Instruction Set Values</name>
<t>
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 The descriptions in this table are informative. In case of any discrepancy, the reference
is authoritative. is authoritative.
</t> </t>
<table> <table>
<name>BPF Instruction sub-registry initial values</name> <name>Initial BPF Instruction Set Values</name>
<thead> <thead>
<tr> <tr>
<th>opcode</th> <th>opcode</th>
<th>src_reg</th> <th>src_reg</th>
<th>offset</th> <th>off-set</th>
<th>imm</th> <th>imm</th>
<th>description</th> <th>Description</th>
<th>groups</th> <th>Groups</th>
<th>reference</th> <th>Ref</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> <td>
<t> <t> 0x00 </t>
0x00 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
0x0 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t>
</td> (additional immediate value)
<td> </t>
<t> </td>
any <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
(additional immediate value) RFC 9669,
</t> <xref target="_4-bit-immediate-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base64 <tr>
</t> <td>
</td> <t> 0x04 </t>
<td> </td>
<t> <td>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio <t> 0x0 </t>
ns</xref> </td>
</t> <td>
</td> <t> 0 </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x04 <td>
</t> <t>
</td> dst = (u32)((u32)dst + (u32)imm)
<td> </t>
<t> </td>
0x0 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x05 </t>
<td> </td>
<t> <td>
dst = (u32)((u32)dst + (u32)imm) <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base32 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> goto +offset </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> base32 </t>
</tr> </td>
<tr> <td>
<td> <t>
<t> RFC 9669,
0x05 <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0x0 <td>
</t> <t> 0x06 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0x00 <t> any </t>
</t> </td>
</td> <td>
<td> <t> goto +imm </t>
<t> </td>
goto +offset <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
base32 RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="jump-instructions">Jump instructions</xref> <tr>
</t> <td>
</td> <t> 0x07 </t>
</tr> </td>
<tr> <td>
<td> <t> 0x0 </t>
<t> </td>
0x06 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x0 </td>
</t> <td>
</td> <t> dst += imm </t>
<td> </td>
<t> <td>
0 <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
goto +imm <td>
</t> <t> 0x0c </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base32 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0x00 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> dst = (u32)((u32)dst + (u32)src)
<td> </t>
<t> </td>
0x07 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0 <tr>
</t> <td>
</td> <t> 0x0f </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
dst += imm <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst += src </t>
base64 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x0c <td>
</t> <t> 0x14 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0 <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> dst = (u32)((u32)dst - (u32)imm)
0x00 </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
dst = (u32)((u32)dst + (u32)src) <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
base32 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x15 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> 0x0 </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x0f <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> if dst == imm goto +offset </t>
any </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
0 <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
0x00 </tr>
</t> <tr>
</td> <td>
<td> <t> 0x16 </t>
<t> </td>
dst += src <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base64 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> if (u32)dst == imm goto +offset
</td> </t>
</tr> </td>
<tr> <td>
<td> <t> base32 </t>
<t> </td>
0x14 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="jump-instructions"/>
<t> </t>
0x0 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x17 </t>
0 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
any <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = (u32)((u32)dst - (u32)imm) <td>
</t> <t> dst -= imm </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
base32 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t> 0x18 </t>
<t> </td>
0x15 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
0x0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
any <t>
</t> dst = (next_imm &lt;&lt; 32) | imm
</td> </t>
<td> </td>
<t> <td>
any <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
if dst == imm goto +offset <xref target="_4-bit-immediate-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
base64 <td>
</t> <t> 0x18 </t>
</td> </td>
<td> <td>
<t> <t> 0x1 </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> 0 </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x16 <td>
</t> <t> dst = map_by_fd(imm) </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
0x0 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="_4-bit-immediate-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x18 </t>
</t> </td>
</td> <td>
<td> <t> 0x2 </t>
<t> </td>
if (u32)dst == imm goto +offset <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base32 </td>
</t> <td>
</td> <t>
<td> dst = map_val(map_by_fd(imm)) + next_imm
<t> </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> base64 </t>
</tr> </td>
<tr> <td>
<td> <t>
<t> RFC 9669,
0x17 <xref target="_4-bit-immediate-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0x0 <td>
</t> <t> 0x18 </t>
</td> </td>
<td> <td>
<t> <t> 0x3 </t>
0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> dst = var_addr(imm) </t>
<t> </td>
dst -= imm <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
base64 RFC 9669,
</t> <xref target="_4-bit-immediate-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <tr>
</t> <td>
</td> <t> 0x18 </t>
</tr> </td>
<tr> <td>
<td> <t> 0x4 </t>
<t> </td>
0x18 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x0 </td>
</t> <td>
</td> <t> dst = code_addr(imm) </t>
<td> </td>
<t> <td>
0 <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="_4-bit-immediate-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = (next_imm &lt;&lt; 32) | imm <td>
</t> <t> 0x18 </t>
</td> </td>
<td> <td>
<t> <t> 0x5 </t>
base64 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio <t> any </t>
ns</xref> </td>
</t> <td>
</td> <t> dst = map_by_idx(imm) </t>
</tr> </td>
<tr> <td>
<td> <t> base64 </t>
<t> </td>
0x18 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="_4-bit-immediate-instructions"/>
<t> </t>
0x1 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x18 </t>
0 </td>
</t> <td>
</td> <t> 0x6 </t>
<td> </td>
<t> <td>
any <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = map_by_fd(imm) <td>
</t> <t>
</td> dst = map_val(map_by_idx(imm)) + next_imm
<td> </t>
<t> </td>
base64 <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio RFC 9669,
ns</xref> <xref target="_4-bit-immediate-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0x1c </t>
0x18 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0x2 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
0 <td>
</t> <t>
</td> dst = (u32)((u32)dst - (u32)src)
<td> </t>
<t> </td>
any <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
dst = map_val(map_by_fd(imm)) + next_imm RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base64 <tr>
</t> <td>
</td> <t> 0x1d </t>
<td> </td>
<t> <td>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio <t> any </t>
ns</xref> </td>
</t> <td>
</td> <t> any </t>
</tr> </td>
<tr> <td>
<td> <t> 0x00 </t>
<t> </td>
0x18 <td>
</t> <t> if dst == src goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
0x3 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
0 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x1e </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = var_addr(imm) <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
base64 </td>
</t> <td>
</td> <t>
<td> if (u32)dst == (u32)src goto +offset
<t> </t>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio </td>
ns</xref> <td>
</t> <t> base32 </t>
</td> </td>
</tr> <td>
<tr> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
0x18 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
0x4 <t> 0x1f </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
any </td>
</t> <td>
</td> <t> dst -= src </t>
<td> </td>
<t> <td>
dst = code_addr(imm) <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
base64 <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio <td>
ns</xref> <t> 0x20 </t>
</t> </td>
</td> <td>
</tr> <t> 0x0 </t>
<tr> </td>
<td> <td>
<t> <t> 0 </t>
0x18 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0x5 <t>
</t> (deprecated, implementation-specific)
</td> </t>
<td> </td>
<t> <td>
0 <t> packet </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="legacy-bpf-packet-access-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = map_by_idx(imm) <td>
</t> <t> 0x24 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
base64 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio <t> any </t>
ns</xref> </td>
</t> <td>
</td> <t> dst = (u32)(dst * imm) </t>
</tr> </td>
<tr> <td>
<td> <t> divmul32 </t>
<t> </td>
0x18 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
0x6 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x25 </t>
0 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = map_val(map_by_idx(imm)) + next_imm <td>
</t> <t> if dst &gt; imm goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
base64 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
<xref target="-4-bit-immediate-instructions">64-bit immediate instructio </t>
ns</xref> </td>
</t> </tr>
</td> <tr>
</tr> <td>
<tr> <t> 0x26 </t>
<td> </td>
<t> <td>
0x1c <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t>
0 if (u32)dst &gt; imm goto +offset
</t> </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
0x00 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
dst = (u32)((u32)dst - (u32)src) </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
base32 <t> 0x27 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> 0 </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0x1d <t> dst *= imm </t>
</t> </td>
</td> <td>
<td> <t> divmul64 </t>
<t> </td>
any <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
any </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x28 </t>
0x00 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
if dst == src goto +offset <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base64 <td>
</t> <t>
</td> (deprecated, implementation-specific)
<td> </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> packet </t>
</td> </td>
</tr> <td>
<tr> <t>
<td> RFC 9669,
<t> <xref target="legacy-bpf-packet-access-instructions"/>
0x1e </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x2c </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
0x00 </td>
</t> <td>
</td> <t> dst = (u32)(dst * src) </t>
<td> </td>
<t> <td>
if (u32)dst == (u32)src goto +offset <t> divmul32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
base32 <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> 0x2d </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0x1f <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
any <td>
</t> <t> if dst &gt; src goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
0 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
0x00 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
dst -= src <t> 0x2e </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base64 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t>
</tr> if (u32)dst &gt; (u32)src goto +offset
<tr> </t>
<td> </td>
<t> <td>
0x20 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x0 <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0 <td>
</t> <t> 0x2f </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
(deprecated, implementation-specific) <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> dst *= src </t>
<t> </td>
packet <td>
</t> <t> divmul64 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a RFC 9669,
ccess instructions</xref> <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0x30 </t>
0x24 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
0x0 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t>
</td> (deprecated, implementation-specific)
<td> </t>
<t> </td>
any <td>
</t> <t> packet </t>
</td> </td>
<td> <td>
<t> <t>
dst = (u32)(dst * imm) RFC 9669,
</t> <xref target="legacy-bpf-packet-access-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
divmul32 <tr>
</t> <td>
</td> <t> 0x34 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0x0 </t>
</t> </td>
</td> <td>
</tr> <t> 0 </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0x25 </td>
</t> <td>
</td> <t>
<td> dst = (u32)((imm != 0) ? ((u32)dst / (u32)imm) : 0)
<t> </t>
0x0 </td>
</t> <td>
</td> <t> divmul32 </t>
<td> </td>
<t> <td>
any <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0x34 </t>
<t> </td>
if dst &gt; imm goto +offset <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 1 </t>
base64 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t>
</t> dst = (u32)((imm != 0) ? ((s32)dst s/ imm) : 0)
</td> </t>
</tr> </td>
<tr> <td>
<td> <t> divmul32 </t>
<t> </td>
0x26 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
0x0 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x35 </t>
any </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
if (u32)dst &gt; imm goto +offset <td>
</t> <t> if dst >= imm goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
base32 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
<xref target="jump-instructions">Jump instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t> 0x36 </t>
<t> </td>
0x27 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0 <t>
</t> if (u32)dst >= imm goto +offset
</td> </t>
<td> </td>
<t> <td>
any <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
dst *= imm <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
divmul64 <td>
</t> <t> 0x37 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> 0 </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x28 <td>
</t> <t>
</td> dst = (imm != 0) ? (dst / (u32)imm) : 0
<td> </t>
<t> </td>
0x0 <td>
</t> <t> divmul64 </t>
</td> </td>
<td> <td>
<t> <t>
0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x37 </t>
<td> </td>
<t> <td>
(deprecated, implementation-specific) <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> 1 </t>
<t> </td>
packet <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a dst = (imm != 0) ? (dst s/ imm) : 0
ccess instructions</xref> </t>
</t> </td>
</td> <td>
</tr> <t> divmul64 </t>
<tr> </td>
<td> <td>
<t> <t>
0x2c RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x3c </t>
<td> </td>
<t> <td>
0 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
0x00 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
dst = (u32)(dst * src) dst = (u32)((src != 0) ? ((u32)dst / (u32)src) : 0)
</t> </t>
</td> </td>
<td> <td>
<t> <t> divmul32 </t>
divmul32 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t> 0x3c </t>
<t> </td>
0x2d <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 1 </t>
any </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
any <t>
</t> dst = (u32)((src != 0) ? ((s32)dst s/(s32)src) : 0)
</td> </t>
<td> </td>
<t> <td>
0x00 <t> divmul32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
if dst &gt; src goto +offset <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
base64 <td>
</t> <t> 0x3d </t>
</td> </td>
<td> <td>
<t> <t> any </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> any </t>
</tr> </td>
<tr> <td>
<td> <t> 0x00 </t>
<t> </td>
0x2e <td>
</t> <t> if dst >= src goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
0x00 <t> 0x3e </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
if (u32)dst &gt; (u32)src goto +offset <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
base32 </td>
</t> <td>
</td> <t>
<td> if (u32)dst >= (u32)src goto +offset
<t> </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> base32 </t>
</tr> </td>
<tr> <td>
<td> <t>
<t> RFC 9669,
0x2f <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0x3f </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0x00 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> dst = (src != 0) ? (dst / src) : 0
dst *= src </t>
</t> </td>
</td> <td>
<td> <t> divmul64 </t>
<t> </td>
divmul64 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> </tr>
</td> <tr>
</tr> <td>
<tr> <t> 0x3f </t>
<td> </td>
<t> <td>
0x30 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 1 </t>
<t> </td>
0x0 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
0 dst = (src != 0) ? (dst s/ src) : 0
</t> </t>
</td> </td>
<td> <td>
<t> <t> divmul64 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
(deprecated, implementation-specific) </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
packet <t> 0x40 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a <td>
ccess instructions</xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t>
0x34 (deprecated, implementation-specific)
</t> </t>
</td> </td>
<td> <td>
<t> <t> packet </t>
0x0 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="legacy-bpf-packet-access-instructions"/>
0 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x44 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
dst = (u32)((imm != 0) ? ((u32)dst / (u32)imm) : 0) <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
divmul32 </td>
</t> <td>
</td> <t> dst = (u32)(dst | imm) </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> base32 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
0x34 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x45 </t>
0x0 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
1 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> if dst &amp; imm goto +offset </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
dst = (u32)((imm != 0) ? ((s32)dst s/ imm) : 0) </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
divmul32 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0x46 </t>
</t> </td>
</td> <td>
</tr> <t> 0x0 </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0x35 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0x0 <t>
</t> if (u32)dst &amp; imm goto +offset
</td> </t>
<td> </td>
<t> <td>
any <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
if dst &gt;= imm goto +offset <td>
</t> <t> 0x47 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
base64 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t> dst |= imm </t>
<tr> </td>
<td> <td>
<t> <t> base64 </t>
0x36 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
0x0 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x48 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
if (u32)dst &gt;= imm goto +offset </td>
</t> <td>
</td> <t>
<td> (deprecated, implementation-specific)
<t> </t>
base32 </td>
</t> <td>
</td> <t> packet </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="legacy-bpf-packet-access-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x37 <td>
</t> <t> 0x4c </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> dst = (u32)(dst | src) </t>
<t> </td>
any <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
dst = (imm != 0) ? (dst / (u32)imm) : 0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
divmul64 <tr>
</t> <td>
</td> <t> 0x4d </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t> 0x00 </t>
0x37 </td>
</t> <td>
</td> <t> if dst &amp; src goto +offset </t>
<td> </td>
<t> <td>
0x0 <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
1 <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0x4e </t>
</td> </td>
<td> <td>
<t> <t> any </t>
dst = (imm != 0) ? (dst s/ imm) : 0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
divmul64 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> if (u32)dst &amp; (u32)src goto +offset
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </t>
</t> </td>
</td> <td>
</tr> <t> base32 </t>
<tr> </td>
<td> <td>
<t> <t>
0x3c RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x4f </t>
<td> </td>
<t> <td>
0 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
0x00 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst |= src </t>
dst = (u32)((src != 0) ? ((u32)dst / (u32)src) : 0) </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
divmul32 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </tr>
</t> <tr>
</td> <td>
</tr> <t> 0x50 </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0x3c </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> (deprecated, implementation-specific)
1 </t>
</t> </td>
</td> <td>
<td> <t> packet </t>
<t> </td>
0x00 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="legacy-bpf-packet-access-instructions"/>
<t> </t>
dst = (u32)((src != 0) ? ((s32)dst s/(s32)src) : 0) </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x54 </t>
divmul32 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t> dst = (u32)(dst &amp; imm) </t>
0x3d </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
any <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0x55 </t>
<t> </td>
0x00 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
if dst &gt;= src goto +offset </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
base64 <t> if dst != imm goto +offset </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t>
</td> RFC 9669,
</tr> <xref target="jump-instructions"/>
<tr> </t>
<td> </td>
<t> </tr>
0x3e <tr>
</t> <td>
</td> <t> 0x56 </t>
<td> </td>
<t> <td>
any <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t>
0x00 if (u32)dst != imm goto +offset
</t> </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
if (u32)dst &gt;= (u32)src goto +offset </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
base32 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0x57 </t>
</t> </td>
</td> <td>
</tr> <t> 0x0 </t>
<tr> </td>
<td> <td>
<t> <t> 0 </t>
0x3f </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
any <t> dst &amp;= imm </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
0 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
0x00 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x5c </t>
dst = (src != 0) ? (dst / src) : 0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
divmul64 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> dst = (u32)(dst &amp; src) </t>
</td> </td>
</tr> <td>
<tr> <t> base32 </t>
<td> </td>
<t> <td>
0x3f <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0x5d </t>
<t> </td>
1 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x00 </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
dst = (src != 0) ? (dst s/ src) : 0 <t> if dst != src goto +offset </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
divmul64 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="jump-instructions"/>
<t> </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> </tr>
</td> <tr>
</tr> <td>
<tr> <t> 0x5e </t>
<td> </td>
<t> <td>
0x40 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
0 if (u32)dst != (u32)src goto +offset
</t> </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
(deprecated, implementation-specific) </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
packet <t> 0x5f </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a <td>
ccess instructions</xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> 0x00 </t>
<tr> </td>
<td> <td>
<t> <t> dst &amp;= src </t>
0x44 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
0x0 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
0 </tr>
</t> <tr>
</td> <td>
<td> <t> 0x61 </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
dst = (u32)(dst | imm) </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
base32 <t>
</t> dst = *(u32 *)(src + offset)
</td> </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> base32 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> RFC 9669,
<td> <xref target="load-and-store-instructions"/>
<t> </t>
0x45 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x62 </t>
0x0 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t>
</td> *(u32 *)(dst + offset) = imm
<td> </t>
<t> </td>
if dst &amp; imm goto +offset <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
base64 RFC 9669,
</t> <xref target="load-and-store-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="jump-instructions">Jump instructions</xref> <tr>
</t> <td>
</td> <t> 0x63 </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x46 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
0x0 </td>
</t> <td>
</td> <t>
<td> *(u32 *)(dst + offset) = src
<t> </t>
any </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
any <t>
</t> RFC 9669,
</td> <xref target="load-and-store-instructions"/>
<td> </t>
<t> </td>
if (u32)dst &amp; imm goto +offset </tr>
</t> <tr>
</td> <td>
<td> <t> 0x64 </t>
<t> </td>
base32 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> any </t>
</tr> </td>
<tr> <td>
<td> <t> dst = (u32)(dst &lt;&lt; imm) </t>
<t> </td>
0x47 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0 <tr>
</t> <td>
</td> <t> 0x65 </t>
<td> </td>
<t> <td>
any <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst |= imm <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> if dst s> imm goto +offset </t>
base64 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x48 <td>
</t> <t> 0x66 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0 <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> if (s32)dst s> (s32)imm goto +offset
any </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
(deprecated, implementation-specific) <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="jump-instructions"/>
<t> </t>
packet </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x67 </t>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a </td>
ccess instructions</xref> <td>
</t> <t> 0x0 </t>
</td> </td>
</tr> <td>
<tr> <t> 0 </t>
<td> </td>
<t> <td>
0x4c <t> any </t>
</t> </td>
</td> <td>
<td> <t> dst &lt;&lt;= imm </t>
<t> </td>
any <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0x00 <tr>
</t> <td>
</td> <t> 0x69 </t>
<td> </td>
<t> <td>
dst = (u32)(dst | src) <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base32 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> dst = *(u16 *)(src + offset)
</t> </t>
</td> </td>
</tr> <td>
<tr> <t> base32 </t>
<td> </td>
<t> <td>
0x4d <t>
</t> RFC 9669,
</td> <xref target="load-and-store-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0x6a </t>
<t> </td>
any <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x00 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
if dst &amp; src goto +offset <t>
</t> *(u16 *)(dst + offset) = imm
</td> </t>
<td> </td>
<t> <td>
base64 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
<xref target="jump-instructions">Jump instructions</xref> <xref target="load-and-store-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0x6b </t>
0x4e </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
any <td>
</t> <t>
</td> *(u16 *)(dst + offset) = src
<td> </t>
<t> </td>
0x00 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
if (u32)dst &amp; (u32)src goto +offset RFC 9669,
</t> <xref target="load-and-store-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base32 <tr>
</t> <td>
</td> <t> 0x6c </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t> 0 </t>
<tr> </td>
<td> <td>
<t> <t> 0x00 </t>
0x4f </td>
</t> <td>
</td> <t> dst = (u32)(dst &lt;&lt; src) </t>
<td> </td>
<t> <td>
any <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0 <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0x00 <td>
</t> <t> 0x6d </t>
</td> </td>
<td> <td>
<t> <t> any </t>
dst |= src </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
base64 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> if dst s> src goto +offset </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> base64 </t>
</td> </td>
</tr> <td>
<tr> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
0x50 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x6e </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
any </td>
</t> <td>
</td> <t>
<td> if (s32)dst s> (s32)src goto +offset
<t> </t>
(deprecated, implementation-specific) </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
packet <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
<xref target="legacy-bpf-packet-access-instructions">Legacy BPF Packet a </tr>
ccess instructions</xref> <tr>
</t> <td>
</td> <t> 0x6f </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x54 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
0x0 </td>
</t> <td>
</td> <t> dst &lt;&lt;= src </t>
<td> </td>
<t> <td>
0 <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = (u32)(dst &amp; imm) <td>
</t> <t> 0x71 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base32 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0x00 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> dst = *(u8 *)(src + offset)
<td> </t>
<t> </td>
0x55 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 RFC 9669,
</t> <xref target="load-and-store-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x72 </t>
<td> </td>
<t> <td>
any <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
if dst != imm goto +offset <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t>
base64 *(u8 *)(dst + offset) = imm
</t> </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t>
</tr> RFC 9669,
<tr> <xref target="load-and-store-instructions"/>
<td> </t>
<t> </td>
0x56 </tr>
</t> <tr>
</td> <td>
<td> <t> 0x73 </t>
<t> </td>
0x0 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
any <t>
</t> *(u8 *)(dst + offset) = src
</td> </t>
<td> </td>
<t> <td>
if (u32)dst != imm goto +offset <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
base32 <xref target="load-and-store-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> 0x74 </t>
</td> </td>
</tr> <td>
<tr> <t> 0x0 </t>
<td> </td>
<t> <td>
0x57 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0x0 <td>
</t> <t> dst = (u32)(dst &gt;&gt; imm) </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
0 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
dst &amp;= imm <t> 0x75 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
base64 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t>
</tr> if dst s>= imm goto +offset
<tr> </t>
<td> </td>
<t> <td>
0x5c <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0 <td>
</t> <t> 0x76 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
0x00 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
dst = (u32)(dst &amp; src) <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> if (s32)dst s>= (s32)imm goto +offset
base32 </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t>
</td> RFC 9669,
</tr> <xref target="jump-instructions"/>
<tr> </t>
<td> </td>
<t> </tr>
0x5d <tr>
</t> <td>
</td> <t> 0x77 </t>
<td> </td>
<t> <td>
any <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> dst &gt;&gt;= imm </t>
0x00 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
if dst != src goto +offset <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
base64 </tr>
</t> <tr>
</td> <td>
<td> <t> 0x79 </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> any </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0x5e <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> dst = *(u64 *)(src + offset)
any </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
any <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="load-and-store-instructions"/>
<t> </t>
0x00 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x7a </t>
if (u32)dst != (u32)src goto +offset </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
base32 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t>
</td> *(u64 *)(dst + offset) = imm
</tr> </t>
<tr> </td>
<td> <td>
<t> <t> base64 </t>
0x5f </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="load-and-store-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
0 <t> 0x7b </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0x00 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
dst &amp;= src </td>
</t> <td>
</td> <t>
<td> *(u64 *)(dst + offset) = src
<t> </t>
base64 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="load-and-store-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x61 <td>
</t> <t> 0x7c </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
any <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> dst = (u32)(dst &gt;&gt; src) </t>
<t> </td>
0x00 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
dst = *(u32 *)(src + offset) RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base32 <tr>
</t> <td>
</td> <t> 0x7d </t>
<td> </td>
<t> <td>
<xref target="load-and-store-instructions">Load and store instructions</ <t> any </t>
xref> </td>
</t> <td>
</td> <t> any </t>
</tr> </td>
<tr> <td>
<td> <t> 0x00 </t>
<t> </td>
0x62 <td>
</t> <t>
</td> if dst s>= src goto +offset
<td> </t>
<t> </td>
0x0 <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x7e </t>
<td> </td>
<t> <td>
*(u32 *)(dst + offset) = imm <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base32 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions</ if (s32)dst s>= (s32)src goto +offset
xref> </t>
</t> </td>
</td> <td>
</tr> <t> base32 </t>
<tr> </td>
<td> <td>
<t> <t>
0x63 RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x7f </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
0x00 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst &gt;&gt;= src </t>
*(u32 *)(dst + offset) = src </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
base32 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
<xref target="load-and-store-instructions">Load and store instructions</ </tr>
xref> <tr>
</t> <td>
</td> <t> 0x84 </t>
</tr> </td>
<tr> <td>
<td> <t> 0x0 </t>
<t> </td>
0x64 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
0x0 </td>
</t> <td>
</td> <t> dst = (u32)-dst </t>
<td> </td>
<t> <td>
0 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = (u32)(dst &lt;&lt; imm) <td>
</t> <t> 0x85 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
base32 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> call helper function by static ID
<td> </t>
<t> </td>
0x65 <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 RFC 9669,
</t> <xref target="helper-functions"/>
</td> </t>
<td> </td>
<t> </tr>
any <tr>
</t> <td>
</td> <t> 0x85 </t>
<td> </td>
<t> <td>
any <t> 0x1 </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
if dst s&gt; imm goto +offset <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> call PC += imm </t>
base64 </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="program-local-functions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x66 <td>
</t> <t> 0x85 </t>
</td> </td>
<td> <td>
<t> <t> 0x2 </t>
0x0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> call helper function by BTF ID
any </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
if (s32)dst s&gt; (s32)imm goto +offset <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="helper-functions"/>
<t> </t>
base32 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x87 </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> 0x0 </t>
</tr> </td>
<tr> <td>
<td> <t> 0 </t>
<t> </td>
0x67 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst = -dst </t>
0x0 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
0 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0x94 </t>
<t> </td>
dst &lt;&lt;= imm <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
base64 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> dst = (u32)((imm != 0)?((u32)dst % (u32)imm) : dst)
</td> </t>
</tr> </td>
<tr> <td>
<td> <t> divmul32 </t>
<t> </td>
0x69 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
any </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x94 </t>
any </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
0x00 <t> 1 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = *(u16 *)(src + offset) <td>
</t> <t>
</td> dst = (u32)((imm != 0) ? ((s32)dst s% imm) : dst)
<td> </t>
<t> </td>
base32 <td>
</t> <t> divmul32 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions</ RFC 9669,
xref> <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0x95 </t>
0x6a </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
0x0 <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
any <td>
</t> <t> return </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
*(u16 *)(dst + offset) = imm </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
base32 <t> 0x97 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
<xref target="load-and-store-instructions">Load and store instructions</ <td>
xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t>
0x6b dst = (imm != 0) ? (dst % (u32)imm) : dst
</t> </t>
</td> </td>
<td> <td>
<t> <t> divmul64 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
0x00 <t> 0x97 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
*(u16 *)(dst + offset) = src <td>
</t> <t> 1 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base32 </td>
</t> <td>
</td> <t>
<td> dst = (imm != 0) ? (dst s% imm) : dst
<t> </t>
<xref target="load-and-store-instructions">Load and store instructions</ </td>
xref> <td>
</t> <t> divmul64 </t>
</td> </td>
</tr> <td>
<tr> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
0x6c </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
any <t> 0x9c </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t> 0 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
0x00 </td>
</t> <td>
</td> <t>
<td> dst = (u32)((src != 0)?((u32)dst % (u32)src) : dst)
<t> </t>
dst = (u32)(dst &lt;&lt; src) </td>
</t> <td>
</td> <t> divmul32 </t>
<td> </td>
<t> <td>
base32 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </tr>
</t> <tr>
</td> <td>
</tr> <t> 0x9c </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0x6d </td>
</t> <td>
</td> <t> 1 </t>
<td> </td>
<t> <td>
any <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> dst = (u32)((src != 0)?((s32)dst s% (s32)src) :dst)
any </t>
</t> </td>
</td> <td>
<td> <t> divmul32 </t>
<t> </td>
0x00 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
if dst s&gt; src goto +offset </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0x9f </t>
base64 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> 0x00 </t>
<tr> </td>
<td> <td>
<t> <t>
0x6e dst = (src != 0) ? (dst % src) : dst
</t> </t>
</td> </td>
<td> <td>
<t> <t> divmul64 </t>
any </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
0x00 <t> 0x9f </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
if (s32)dst s&gt; (s32)src goto +offset <td>
</t> <t> 1 </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
base32 </td>
</t> <td>
</td> <t>
<td> dst = (src != 0) ? (dst s% src) : dst
<t> </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> divmul64 </t>
</tr> </td>
<tr> <td>
<td> <t>
<t> RFC 9669,
0x6f <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0xa4 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0x00 <t> any </t>
</t> </td>
</td> <td>
<td> <t> dst = (u32)(dst ^ imm) </t>
<t> </td>
dst &lt;&lt;= src <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
base64 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <tr>
</t> <td>
</td> <t> 0xa5 </t>
</tr> </td>
<tr> <td>
<td> <t> 0x0 </t>
<t> </td>
0x71 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> if dst &lt; imm goto +offset </t>
<td> </td>
<t> <td>
any <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x00 <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = *(u8 *)(src + offset) <td>
</t> <t> 0xa6 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
base32 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="load-and-store-instructions">Load and store instructions</ <t> any </t>
xref> </td>
</t> <td>
</td> <t>
</tr> if (u32)dst &lt; imm goto +offset
<tr> </t>
<td> </td>
<t> <td>
0x72 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x0 <xref target="jump-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0xa7 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
*(u8 *)(dst + offset) = imm <t> any </t>
</t> </td>
</td> <td>
<td> <t> dst ^= imm </t>
<t> </td>
base32 <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="load-and-store-instructions">Load and store instructions</ RFC 9669,
xref> <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0xac </t>
0x73 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
any <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
any <td>
</t> <t> dst = (u32)(dst ^ src) </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
0x00 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
*(u8 *)(dst + offset) = src </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
base32 <t> 0xad </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="load-and-store-instructions">Load and store instructions</ <td>
xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t> 0x00 </t>
<tr> </td>
<td> <td>
<t> <t> if dst &lt; src goto +offset </t>
0x74 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
0x0 <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
0 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xae </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
dst = (u32)(dst &gt;&gt; imm) </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
base32 <t>
</t> if (u32)dst &lt; (u32)src goto +offset
</td> </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> base32 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> RFC 9669,
<td> <xref target="jump-instructions"/>
<t> </t>
0x75 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xaf </t>
0x0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
any <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> 0x00 </t>
<t> </td>
any <td>
</t> <t> dst ^= src </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
if dst s&gt;= imm goto +offset </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
base64 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0xb4 </t>
</t> </td>
</td> <td>
</tr> <t> 0x0 </t>
<tr> </td>
<td> <td>
<t> <t> 0 </t>
0x76 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0x0 <t> dst = (u32) imm </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
any <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
any </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xb5 </t>
if (s32)dst s&gt;= (s32)imm goto +offset </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
base32 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> if dst &lt;= imm goto +offset </t>
</td> </td>
</tr> <td>
<tr> <t> base64 </t>
<td> </td>
<t> <td>
0x77 <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
0x0 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xb6 </t>
<t> </td>
0 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
dst &gt;&gt;= imm <t>
</t> if (u32)dst &lt;= imm goto +offset
</td> </t>
<td> </td>
<t> <td>
base64 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <xref target="jump-instructions"/>
</t> </t>
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<t> <t> 0xb7 </t>
0x79 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
any <t> 0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> dst = imm </t>
</td> </td>
<td> <td>
<t> <t> base64 </t>
0x00 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="arithmetic-instructions"/>
dst = *(u64 *)(src + offset) </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
base64 <t> 0xbc </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="load-and-store-instructions">Load and store instructions</ <td>
xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> 0x00 </t>
<tr> </td>
<td> <td>
<t> <t> dst = (u32) src </t>
0x7a </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
0x0 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0xbc </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 8 </t>
*(u64 *)(dst + offset) = imm </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
base64 <t> dst = (u32) (s32) (s8) src </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
<xref target="load-and-store-instructions">Load and store instructions</ <td>
xref> <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x7b <td>
</t> <t> 0xbc </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> 16 </t>
<td> </td>
<t> <td>
any <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> dst = (u32) (s32) (s16) src
0x00 </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
*(u64 *)(dst + offset) = src <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
base64 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xbd </t>
<xref target="load-and-store-instructions">Load and store instructions</ </td>
xref> <td>
</t> <t> any </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0x7c <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> if dst &lt;= src goto +offset </t>
<t> </td>
any <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
0 RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0x00 <tr>
</t> <td>
</td> <t> 0xbe </t>
<td> </td>
<t> <td>
dst = (u32)(dst &gt;&gt; src) <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base32 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> if (u32)dst &lt;= (u32)src goto +offset
</t> </t>
</td> </td>
</tr> <td>
<tr> <t> base32 </t>
<td> </td>
<t> <td>
0x7d <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0xbf </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
0x00 </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
if dst s&gt;= src goto +offset <t> dst = src </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
base64 <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="arithmetic-instructions"/>
<t> </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> </tr>
</td> <tr>
</tr> <td>
<tr> <t> 0xbf </t>
<td> </td>
<t> <td>
0x7e <t> any </t>
</t> </td>
</td> <td>
<td> <t> 8 </t>
<t> </td>
any <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst = (s64) (s8) src </t>
any </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
0x00 <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
<td> </t>
<t> </td>
if (s32)dst s&gt;= (s32)src goto +offset </tr>
</t> <tr>
</td> <td>
<td> <t> 0xbf </t>
<t> </td>
base32 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 16 </t>
<xref target="jump-instructions">Jump instructions</xref> </td>
</t> <td>
</td> <t> 0x00 </t>
</tr> </td>
<tr> <td>
<td> <t> dst = (s64) (s16) src </t>
<t> </td>
0x7f <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0 <tr>
</t> <td>
</td> <t> 0xbf </t>
<td> </td>
<t> <td>
0x00 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 32 </t>
<t> </td>
dst &gt;&gt;= src <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst = (s64) (s32) src </t>
base64 </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="arithmetic-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0x84 <td>
</t> <t> 0xc3 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0x0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t>
<t> lock *(u32 *)(dst + offset) += src
0x00 </t>
</t> </td>
</td> <td>
<td> <t> atomic32 </t>
<t> </td>
dst = (u32)-dst <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="atomic-operations"/>
<t> </t>
base32 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xc3 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> any </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x85 <td>
</t> <t> 0x01 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 src = atomic_fetch_add_32((u32 *)(dst + offset), src)
</t> </t>
</td> </td>
<td> <td>
<t> <t> atomic32 </t>
0 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="atomic-operations"/>
any </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
call helper function by static ID <t> 0xc3 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
base32 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x40 </t>
<xref target="helper-functions">Helper functions</xref> </td>
</t> <td>
</td> <t>
</tr> lock *(u32 *)(dst + offset) |= src
<tr> </t>
<td> </td>
<t> <td>
0x85 <t> atomic32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x1 <xref target="atomic-operations"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0 <td>
</t> <t> 0xc3 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
any </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
call PC += imm <t> 0x41 </t>
</t> </td>
</td> <td>
<td> <t>
<t> src = atomic_fetch_or_32((u32 *)(dst + offset), src)
base32 </t>
</t> </td>
</td> <td>
<td> <t> atomic32 </t>
<t> </td>
<xref target="program-local-functions">Program-local functions</xref> <td>
</t> <t>
</td> RFC 9669,
</tr> <xref target="atomic-operations"/>
<tr> </t>
<td> </td>
<t> </tr>
0x85 <tr>
</t> <td>
</td> <t> 0xc3 </t>
<td> </td>
<t> <td>
0x2 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
0 <td>
</t> <t> 0x50 </t>
</td> </td>
<td> <td>
<t> <t>
any lock *(u32 *)(dst + offset) &amp;= src
</t> </t>
</td> </td>
<td> <td>
<t> <t> atomic32 </t>
call helper function by BTF ID </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="atomic-operations"/>
base32 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
<xref target="helper-functions">Helper functions</xref> <t> 0xc3 </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0x87 </td>
</t> <td>
</td> <t> 0x51 </t>
<td> </td>
<t> <td>
0x0 <t>
</t> src = atomic_fetch_and_32((u32 *)(dst + offset), src)
</td> </t>
<td> </td>
<t> <td>
0 <t> atomic32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x00 <xref target="atomic-operations"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
dst = -dst <td>
</t> <t> 0xc3 </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base64 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0xa0 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> lock *(u32 *)(dst + offset) ^= src
<td> </t>
<t> </td>
0x94 <td>
</t> <t> atomic32 </t>
</td> </td>
<td> <td>
<t> <t>
0x0 RFC 9669,
</t> <xref target="atomic-operations"/>
</td> </t>
<td> </td>
<t> </tr>
0 <tr>
</t> <td>
</td> <t> 0xc3 </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst = (u32)((imm != 0)?((u32)dst % (u32)imm) : dst) <td>
</t> <t> 0xa1 </t>
</td> </td>
<td> <td>
<t> <t>
divmul32 src = atomic_fetch_xor_32((u32 *)(dst + offset), src)
</t> </t>
</td> </td>
<td> <td>
<t> <t> atomic32 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t>
</tr> RFC 9669,
<tr> <xref target="atomic-operations"/>
<td> </t>
<t> </td>
0x94 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xc3 </t>
<t> </td>
0x0 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
1 </td>
</t> <td>
</td> <t> 0xe1 </t>
<td> </td>
<t> <td>
any <t>
</t> src = xchg_32((u32 *)(dst + offset), src)
</td> </t>
<td> </td>
<t> <td>
dst = (u32)((imm != 0) ? ((s32)dst s% imm) : dst) <t> atomic32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
divmul32 <xref target="atomic-operations"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> 0xc3 </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0x95 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0xf1 </t>
<t> </td>
0x0 <td>
</t> <t>
</td> r0 = cmpxchg_32((u32 *)(dst + offset), r0, src)
<td> </t>
<t> </td>
0 <td>
</t> <t> atomic32 </t>
</td> </td>
<td> <td>
<t> <t>
0x00 RFC 9669,
</t> <xref target="atomic-operations"/>
</td> </t>
<td> </td>
<t> </tr>
return <tr>
</t> <td>
</td> <t> 0xc4 </t>
<td> </td>
<t> <td>
base32 <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> any </t>
</td> </td>
</tr> <td>
<tr> <t> dst = (u32)(dst s&gt;&gt; imm) </t>
<td> </td>
<t> <td>
0x97 <t> base32 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x0 <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
0 <td>
</t> <t> 0xc5 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
dst = (imm != 0) ? (dst % (u32)imm) : dst <t> any </t>
</t> </td>
</td> <td>
<td> <t> if dst s&lt; imm goto +offset </t>
<t> </td>
divmul64 <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
</tr> </td>
<tr> </tr>
<td> <tr>
<t> <td>
0x97 <t> 0xc6 </t>
</t> </td>
</td> <td>
<td> <t> 0x0 </t>
<t> </td>
0x0 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
1 </td>
</t> <td>
</td> <t>
<td> if (s32)dst s&lt; (s32)imm goto +offset
<t> </t>
any </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
dst = (imm != 0) ? (dst s% imm) : dst <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
divmul64 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xc7 </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> 0x0 </t>
</td> </td>
</tr> <td>
<tr> <t> 0 </t>
<td> </td>
<t> <td>
0x9c <t> any </t>
</t> </td>
</td> <td>
<td> <t> dst s&gt;&gt;= imm </t>
<t> </td>
any <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
0 RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0x00 <tr>
</t> <td>
</td> <t> 0xcc </t>
<td> </td>
<t> <td>
dst = (u32)((src != 0)?((u32)dst % (u32)src) : dst) <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
divmul32 <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t> dst = (u32)(dst s&gt;&gt; src) </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> base32 </t>
</tr> </td>
<tr> <td>
<td> <t>
<t> RFC 9669,
0x9c <xref target="arithmetic-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0xcd </t>
</td> </td>
<td> <td>
<t> <t> any </t>
1 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0x00 <t> 0x00 </t>
</t> </td>
</td> <td>
<td> <t> if dst s&lt; src goto +offset </t>
<t> </td>
dst = (u32)((src != 0)?((s32)dst s% (s32)src) :dst) <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
divmul32 RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <tr>
</t> <td>
</td> <t> 0xce </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0x9f <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0x00 </t>
any </td>
</t> <td>
</td> <t>
<td> if (s32)dst s&lt; (s32)src goto +offset
<t> </t>
0 </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
0x00 <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
dst = (src != 0) ? (dst % src) : dst </tr>
</t> <tr>
</td> <td>
<td> <t> 0xcf </t>
<t> </td>
divmul64 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> 0x00 </t>
</tr> </td>
<tr> <td>
<td> <t> dst s&gt;&gt;= src </t>
<t> </td>
0x9f <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="arithmetic-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
1 <tr>
</t> <td>
</td> <t> 0xd4 </t>
<td> </td>
<t> <td>
0x00 <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
dst = (src != 0) ? (dst s% src) : dst <td>
</t> <t> 0x10 </t>
</td> </td>
<td> <td>
<t> <t> dst = htole16(dst) </t>
divmul64 </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="byte-swap-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0xa4 <td>
</t> <t> 0xd4 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
0x0 </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
0 <t> 0x20 </t>
</t> </td>
</td> <td>
<td> <t> dst = htole32(dst) </t>
<t> </td>
any <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
dst = (u32)(dst ^ imm) RFC 9669,
</t> <xref target="byte-swap-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base32 <tr>
</t> <td>
</td> <t> 0xd4 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0x0 </t>
</t> </td>
</td> <td>
</tr> <t> 0 </t>
<tr> </td>
<td> <td>
<t> <t> 0x40 </t>
0xa5 </td>
</t> <td>
</td> <t> dst = htole64(dst) </t>
<td> </td>
<t> <td>
0x0 <t> base64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
any <xref target="byte-swap-instructions"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
any <td>
</t> <t> 0xd5 </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
if dst &lt; imm goto +offset </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
base64 <t> any </t>
</t> </td>
</td> <td>
<td> <t>
<t> if dst s&lt;= imm goto +offset
<xref target="jump-instructions">Jump instructions</xref> </t>
</t> </td>
</td> <td>
</tr> <t> base64 </t>
<tr> </td>
<td> <td>
<t> <t>
0xa6 RFC 9669,
</t> <xref target="jump-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
0x0 <tr>
</t> <td>
</td> <t> 0xd6 </t>
<td> </td>
<t> <td>
any <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t>
if (u32)dst &lt; imm goto +offset if (s32)dst s&lt;= (s32)imm goto +offset
</t> </t>
</td> </td>
<td> <td>
<t> <t> base32 </t>
base32 </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="jump-instructions"/>
<xref target="jump-instructions">Jump instructions</xref> </t>
</t> </td>
</td> </tr>
</tr> <tr>
<tr> <td>
<td> <t> 0xd7 </t>
<t> </td>
0xa7 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
0x0 </td>
</t> <td>
</td> <t> 0x10 </t>
<td> </td>
<t> <td>
0 <t> dst = bswap16(dst) </t>
</t> </td>
</td> <td>
<td> <t> base32 </t>
<t> </td>
any <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="byte-swap-instructions"/>
<t> </t>
dst ^= imm </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xd7 </t>
base64 </td>
</t> <td>
</td> <t> 0x0 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> 0 </t>
</t> </td>
</td> <td>
</tr> <t> 0x20 </t>
<tr> </td>
<td> <td>
<t> <t> dst = bswap32(dst) </t>
0xac </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
any <t>
</t> RFC 9669,
</td> <xref target="byte-swap-instructions"/>
<td> </t>
<t> </td>
0 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xd7 </t>
<t> </td>
0x00 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
dst = (u32)(dst ^ src) </td>
</t> <td>
</td> <t> 0x40 </t>
<td> </td>
<t> <td>
base32 <t> dst = bswap64(dst) </t>
</t> </td>
</td> <td>
<td> <t> base64 </t>
<t> </td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t>
</td> RFC 9669,
</tr> <xref target="byte-swap-instructions"/>
<tr> </t>
<td> </td>
<t> </tr>
0xad <tr>
</t> <td>
</td> <t> 0xdb </t>
<td> </td>
<t> <td>
any <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
any <td>
</t> <t> 0x00 </t>
</td> </td>
<td> <td>
<t> <t>
0x00 lock *(u64 *)(dst + offset) += src
</t> </t>
</td> </td>
<td> <td>
<t> <t> atomic64 </t>
if dst &lt; src goto +offset </td>
</t> <td>
</td> <t>
<td> RFC 9669,
<t> <xref target="atomic-operations"/>
base64 </t>
</t> </td>
</td> </tr>
<td> <tr>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0xdb </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t> any </t>
0xae </td>
</t> <td>
</td> <t> 0x01 </t>
<td> </td>
<t> <td>
any <t>
</t> src = atomic_fetch_add_64((u64 *)(dst + offset), src)
</td> </t>
<td> </td>
<t> <td>
any <t> atomic64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
0x00 <xref target="atomic-operations"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
if (u32)dst &lt; (u32)src goto +offset <td>
</t> <t> 0xdb </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base32 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> 0x40 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> lock *(u64 *)(dst + offset) |= src
<td> </t>
<t> </td>
0xaf <td>
</t> <t> atomic64 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="atomic-operations"/>
</td> </t>
<td> </td>
<t> </tr>
0 <tr>
</t> <td>
</td> <t> 0xdb </t>
<td> </td>
<t> <td>
0x00 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
dst ^= src <td>
</t> <t> 0x41 </t>
</td> </td>
<td> <td>
<t> <t>
base64 src = atomic_fetch_or_64((u64 *)(dst + offset), src)
</t> </t>
</td> </td>
<td> <td>
<t> <t> atomic64 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t>
</tr> RFC 9669,
<tr> <xref target="atomic-operations"/>
<td> </t>
<t> </td>
0xb4 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xdb </t>
<t> </td>
0x0 <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
0 </td>
</t> <td>
</td> <t> 0x50 </t>
<td> </td>
<t> <td>
any <t>
</t> lock *(u64 *)(dst + offset) &amp;= src
</td> </t>
<td> </td>
<t> <td>
dst = (u32) imm <t> atomic64 </t>
</t> </td>
</td> <td>
<td> <t>
<t> RFC 9669,
base32 <xref target="atomic-operations"/>
</t> </t>
</td> </td>
<td> </tr>
<t> <tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <td>
</t> <t> 0xdb </t>
</td> </td>
</tr> <td>
<tr> <t> any </t>
<td> </td>
<t> <td>
0xb5 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0x51 </t>
<t> </td>
0x0 <td>
</t> <t>
</td> src = atomic_fetch_and_64((u64 *)(dst + offset), src)
<td> </t>
<t> </td>
any <td>
</t> <t> atomic64 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="atomic-operations"/>
</td> </t>
<td> </td>
<t> </tr>
if dst &lt;= imm goto +offset <tr>
</t> <td>
</td> <t> 0xdb </t>
<td> </td>
<t> <td>
base64 <t> any </t>
</t> </td>
</td> <td>
<td> <t> any </t>
<t> </td>
<xref target="jump-instructions">Jump instructions</xref> <td>
</t> <t> 0xa0 </t>
</td> </td>
</tr> <td>
<tr> <t>
<td> lock *(u64 *)(dst + offset) ^= src
<t> </t>
0xb6 </td>
</t> <td>
</td> <t> atomic64 </t>
<td> </td>
<t> <td>
0x0 <t>
</t> RFC 9669,
</td> <xref target="atomic-operations"/>
<td> </t>
<t> </td>
any </tr>
</t> <tr>
</td> <td>
<td> <t> 0xdb </t>
<t> </td>
any <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
if (u32)dst &lt;= imm goto +offset </td>
</t> <td>
</td> <t> 0xa1 </t>
<td> </td>
<t> <td>
base32 <t>
</t> src = atomic_fetch_xor_64((u64 *)(dst + offset), src)
</td> </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t> atomic64 </t>
</t> </td>
</td> <td>
</tr> <t>
<tr> RFC 9669,
<td> <xref target="atomic-operations"/>
<t> </t>
0xb7 </td>
</t> </tr>
</td> <tr>
<td> <td>
<t> <t> 0xdb </t>
0x0 </td>
</t> <td>
</td> <t> any </t>
<td> </td>
<t> <td>
0 <t> any </t>
</t> </td>
</td> <td>
<td> <t> 0xe1 </t>
<t> </td>
any <td>
</t> <t>
</td> src = xchg_64((u64 *)(dst + offset), src)
<td> </t>
<t> </td>
dst = imm <td>
</t> <t> atomic64 </t>
</td> </td>
<td> <td>
<t> <t>
base64 RFC 9669,
</t> <xref target="atomic-operations"/>
</td> </t>
<td> </td>
<t> </tr>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <tr>
</t> <td>
</td> <t> 0xdb </t>
</tr> </td>
<tr> <td>
<td> <t> any </t>
<t> </td>
0xbc <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> 0xf1 </t>
any </td>
</t> <td>
</td> <t>
<td> r0 = cmpxchg_64((u64 *)(dst + offset), r0, src)
<t> </t>
0 </td>
</t> <td>
</td> <t> atomic64 </t>
<td> </td>
<t> <td>
0x00 <t>
</t> RFC 9669,
</td> <xref target="atomic-operations"/>
<td> </t>
<t> </td>
dst = (u32) src </tr>
</t> <tr>
</td> <td>
<td> <t> 0xdc </t>
<t> </td>
base32 <td>
</t> <t> 0x0 </t>
</td> </td>
<td> <td>
<t> <t> 0 </t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> </td>
</t> <td>
</td> <t> 0x10 </t>
</tr> </td>
<tr> <td>
<td> <t> dst = htobe16(dst) </t>
<t> </td>
0xbc <td>
</t> <t> base32 </t>
</td> </td>
<td> <td>
<t> <t>
any RFC 9669,
</t> <xref target="byte-swap-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
8 <tr>
</t> <td>
</td> <t> 0xdc </t>
<td> </td>
<t> <td>
0x00 <t> 0x0 </t>
</t> </td>
</td> <td>
<td> <t> 0 </t>
<t> </td>
dst = (u32) (s32) (s8) src <td>
</t> <t> 0x20 </t>
</td> </td>
<td> <td>
<t> <t> dst = htobe32(dst) </t>
base32 </td>
</t> <td>
</td> <t> base32 </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t>
</t> RFC 9669,
</td> <xref target="byte-swap-instructions"/>
</tr> </t>
<tr> </td>
<td> </tr>
<t> <tr>
0xbc <td>
</t> <t> 0xdc </t>
</td> </td>
<td> <td>
<t> <t> 0x0 </t>
any </td>
</t> <td>
</td> <t> 0 </t>
<td> </td>
<t> <td>
16 <t> 0x40 </t>
</t> </td>
</td> <td>
<td> <t> dst = htobe64(dst) </t>
<t> </td>
0x00 <td>
</t> <t> base64 </t>
</td> </td>
<td> <td>
<t> <t>
dst = (u32) (s32) (s16) src RFC 9669,
</t> <xref target="byte-swap-instructions"/>
</td> </t>
<td> </td>
<t> </tr>
base32 <tr>
</t> <td>
</td> <t> 0xdd </t>
<td> </td>
<t> <td>
<xref target="arithmetic-instructions">Arithmetic instructions</xref> <t> any </t>
</t> </td>
</td> <td>
</tr> <t> any </t>
<tr> </td>
<td> <td>
<t> <t> 0x00 </t>
0xbd </td>
</t> <td>
</td> <t>
<td> if dst s&lt;= src goto +offset
<t> </t>
any </td>
</t> <td>
</td> <t> base64 </t>
<td> </td>
<t> <td>
any <t>
</t> RFC 9669,
</td> <xref target="jump-instructions"/>
<td> </t>
<t> </td>
0x00 </tr>
</t> <tr>
</td> <td>
<td> <t> 0xde </t>
<t> </td>
if dst &lt;= src goto +offset <td>
</t> <t> any </t>
</td> </td>
<td> <td>
<t> <t> any </t>
base64 </td>
</t> <td>
</td> <t> 0x00 </t>
<td> </td>
<t> <td>
<xref target="jump-instructions">Jump instructions</xref> <t>
</t> if (s32)dst s&lt;= (s32)src goto +offset
</td> </t>
</tr> </td>
<tr> <td>
<td> <t> base32 </t>
<t> </td>
0xbe <td>
</t> <t>
</td> RFC 9669,
<td> <xref target="jump-instructions"/>
<t> </t>
any </td>
</t> </tr>
</td> </tbody>
<td> </table>
<t> </section>
any <section anchor="acknowledgements" numbered="false">
</t> <name>Acknowledgements</name>
</td> <t>
<td> This document was generated from instruction-set.rst in the Linux
<t> kernel repository, to which a number of other individuals have authored cont
0x00 ributions
</t> over time, including <contact fullname="Akhil Raj"/>, <contact fullname="Ale
</td> xei Starovoitov"/>, <contact fullname="Brendan Jackman"/>, <contact fullname="Ch
<td> ristoph Hellwig"/>, <contact fullname="Daniel Borkmann"/>,
<t> <contact fullname="Ilya Leoshkevich"/>, <contact fullname="Jiong Wang"/>, <c
if (u32)dst &lt;= (u32)src goto +offset ontact fullname="Jose E.&nbsp;Marchesi"/>, <contact fullname="Kosuke Fujimoto"/>
</t> ,
</td> <contact fullname="Shahab Vahedi"/>, <contact fullname="Tiezhu Yang"/>, <con
<td> tact fullname="Will Hawkins"/>, and <contact fullname="Zheng Yejian"/>, with rev
<t> iew and suggestions by many others including
base32 <contact fullname="Alan Jowett"/>, <contact fullname="Andrii Nakryiko"/>, <c
</t> ontact fullname="David Vernet"/>, <contact fullname="Jim Harris"/>,
</td> <contact fullname="Quentin Monnet"/>, <contact fullname="Song Liu"/>, <conta
<td> ct fullname="Shung-Hsi Yu"/>, <contact fullname="Stanislav Fomichev"/>, <contact
<t> fullname="Watson Ladd"/>, and <contact fullname="Yonghong Song"/>.
<xref target="jump-instructions">Jump instructions</xref> </t>
</t> </section>
</td>
</tr> </back>
<tr>
<td>
<t>
0xbf
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst = src
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xbf
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
8
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst = (s64) (s8) src
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xbf
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
16
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst = (s64) (s16) src
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xbf
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
32
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst = (s64) (s32) src
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
lock *(u32 *)(dst + offset) += src
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x01
</t>
</td>
<td>
<t>
src = atomic_fetch_add_32((u32 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x40
</t>
</td>
<td>
<t>
lock *(u32 *)(dst + offset) |= src
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x41
</t>
</td>
<td>
<t>
src = atomic_fetch_or_32((u32 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x50
</t>
</td>
<td>
<t>
lock *(u32 *)(dst + offset) &amp;= src
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x51
</t>
</td>
<td>
<t>
src = atomic_fetch_and_32((u32 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xa0
</t>
</td>
<td>
<t>
lock *(u32 *)(dst + offset) ^= src
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xa1
</t>
</td>
<td>
<t>
src = atomic_fetch_xor_32((u32 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xe1
</t>
</td>
<td>
<t>
src = xchg_32((u32 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc3
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xf1
</t>
</td>
<td>
<t>
r0 = cmpxchg_32((u32 *)(dst + offset), r0, src)
</t>
</td>
<td>
<t>
atomic32
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc4
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
dst = (u32)(dst s&gt;&gt; imm)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc5
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
if dst s&lt; imm goto +offset
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc6
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
if (s32)dst s&lt; (s32)imm goto +offset
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xc7
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
dst s&gt;&gt;= imm
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xcc
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst = (u32)(dst s&gt;&gt; src)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xcd
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
if dst s&lt; src goto +offset
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xce
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
if (s32)dst s&lt; (s32)src goto +offset
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xcf
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
dst s&gt;&gt;= src
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="arithmetic-instructions">Arithmetic instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd4
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x10
</t>
</td>
<td>
<t>
dst = htole16(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd4
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x20
</t>
</td>
<td>
<t>
dst = htole32(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd4
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x40
</t>
</td>
<td>
<t>
dst = htole64(dst)
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd5
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
if dst s&lt;= imm goto +offset
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd6
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
if (s32)dst s&lt;= (s32)imm goto +offset
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd7
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x10
</t>
</td>
<td>
<t>
dst = bswap16(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd7
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x20
</t>
</td>
<td>
<t>
dst = bswap32(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xd7
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x40
</t>
</td>
<td>
<t>
dst = bswap64(dst)
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
lock *(u64 *)(dst + offset) += src
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x01
</t>
</td>
<td>
<t>
src = atomic_fetch_add_64((u64 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x40
</t>
</td>
<td>
<t>
lock *(u64 *)(dst + offset) |= src
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x41
</t>
</td>
<td>
<t>
src = atomic_fetch_or_64((u64 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x50
</t>
</td>
<td>
<t>
lock *(u64 *)(dst + offset) &amp;= src
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x51
</t>
</td>
<td>
<t>
src = atomic_fetch_and_64((u64 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xa0
</t>
</td>
<td>
<t>
lock *(u64 *)(dst + offset) ^= src
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xa1
</t>
</td>
<td>
<t>
src = atomic_fetch_xor_64((u64 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xe1
</t>
</td>
<td>
<t>
src = xchg_64((u64 *)(dst + offset), src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdb
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0xf1
</t>
</td>
<td>
<t>
r0 = cmpxchg_64((u64 *)(dst + offset), r0, src)
</t>
</td>
<td>
<t>
atomic64
</t>
</td>
<td>
<t>
<xref target="atomic-operations">Atomic operations</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdc
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x10
</t>
</td>
<td>
<t>
dst = htobe16(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdc
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x20
</t>
</td>
<td>
<t>
dst = htobe32(dst)
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdc
</t>
</td>
<td>
<t>
0x0
</t>
</td>
<td>
<t>
0
</t>
</td>
<td>
<t>
0x40
</t>
</td>
<td>
<t>
dst = htobe64(dst)
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="byte-swap-instructions">Byte swap instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xdd
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
if dst s&lt;= src goto +offset
</t>
</td>
<td>
<t>
base64
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
<tr>
<td>
<t>
0xde
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
any
</t>
</td>
<td>
<t>
0x00
</t>
</td>
<td>
<t>
if (s32)dst s&lt;= (s32)src goto +offset
</t>
</td>
<td>
<t>
base32
</t>
</td>
<td>
<t>
<xref target="jump-instructions">Jump instructions</xref>
</t>
</td>
</tr>
</tbody>
</table>
</section>
</middle>
<back>
<references><name>Normative References</name>
<reference anchor="IEN137">
<front>
<title>On Holy Wars and a Plea for Peace</title>
<author fullname="D. Cohen" initials="D." surname="Cohen"/>
<date month="April" year="1980"/>
</front>
<seriesInfo name='IEN' value='137'/>
</reference>
<reference anchor="RFC2119">
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname="S. Bradner" initials="S." surname="Bradner"/>
<date month="March" year="1997"/>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>
<reference anchor="RFC8126">
<front>
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
<author fullname="M. Cotton" initials="M." surname="Cotton"/>
<author fullname="B. Leiba" initials="B." surname="Leiba"/>
<author fullname="T. Narten" initials="T." surname="Narten"/>
<date month="June" year="2017"/>
</front>
<seriesInfo name='BCP' value='26'/>
<seriesInfo name='RFC' value='8126'/>
<seriesInfo name='DOI' value='10.17487/RFC8126'/>
</reference>
<reference anchor="RFC8174">
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname="B. Leiba" initials="B." surname="Leiba"/>
<date month="May" year="2017"/>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='8174'/>
<seriesInfo name='DOI' value='10.17487/RFC8174'/>
</reference>
</references>
<references><name>Informative References</name>
<reference anchor="LINUX" target="https://www.kernel.org/doc/html/latest/bpf/v
erifier.html">
<front>
<title>eBPF verifier</title>
<author/>
</front>
</reference>
<reference anchor="PREVAIL">
<front>
<title>Simple and Precise Static Analysis of Untrusted Linux Kernel Extensio
ns</title>
<author fullname="E. Gershuni" initials="E." surname="Gershuni"/>
<author fullname="N. Amit" initials="N." surname="Amit"/>
<author fullname="A. Gurfinkel" initials="A." surname="Gurfinkel"/>
<author fullname="N. Narodytska" initials="N." surname="Narodytska"/>
<author fullname="J. Navas" initials="J." surname="Navas"/>
<author fullname="N. Rinetzky" initials="N." surname="Rinetzky"/>
<author fullname="L. Ryzhyk" initials="L." surname="Ryzhyk"/>
<author fullname="M. Sagiv" initials="M." surname="Sagiv"/>
<date month="June" year="2019"/>
</front>
<seriesInfo name='DOI' value='10.1145/3314221.3314590'/>
</reference>
</references>
</back>
</rfc> </rfc>
 End of changes. 554 change blocks. 
9364 lines changed or deleted 7618 lines changed or added

This html diff was produced by rfcdiff 1.48.