mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
a2c5833233
The result of running etc/update-copyright.py --this-year, fixing all the files whose mode is changed by the script, plus a build with --enable-maintainer-mode --enable-cgen-maint=yes, then checking out */po/*.pot which we don't update frequently. The copy of cgen was with commit d1dd5fcc38ead reverted as that commit breaks building of bfp opcodes files.
388 lines
9.5 KiB
Plaintext
388 lines
9.5 KiB
Plaintext
@c Copyright (C) 2019-2022 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
|