@c Copyright (C) 2019 Free Software Foundation, Inc. @c This is part of the GAS manual. @c For copying conditions, see the file as.texinfo. @ifset GENERIC @page @node BPF-Dependent @chapter BPF Dependent Features @end ifset @ifclear GENERIC @node Machine Dependencies @chapter BPF Dependent Features @end ifclear @cindex BPF support @menu * BPF Options:: Options * BPF Syntax:: Syntax * BPF Directives:: Machine Directives * BPF Opcodes:: Opcodes @end menu @node BPF Options @section Options @cindex BPF options (none) @cindex options for BPF (none) @c man begin OPTIONS @table @gcctabopt @cindex @option{-EB} command-line option, BPF @item -EB This option specifies that the assembler should emit big-endian eBPF. @cindex @option{-EL} command-line option, BPF @item -EL This option specifies that the assembler should emit little-endian eBPF. @end table Note that if no endianness option is specified in the command line, the host endianness is used. @c man end @node BPF Syntax @section Syntax @menu * BPF-Chars:: Special Characters * BPF-Regs:: Register Names * BPF-Pseudo-Maps:: Pseudo map fds @end menu @node BPF-Chars @subsection Special Characters @cindex line comment character, BPF @cindex BPF line comment character The presence of a @samp{;} on a line indicates the start of a comment that extends to the end of the current line. If a @samp{#} appears as the first character of a line, the whole line is treated as a comment. @cindex statement separator, BPF Statements and assembly directives are separated by newlines. @node BPF-Regs @subsection Register Names @cindex BPF register names @cindex register names, BPF The eBPF processor provides ten general-purpose 64-bit registers, which are read-write, and a read-only frame pointer register: @table @samp @item %r0 .. %r9 General-purpose registers. @item %r10 Frame pointer register. @end table Some registers have additional names, to reflect their role in the eBPF ABI: @table @samp @item %a This is @samp{%r0}. @item %ctx This is @samp{%r6}. @item %fp This is @samp{%r10}. @end table @node BPF-Pseudo-Maps @subsection Pseudo Maps @cindex pseudo map fd, BPF The @samp{LDDW} instruction can take a literal pseudo map file descriptor as its second argument. This uses the syntax @samp{%map_fd(N)} where @samp{N} is a signed number. For example, to load the address of the pseudo map with file descriptor @samp{2} in register @samp{r1} we would do: @smallexample lddw %r1, %map_fd(2) @end smallexample @node BPF Directives @section Machine Directives @cindex machine directives, BPF The BPF version of @code{@value{AS}} supports the following additional machine directives: @table @code @cindex @code{half} directive, BPF @item .word The @code{.half} directive produces a 16 bit value. @cindex @code{word} directive, BPF @item .word The @code{.word} directive produces a 32 bit value. @cindex @code{dword} directive, BPF @item .dword The @code{.dword} directive produces a 64 bit value. @end table @node BPF Opcodes @section Opcodes @cindex BPF opcodes @cindex opcodes for BPF In the instruction descriptions below the following field descriptors are used: @table @code @item %d Destination general-purpose register whose role is to be destination of an operation. @item %s Source general-purpose register whose role is to be the source of an operation. @item disp16 16-bit signed PC-relative offset, measured in number of 64-bit words, minus one. @item disp32 32-bit signed PC-relative offset, measured in number of 64-bit words, minus one. @item offset16 Signed 16-bit immediate. @item imm32 Signed 32-bit immediate. @item imm64 Signed 64-bit immediate. @end table @subsubsection Arithmetic instructions The destination register in these instructions act like an accumulator. @table @code @item add %d, (%s|imm32) 64-bit arithmetic addition. @item sub %d, (%s|imm32) 64-bit arithmetic subtraction. @item mul %d, (%s|imm32) 64-bit arithmetic multiplication. @item div %d, (%s|imm32) 64-bit arithmetic integer division. @item mod %d, (%s|imm32) 64-bit integer remainder. @item and %d, (%s|imm32) 64-bit bit-wise ``and'' operation. @item or %d, (%s|imm32) 64-bit bit-wise ``or'' operation. @item xor %d, (%s|imm32) 64-bit bit-wise exclusive-or operation. @item lsh %d, (%s|imm32) 64-bit left shift, by @code{%s} or @code{imm32} bits. @item rsh %d, (%s|imm32) 64-bit right logical shift, by @code{%s} or @code{imm32} bits. @item arsh %d, (%s|imm32) 64-bit right arithmetic shift, by @code{%s} or @code{imm32} bits. @item neg %d 64-bit arithmetic negation. @item mov %d, (%s|imm32) Move the 64-bit value of @code{%s} in @code{%d}, or load @code{imm32} in @code{%d}. @end table @subsubsection 32-bit arithmetic instructions The destination register in these instructions act as an accumulator. @table @code @item add32 %d, (%s|imm32) 32-bit arithmetic addition. @item sub32 %d, (%s|imm32) 32-bit arithmetic subtraction. @item mul32 %d, (%s|imm32) 32-bit arithmetic multiplication. @item div32 %d, (%s|imm32) 32-bit arithmetic integer division. @item mod32 %d, (%s|imm32) 32-bit integer remainder. @item and32 %d, (%s|imm32) 32-bit bit-wise ``and'' operation. @item or32 %d, (%s|imm32) 32-bit bit-wise ``or'' operation. @item xor32 %d, (%s|imm32) 32-bit bit-wise exclusive-or operation. @item lsh32 %d, (%s|imm32) 32-bit left shift, by @code{%s} or @code{imm32} bits. @item rsh32 %d, (%s|imm32) 32-bit right logical shift, by @code{%s} or @code{imm32} bits. @item arsh32 %d, (%s|imm32) 32-bit right arithmetic shift, by @code{%s} or @code{imm32} bits. @item neg32 %d 32-bit arithmetic negation. @item mov32 %d, (%s|imm32) Move the 32-bit value of @code{%s} in @code{%d}, or load @code{imm32} in @code{%d}. @end table @subsubsection Endianness conversion instructions @table @code @item endle %d, (8|16|32) Convert the 8-bit, 16-bit or 32-bit value in @code{%d} to little-endian. @item endbe %d, (8|16|32) Convert the 8-bit, 16-bit or 32-bit value in @code{%d} to big-endian. @end table @subsubsection 64-bit load and pseudo maps @table @code @item lddw %d, imm64 Load the given signed 64-bit immediate, or pseudo map descriptor, to the destination register @code{%d}. @item lddw %d, %map_fd(N) Load the address of the given pseudo map fd @emph{N} to the destination register @code{%d}. @end table @subsubsection Load instructions for socket filters The following instructions are intended to be used in socket filters, and are therefore not general-purpose: they make assumptions on the contents of several registers. See the file @file{Documentation/networking/filter.txt} in the Linux kernel source tree for more information. Absolute loads: @table @code @item ldabsdw imm32 Absolute 64-bit load. @item ldabsw imm32 Absolute 32-bit load. @item ldabsh imm32 Absolute 16-bit load. @item ldabsb imm32 Absolute 8-bit load. @end table Indirect loads: @table @code @item ldinddw %s, imm32 Indirect 64-bit load. @item ldindw %s, imm32 Indirect 32-bit load. @item ldindh %s, imm32 Indirect 16-bit load. @item ldindb %s, imm32 Indirect 8-bit load. @end table @subsubsection Generic load/store instructions General-purpose load and store instructions are provided for several word sizes. Load to register instructions: @table @code @item ldxdw %d, [%s+offset16] Generic 64-bit load. @item ldxw %d, [%s+offset16] Generic 32-bit load. @item ldxh %d, [%s+offset16] Generic 16-bit load. @item ldxb %d, [%s+offset16] Generic 8-bit load. @end table Store from register instructions: @table @code @item stxdw [%d+offset16], %s Generic 64-bit store. @item stxw [%d+offset16], %s Generic 32-bit store. @item stxh [%d+offset16], %s Generic 16-bit store. @item stxb [%d+offset16], %s Generic 8-bit store. @end table Store from immediates instructions: @table @code @item stddw [%d+offset16], imm32 Store immediate as 64-bit. @item stdw [%d+offset16], imm32 Store immediate as 32-bit. @item stdh [%d+offset16], imm32 Store immediate as 16-bit. @item stdb [%d+offset16], imm32 Store immediate as 8-bit. @end table @subsubsection Jump instructions eBPF provides the following compare-and-jump instructions, which compare the values of the two given registers, or the values of a register and an immediate, and perform a branch in case the comparison holds true. @table @code @item ja %d,(%s|imm32),disp16 Jump-always. @item jeq %d,(%s|imm32),disp16 Jump if equal. @item jgt %d,(%s|imm32),disp16 Jump if greater. @item jge %d,(%s|imm32),disp16 Jump if greater or equal. @item jlt %d,(%s|imm32),disp16 Jump if lesser. @item jle %d,(%s|imm32),disp16 Jump if lesser or equal. @item jset %d,(%s|imm32),disp16 Jump if signed equal. @item jne %d,(%s|imm32),disp16 Jump if not equal. @item jsgt %d,(%s|imm32),disp16 Jump if signed greater. @item jsge %d,(%s|imm32),disp16 Jump if signed greater or equal. @item jslt %d,(%s|imm32),disp16 Jump if signed lesser. @item jsle %d,(%s|imm32),disp16 Jump if signed lesser or equal. @end table A call instruction is provided in order to perform calls to other eBPF functions, or to external kernel helpers: @table @code @item call (disp32|imm32) Jump and link to the offset @emph{disp32}, or to the kernel helper function identified by @emph{imm32}. @end table Finally: @table @code @item exit Terminate the eBPF program. @end table @subsubsection Atomic instructions Atomic exchange-and-add instructions are provided in two flavors: one for swapping 64-bit quantities and another for 32-bit quantities. @table @code @item xadddw [%d+offset16],%s Exchange-and-add a 64-bit value at the specified location. @item xaddw [%d+offset16],%s Exchange-and-add a 32-bit value at the specified location. @end table