2021-01-01 06:58:58 +08:00
|
|
|
@c Copyright (C) 2019-2021 Free Software Foundation, Inc.
|
2019-05-24 01:05:12 +08:00
|
|
|
@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
|
2019-07-18 04:57:23 +08:00
|
|
|
* BPF Directives:: Machine Directives
|
2019-05-24 01:05:12 +08:00
|
|
|
* 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
|
|
|
|
|
2019-07-18 04:57:23 +08:00
|
|
|
@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
|
|
|
|
|
2019-05-24 01:05:12 +08:00
|
|
|
@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
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldabsdw imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Absolute 64-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldabsw imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Absolute 32-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldabsh imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Absolute 16-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldabsb imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Absolute 8-bit load.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
Indirect loads:
|
|
|
|
|
|
|
|
@table @code
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldinddw %s, imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Indirect 64-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldindw %s, imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Indirect 32-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldindh %s, imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
Indirect 16-bit load.
|
2019-07-15 22:00:28 +08:00
|
|
|
@item ldindb %s, imm32
|
2019-05-24 01:05:12 +08:00
|
|
|
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
|