Remove path name from test case
[binutils-gdb.git] / gas / doc / c-bpf.texi
1 @c Copyright (C) 2019-2023 Free Software Foundation, Inc.
2 @c This is part of the GAS manual.
3 @c For copying conditions, see the file as.texinfo.
4
5 @ifset GENERIC
6 @page
7 @node BPF-Dependent
8 @chapter BPF Dependent Features
9 @end ifset
10
11 @ifclear GENERIC
12 @node Machine Dependencies
13 @chapter BPF Dependent Features
14 @end ifclear
15
16 @cindex BPF support
17 @menu
18 * BPF Options:: BPF specific command-line options.
19 * BPF Special Characters:: Comments and statements.
20 * BPF Registers:: Register names.
21 * BPF Directives:: Machine directives.
22 * BPF Instructions:: Machine instructions.
23 @end menu
24
25 @node BPF Options
26 @section BPF Options
27 @cindex BPF options (none)
28 @cindex options for BPF (none)
29
30 @c man begin OPTIONS
31 @table @gcctabopt
32
33 @cindex @option{-EB} command-line option, BPF
34 @item -EB
35 This option specifies that the assembler should emit big-endian eBPF.
36
37 @cindex @option{-EL} command-line option, BPF
38 @item -EL
39 This option specifies that the assembler should emit little-endian
40 eBPF.
41
42 @cindex @option{-mdialect} command-line options, BPF
43 @item -mdialect=@var{dialect}
44 This option specifies the assembly language dialect to recognize while
45 assembling. The assembler supports @option{normal} and
46 @option{pseudoc}.
47
48 @cindex @option{-misa-spec} command-line options, BPF
49 @item -misa-spec=@var{spec}
50 This option specifies the version of the BPF instruction set to use
51 when assembling. The BPF ISA versions supported are @option{v1} @option{v2}, @option{v3} and @option{v4}.
52
53 The value @option{xbpf} can be specified to recognize extra
54 instructions that are used by GCC for testing purposes. But beware
55 this is not valid BPF.
56
57 @cindex @option{-mno-relax} command-line options, BPF
58 @item -mno-relax
59 This option tells the assembler to not relax instructions.
60 @end table
61
62 Note that if no endianness option is specified in the command line,
63 the host endianness is used.
64 @c man end
65
66 @node BPF Special Characters
67 @section BPF Special Characters
68
69 @cindex line comment character, BPF
70 @cindex BPF line comment character
71 The presence of a @samp{;} or a @samp{#} on a line indicates the start
72 of a comment that extends to the end of the current line.
73
74 @cindex statement separator, BPF
75 Statements and assembly directives are separated by newlines.
76
77 @node BPF Registers
78 @section BPF Registers
79
80 @cindex BPF register names
81 @cindex register names, BPF
82 The eBPF processor provides ten general-purpose 64-bit registers,
83 which are read-write, and a read-only frame pointer register:
84
85 @noindent
86 In normal syntax:
87
88 @table @samp
89 @item %r0 .. %r9
90 General-purpose registers.
91 @item %r10
92 @itemx %fp
93 Read-only frame pointer register.
94 @end table
95
96 All BPF registers are 64-bit long. However, in the Pseudo-C syntax
97 registers can be referred using different names, which actually
98 reflect the kind of instruction they appear on:
99
100 @noindent
101 In pseudoc syntax:
102
103 @table @samp
104 @item r0..r9
105 General-purpose register in an instruction that operates on its value
106 as if it was a 64-bit value.
107 @item w0..w9
108 General-purpose register in an instruction that operates on its value
109 as if it was a 32-bit value.
110 @item r10
111 Read-only frame pointer register.
112 @end table
113
114 @noindent
115 Note that in the Pseudo-C syntax register names are not preceded by
116 @code{%} characters.
117
118 @node BPF Directives
119 @section BPF Directives
120
121 @cindex machine directives, BPF
122
123 The BPF version of @code{@value{AS}} supports the following additional
124 machine directives:
125
126 @table @code
127 @cindex @code{half} directive, BPF
128 @item .word
129 The @code{.half} directive produces a 16 bit value.
130
131 @cindex @code{word} directive, BPF
132 @item .word
133 The @code{.word} directive produces a 32 bit value.
134
135 @cindex @code{dword} directive, BPF
136 @item .dword
137 The @code{.dword} directive produces a 64 bit value.
138 @end table
139
140 @node BPF Instructions
141 @section BPF Instructions
142
143 @cindex BPF opcodes
144 @cindex opcodes for BPF
145 In the instruction descriptions below the following field descriptors
146 are used:
147
148 @table @code
149 @item rd
150 Destination general-purpose register whose role is to be the
151 destination of an operation.
152 @item rs
153 Source general-purpose register whose role is to be the source of an
154 operation.
155 @item disp16
156 16-bit signed PC-relative offset, measured in number of 64-bit words,
157 minus one.
158 @item disp32
159 32-bit signed PC-relative offset, measured in number of 64-bit words,
160 minus one.
161 @item offset16
162 Signed 16-bit immediate representing an offset in bytes.
163 @item disp16
164 Signed 16-bit immediate representing a displacement to a target,
165 measured in number of 64-bit words @emph{minus one}.
166 @item disp32
167 Signed 32-bit immediate representing a displacement to a target,
168 measured in number of 64-bit words @emph{minus one}.
169 @item imm32
170 Signed 32-bit immediate.
171 @item imm64
172 Signed 64-bit immediate.
173 @end table
174
175 @noindent
176 Note that the assembler allows to express the value for an immediate
177 using any numerical literal whose two's complement encoding fits in
178 the immediate field. For example, @code{-2}, @code{0xfffffffe} and
179 @code{4294967294} all denote the same encoded 32-bit immediate, whose
180 value may be then interpreted by different instructions as either as a
181 negative or a positive number.
182
183 @subsection Arithmetic instructions
184
185 The destination register in these instructions act like an
186 accumulator.
187
188 Note that in pseudoc syntax these instructions should use @code{r}
189 registers.
190
191 @table @code
192 @item add rd, rs
193 @itemx add rd, imm32
194 @itemx rd += rs
195 @itemx rd += imm32
196 64-bit arithmetic addition.
197
198 @item sub rd, rs
199 @itemx sub rd, rs
200 @itemx rd -= rs
201 @itemx rd -= imm32
202 64-bit arithmetic subtraction.
203
204 @item mul rd, rs
205 @itemx mul rd, imm32
206 @itemx rd *= rs
207 @itemx rd *= imm32
208 64-bit arithmetic multiplication.
209
210 @item div rd, rs
211 @itemx div rd, imm32
212 @itemx rd /= rs
213 @itemx rd /= imm32
214 64-bit arithmetic integer division.
215
216 @item mod rd, rs
217 @itemx mod rd, imm32
218 @itemx rd %= rs
219 @itemx rd %= imm32
220 64-bit integer remainder.
221
222 @item and rd, rs
223 @itemx and rd, imm32
224 @itemx rd &= rs
225 @itemx rd &= imm32
226 64-bit bit-wise ``and'' operation.
227
228 @item or rd, rs
229 @itemx or rd, imm32
230 @itemx rd |= rs
231 @itemx rd |= imm32
232 64-bit bit-wise ``or'' operation.
233
234 @item xor rd, imm32
235 @itemx xor rd, rs
236 @itemx rd ^= rs
237 @itemx rd ^= imm32
238 64-bit bit-wise exclusive-or operation.
239
240 @item lsh rd, rs
241 @itemx ldh rd, imm32
242 @itemx rd <<= rs
243 @itemx rd <<= imm32
244 64-bit left shift, by @code{rs} or @code{imm32} bits.
245
246 @item rsh %d, %s
247 @itemx rsh rd, imm32
248 @itemx rd >>= rs
249 @itemx rd >>= imm32
250 64-bit right logical shift, by @code{rs} or @code{imm32} bits.
251
252 @item arsh rd, rs
253 @itemx arsh rd, imm32
254 @itemx rd s>>= rs
255 @itemx rd s>>= imm32
256 64-bit right arithmetic shift, by @code{rs} or @code{imm32} bits.
257
258 @item neg rd
259 @itemx rd = - rd
260 64-bit arithmetic negation.
261
262 @item mov rd, rs
263 @itemx mov rd, imm32
264 @itemx rd = rs
265 @itemx rd = imm32
266 Move the 64-bit value of @code{rs} in @code{rd}, or load @code{imm32}
267 in @code{rd}.
268
269 @item movs rd, rs, 8
270 @itemx rd = (s8) rs
271 Move the sign-extended 8-bit value in @code{rs} to @code{rd}.
272
273 @item movs rd, rs, 16
274 @itemx rd = (s16) rs
275 Move the sign-extended 16-bit value in @code{rs} to @code{rd}.
276
277 @item movs rd, rs, 32
278 @itemx rd = (s32) rs
279 Move the sign-extended 32-bit value in @code{rs} to @code{rd}.
280 @end table
281
282 @subsection 32-bit arithmetic instructions
283
284 The destination register in these instructions act as an accumulator.
285
286 Note that in pseudoc syntax these instructions should use @code{w}
287 registers. It is not allowed to mix @code{w} and @code{r} registers
288 in the same instruction.
289
290 @table @code
291 @item add32 rd, rs
292 @itemx add32 rd, imm32
293 @itemx rd += rs
294 @itemx rd += imm32
295 32-bit arithmetic addition.
296
297 @item sub32 rd, rs
298 @itemx sub32 rd, imm32
299 @itemx rd -= rs
300 @itemx rd += imm32
301 32-bit arithmetic subtraction.
302
303 @item mul32 rd, rs
304 @itemx mul32 rd, imm32
305 @itemx rd *= rs
306 @itemx rd *= imm32
307 32-bit arithmetic multiplication.
308
309 @item div32 rd, rs
310 @itemx div32 rd, imm32
311 @itemx rd /= rs
312 @itemx rd /= imm32
313 32-bit arithmetic integer division.
314
315 @item mod32 rd, rs
316 @itemx mod32 rd, imm32
317 @itemx rd %= rs
318 @itemx rd %= imm32
319 32-bit integer remainder.
320
321 @item and32 rd, rs
322 @itemx and32 rd, imm32
323 @itemx rd &= rs
324 @itemx rd &= imm32
325 32-bit bit-wise ``and'' operation.
326
327 @item or32 rd, rs
328 @itemx or32 rd, imm32
329 @itemx rd |= rs
330 @itemx rd |= imm32
331 32-bit bit-wise ``or'' operation.
332
333 @item xor32 rd, rs
334 @itemx xor32 rd, imm32
335 @itemx rd ^= rs
336 @itemx rd ^= imm32
337 32-bit bit-wise exclusive-or operation.
338
339 @item lsh32 rd, rs
340 @itemx lsh32 rd, imm32
341 @itemx rd <<= rs
342 @itemx rd <<= imm32
343 32-bit left shift, by @code{rs} or @code{imm32} bits.
344
345 @item rsh32 rd, rs
346 @itemx rsh32 rd, imm32
347 @itemx rd >>= rs
348 @itemx rd >>= imm32
349 32-bit right logical shift, by @code{rs} or @code{imm32} bits.
350
351 @item arsh32 rd, rs
352 @itemx arsh32 rd, imm32
353 @itemx rd s>>= rs
354 @itemx rd s>>= imm32
355 32-bit right arithmetic shift, by @code{rs} or @code{imm32} bits.
356
357 @item neg32 rd
358 @itemx rd = - rd
359 32-bit arithmetic negation.
360
361 @item mov32 rd, rs
362 @itemx mov32 rd, imm32
363 @itemx rd = rs
364 @itemx rd = imm32
365 Move the 32-bit value of @code{rs} in @code{rd}, or load @code{imm32}
366 in @code{rd}.
367
368 @item mov32s rd, rs, 8
369 @itemx rd = (s8) rs
370 Move the sign-extended 8-bit value in @code{rs} to @code{rd}.
371
372 @item mov32s rd, rs, 16
373 @itemx rd = (s16) rs
374 Move the sign-extended 16-bit value in @code{rs} to @code{rd}.
375
376 @item mov32s rd, rs, 32
377 @itemx rd = (s32) rs
378 Move the sign-extended 32-bit value in @code{rs} to @code{rd}.
379 @end table
380
381 @subsection Endianness conversion instructions
382
383 @table @code
384 @item endle rd, 16
385 @itemx endle rd, 32
386 @itemx endle rd, 64
387 @itemx rd = le16 rd
388 @itemx rd = le32 rd
389 @itemx rd = le64 rd
390 Convert the 16-bit, 32-bit or 64-bit value in @code{rd} to
391 little-endian and store it back in @code{rd}.
392 @item endbe %d, 16
393 @itemx endbe %d, 32
394 @itemx endbe %d, 64
395 @itemx rd = be16 rd
396 @itemx rd = be32 rd
397 @itemx rd = be64 rd
398 Convert the 16-bit, 32-bit or 64-bit value in @code{rd} to big-endian
399 and store it back in @code{rd}.
400 @end table
401
402 @subsection Byte swap instructions
403
404 @table @code
405 @item bswap rd, 16
406 @itemx rd = bswap16 rd
407 Swap the least-significant 16-bit word in @code{rd} with the
408 most-significant 16-bit word.
409
410 @item bswap rd, 32
411 @itemx rd = bswap32 rd
412 Swap the least-significant 32-bit word in @code{rd} with the
413 most-significant 32-bit word.
414
415 @item bswap rd, 64
416 @itemx rd = bswap64 rd
417 Swap the least-significant 64-bit word in @code{rd} with the
418 most-significant 64-bit word.
419 @end table
420
421
422 @subsection 64-bit load and pseudo maps
423
424 @table @code
425 @item lddw rd, imm64
426 @itemx rd = imm64 ll
427 Load the given signed 64-bit immediate to the destination register
428 @code{rd}.
429 @end table
430
431 @subsection Load instructions for socket filters
432
433 The following instructions are intended to be used in socket filters,
434 and are therefore not general-purpose: they make assumptions on the
435 contents of several registers. See the file
436 @file{Documentation/networking/filter.txt} in the Linux kernel source
437 tree for more information.
438
439 Absolute loads:
440
441 @table @code
442 @item ldabsdw imm32
443 @itemx r0 = *(u64 *) skb[imm32]
444 Absolute 64-bit load.
445
446 @item ldabsw imm32
447 @itemx r0 = *(u32 *) skb[imm32]
448 Absolute 32-bit load.
449
450 @item ldabsh imm32
451 @itemx r0 = *(u16 *) skb[imm32]
452 Absolute 16-bit load.
453
454 @item ldabsb imm32
455 @itemx r0 = *(u8 *) skb[imm32]
456 Absolute 8-bit load.
457 @end table
458
459 Indirect loads:
460
461 @table @code
462 @item ldinddw rs, imm32
463 @itemx r0 = *(u64 *) skb[rs + imm32]
464 Indirect 64-bit load.
465
466 @item ldindw rs, imm32
467 @itemx r0 = *(u32 *) skb[rs + imm32]
468 Indirect 32-bit load.
469
470 @item ldindh rs, imm32
471 @itemx r0 = *(u16 *) skb[rs + imm32]
472 Indirect 16-bit load.
473
474 @item ldindb %s, imm32
475 @itemx r0 = *(u8 *) skb[rs + imm32]
476 Indirect 8-bit load.
477 @end table
478
479 @subsection Generic load/store instructions
480
481 General-purpose load and store instructions are provided for several
482 word sizes.
483
484 Load to register instructions:
485
486 @table @code
487 @item ldxdw rd, [rs + offset16]
488 @itemx rd = *(u64 *) (rs + offset16)
489 Generic 64-bit load.
490
491 @item ldxw rd, [rs + offset16]
492 @itemx rd = *(u32 *) (rs + offset16)
493 Generic 32-bit load.
494
495 @item ldxh rd, [rs + offset16]
496 @itemx rd = *(u16 *) (rs + offset16)
497 Generic 16-bit load.
498
499 @item ldxb rd, [rs + offset16]
500 @itemx rd = *(u8 *) (rs + offset16)
501 Generic 8-bit load.
502 @end table
503
504 Signed load to register instructions:
505
506 @table @code
507 @item ldxsdw rd, [rs + offset16]
508 @itemx rd = *(s64 *) (rs + offset16)
509 Generic 64-bit signed load.
510
511 @item ldxsw rd, [rs + offset16]
512 @itemx rd = *(s32 *) (rs + offset16)
513 Generic 32-bit signed load.
514
515 @item ldxsh rd, [rs + offset16]
516 @itemx rd = *(s16 *) (rs + offset16)
517 Generic 16-bit signed load.
518
519 @item ldxsb rd, [rs + offset16]
520 @itemx rd = *(s8 *) (rs + offset16)
521 Generic 8-bit signed load.
522 @end table
523
524 Store from register instructions:
525
526 @table @code
527 @item stxdw [rd + offset16], %s
528 @itemx *(u64 *) (rd + offset16)
529 Generic 64-bit store.
530
531 @item stxw [rd + offset16], %s
532 @itemx *(u32 *) (rd + offset16)
533 Generic 32-bit store.
534
535 @item stxh [rd + offset16], %s
536 @itemx *(u16 *) (rd + offset16)
537 Generic 16-bit store.
538
539 @item stxb [rd + offset16], %s
540 @itemx *(u8 *) (rd + offset16)
541 Generic 8-bit store.
542 @end table
543
544 Store from immediates instructions:
545
546 @table @code
547 @item stdw [rd + offset16], imm32
548 @itemx *(u64 *) (rd + offset16) = imm32
549 Store immediate as 64-bit.
550
551 @item stw [rd + offset16], imm32
552 @itemx *(u32 *) (rd + offset16) = imm32
553 Store immediate as 32-bit.
554
555 @item sth [rd + offset16], imm32
556 @itemx *(u16 *) (rd + offset16) = imm32
557 Store immediate as 16-bit.
558
559 @item stb [rd + offset16], imm32
560 @itemx *(u8 *) (rd + offset16) = imm32
561 Store immediate as 8-bit.
562 @end table
563
564 @subsection Jump instructions
565
566 eBPF provides the following compare-and-jump instructions, which
567 compare the values of the two given registers, or the values of a
568 register and an immediate, and perform a branch in case the comparison
569 holds true.
570
571 @table @code
572 @item ja disp16
573 @itemx goto disp16
574 Jump-always.
575
576 @item jal disp32
577 @itemx gotol disp32
578 Jump-always, long range.
579
580 @item jeq rd, rs, disp16
581 @itemx jeq rd, imm32, disp16
582 @itemx if rd == rs goto disp16
583 @itemx if rd == imm32 goto disp16
584 Jump if equal, unsigned.
585
586 @item jgt rd, rs, disp16
587 @itemx jgt rd, imm32, disp16
588 @itemx if rd > rs goto disp16
589 @itemx if rd > imm32 goto disp16
590 Jump if greater, unsigned.
591
592 @item jge rd, rs, disp16
593 @itemx jge rd, imm32, disp16
594 @itemx if rd >= rs goto disp16
595 @itemx if rd >= imm32 goto disp16
596 Jump if greater or equal.
597
598 @item jlt rd, rs, disp16
599 @itemx jlt rd, imm32, disp16
600 @itemx if rd < rs goto disp16
601 @itemx if rd < imm32 goto disp16
602 Jump if lesser.
603
604 @item jle rd , rs, disp16
605 @itemx jle rd, imm32, disp16
606 @itemx if rd <= rs goto disp16
607 @itemx if rd <= imm32 goto disp16
608 Jump if lesser or equal.
609
610 @item jset rd, rs, disp16
611 @itemx jset rd, imm32, disp16
612 @itemx if rd & rs goto disp16
613 @itemx if rd & imm32 goto disp16
614 Jump if signed equal.
615
616 @item jne rd, rs, disp16
617 @itemx jne rd, imm32, disp16
618 @itemx if rd != rs goto disp16
619 @itemx if rd != imm32 goto disp16
620 Jump if not equal.
621
622 @item jsgt rd, rs, disp16
623 @itemx jsgt rd, imm32, disp16
624 @itemx if rd s> rs goto disp16
625 @itemx if rd s> imm32 goto disp16
626 Jump if signed greater.
627
628 @item jsge rd, rs, disp16
629 @itemx jsge rd, imm32, disp16
630 @itemx if rd s>= rd goto disp16
631 @itemx if rd s>= imm32 goto disp16
632 Jump if signed greater or equal.
633
634 @item jslt rd, rs, disp16
635 @itemx jslt rd, imm32, disp16
636 @itemx if rd s< rs goto disp16
637 @itemx if rd s< imm32 goto disp16
638 Jump if signed lesser.
639
640 @item jsle rd, rs, disp16
641 @itemx jsle rd, imm32, disp16
642 @itemx if rd s<= rs goto disp16
643 @itemx if rd s<= imm32 goto disp16
644 Jump if signed lesser or equal.
645 @end table
646
647 A call instruction is provided in order to perform calls to other eBPF
648 functions, or to external kernel helpers:
649
650 @table @code
651 @item call disp32
652 @item call imm32
653 Jump and link to the offset @emph{disp32}, or to the kernel helper
654 function identified by @emph{imm32}.
655 @end table
656
657 Finally:
658
659 @table @code
660 @item exit
661 Terminate the eBPF program.
662 @end table
663
664 @subsection 32-bit jump instructions
665
666 eBPF provides the following compare-and-jump instructions, which
667 compare the 32-bit values of the two given registers, or the values of
668 a register and an immediate, and perform a branch in case the
669 comparison holds true.
670
671 These instructions are only available in BPF v3 or later.
672
673 @table @code
674 @item jeq32 rd, rs, disp16
675 @itemx jeq32 rd, imm32, disp16
676 @itemx if rd == rs goto disp16
677 @itemx if rd == imm32 goto disp16
678 Jump if equal, unsigned.
679
680 @item jgt32 rd, rs, disp16
681 @itemx jgt32 rd, imm32, disp16
682 @itemx if rd > rs goto disp16
683 @itemx if rd > imm32 goto disp16
684 Jump if greater, unsigned.
685
686 @item jge32 rd, rs, disp16
687 @itemx jge32 rd, imm32, disp16
688 @itemx if rd >= rs goto disp16
689 @itemx if rd >= imm32 goto disp16
690 Jump if greater or equal.
691
692 @item jlt32 rd, rs, disp16
693 @itemx jlt32 rd, imm32, disp16
694 @itemx if rd < rs goto disp16
695 @itemx if rd < imm32 goto disp16
696 Jump if lesser.
697
698 @item jle32 rd , rs, disp16
699 @itemx jle32 rd, imm32, disp16
700 @itemx if rd <= rs goto disp16
701 @itemx if rd <= imm32 goto disp16
702 Jump if lesser or equal.
703
704 @item jset32 rd, rs, disp16
705 @itemx jset32 rd, imm32, disp16
706 @itemx if rd & rs goto disp16
707 @itemx if rd & imm32 goto disp16
708 Jump if signed equal.
709
710 @item jne32 rd, rs, disp16
711 @itemx jne32 rd, imm32, disp16
712 @itemx if rd != rs goto disp16
713 @itemx if rd != imm32 goto disp16
714 Jump if not equal.
715
716 @item jsgt32 rd, rs, disp16
717 @itemx jsgt32 rd, imm32, disp16
718 @itemx if rd s> rs goto disp16
719 @itemx if rd s> imm32 goto disp16
720 Jump if signed greater.
721
722 @item jsge32 rd, rs, disp16
723 @itemx jsge32 rd, imm32, disp16
724 @itemx if rd s>= rd goto disp16
725 @itemx if rd s>= imm32 goto disp16
726 Jump if signed greater or equal.
727
728 @item jslt32 rd, rs, disp16
729 @itemx jslt32 rd, imm32, disp16
730 @itemx if rd s< rs goto disp16
731 @itemx if rd s< imm32 goto disp16
732 Jump if signed lesser.
733
734 @item jsle32 rd, rs, disp16
735 @itemx jsle32 rd, imm32, disp16
736 @itemx if rd s<= rs goto disp16
737 @itemx if rd s<= imm32 goto disp16
738 Jump if signed lesser or equal.
739 @end table
740
741 @subsection Atomic instructions
742
743 Atomic exchange instructions are provided in two flavors: one for
744 compare-and-swap, one for unconditional exchange.
745
746 @table @code
747 @item acmp [rd + offset16], rs
748 @itemx r0 = cmpxchg_64 (rd + offset16, r0, rs)
749 Atomic compare-and-swap. Compares value in @code{r0} to value
750 addressed by @code{rd + offset16}. On match, the value addressed by
751 @code{rd + offset16} is replaced with the value in @code{rs}.
752 Regardless, the value that was at @code{rd + offset16} is
753 zero-extended and loaded into @code{r0}.
754
755 @item axchg [rd + offset16], rs
756 @itemx rs = xchg_64 (rd + offset16, rs)
757 Atomic exchange. Atomically exchanges the value in @code{rs} with
758 the value addressed by @code{rd + offset16}.
759 @end table
760
761 @noindent
762 The following instructions provide atomic arithmetic operations.
763
764 @table @code
765 @item aadd [rd + offset16], rs
766 @itemx lock *(u64 *)(rd + offset16) = rs
767 Atomic add instruction.
768
769 @item aor [rd + offset16], rs
770 @itemx lock *(u64 *) (rd + offset16) |= rs
771 Atomic or instruction.
772
773 @item aand [rd + offset16], rs
774 @itemx lock *(u64 *) (rd + offset16) &= rs
775 Atomic and instruction.
776
777 @item axor [rd + offset16], rs
778 @itemx lock *(u64 *) (rd + offset16) ^= rs
779 Atomic xor instruction.
780 @end table
781
782 @noindent
783 The following variants perform fetching before the atomic operation.
784
785 @table @code
786 @item afadd [rd + offset16], rs
787 @itemx rs = atomic_fetch_add ((u64 *)(rd + offset16), rs)
788 Atomic fetch-and-add instruction.
789
790 @item afor [rd + offset16], rs
791 @itemx rs = atomic_fetch_or ((u64 *)(rd + offset16), rs)
792 Atomic fetch-and-or instruction.
793
794 @item afand [rd + offset16], rs
795 @itemx rs = atomic_fetch_and ((u64 *)(rd + offset16), rs)
796 Atomic fetch-and-and instruction.
797
798 @item afxor [rd + offset16], rs
799 @itemx rs = atomic_fetch_xor ((u64 *)(rd + offset16), rs)
800 Atomic fetch-and-or instruction.
801 @end table
802
803 The above instructions were introduced in the V3 of the BPF
804 instruction set. The following instruction is supported for backwards
805 compatibility:
806
807 @table @code
808 @item xadddw [rd + offset16], rs
809 Alias to @code{aadd}.
810 @end table
811
812 @subsection 32-bit atomic instructions
813
814 32-bit atomic exchange instructions are provided in two flavors: one
815 for compare-and-swap, one for unconditional exchange.
816
817 @table @code
818 @item acmp32 [rd + offset16], rs
819 @itemx w0 = cmpxchg32_32 (rd + offset16, w0, ws)
820 Atomic compare-and-swap. Compares value in @code{w0} to value
821 addressed by @code{rd + offset16}. On match, the value addressed by
822 @code{rd + offset16} is replaced with the value in @code{ws}.
823 Regardless, the value that was at @code{rd + offset16} is
824 zero-extended and loaded into @code{w0}.
825
826 @item axchg [rd + offset16], rs
827 @itemx ws = xchg32_32 (rd + offset16, ws)
828 Atomic exchange. Atomically exchanges the value in @code{ws} with
829 the value addressed by @code{rd + offset16}.
830 @end table
831
832 @noindent
833 The following instructions provide 32-bit atomic arithmetic operations.
834
835 @table @code
836 @item aadd32 [rd + offset16], rs
837 @itemx lock *(u32 *)(rd + offset16) = rs
838 Atomic add instruction.
839
840 @item aor32 [rd + offset16], rs
841 @itemx lock *(u32 *) (rd + offset16) |= rs
842 Atomic or instruction.
843
844 @item aand32 [rd + offset16], rs
845 @itemx lock *(u32 *) (rd + offset16) &= rs
846 Atomic and instruction.
847
848 @item axor32 [rd + offset16], rs
849 @itemx lock *(u32 *) (rd + offset16) ^= rs
850 Atomic xor instruction
851 @end table
852
853 @noindent
854 The following variants perform fetching before the atomic operation.
855
856 @table @code
857 @item afadd32 [dr + offset16], rs
858 @itemx ws = atomic_fetch_add ((u32 *)(rd + offset16), ws)
859 Atomic fetch-and-add instruction.
860
861 @item afor32 [dr + offset16], rs
862 @itemx ws = atomic_fetch_or ((u32 *)(rd + offset16), ws)
863 Atomic fetch-and-or instruction.
864
865 @item afand32 [dr + offset16], rs
866 @itemx ws = atomic_fetch_and ((u32 *)(rd + offset16), ws)
867 Atomic fetch-and-and instruction.
868
869 @item afxor32 [dr + offset16], rs
870 @itemx ws = atomic_fetch_xor ((u32 *)(rd + offset16), ws)
871 Atomic fetch-and-or instruction
872 @end table
873
874 The above instructions were introduced in the V3 of the BPF
875 instruction set. The following instruction is supported for backwards
876 compatibility:
877
878 @table @code
879 @item xaddw [rd + offset16], rs
880 Alias to @code{aadd32}.
881 @end table