1 /* tc-bpf.c -- Assembler for the Linux eBPF.
2 Copyright (C) 2019-2023 Free Software Foundation, Inc.
3 Contributed by Oracle, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
25 #include "opcode/bpf.h"
26 #include "elf/common.h"
28 #include "dwarf2dbg.h"
29 #include "libiberty.h"
32 /* Data structure representing a parsed BPF instruction. */
37 int size
; /* Instruction size in bytes. */
47 unsigned int has_dst
: 1;
48 unsigned int has_src
: 1;
49 unsigned int has_offset16
: 1;
50 unsigned int has_disp16
: 1;
51 unsigned int has_disp32
: 1;
52 unsigned int has_imm32
: 1;
53 unsigned int has_imm64
: 1;
55 unsigned int is_relaxable
: 1;
56 expressionS
*relaxed_exp
;
59 const char comment_chars
[] = ";#";
60 const char line_comment_chars
[] = "#";
61 const char line_separator_chars
[] = "`";
62 const char EXP_CHARS
[] = "eE";
63 const char FLT_CHARS
[] = "fFdD";
65 /* Like s_lcomm_internal in gas/read.c but the alignment string
66 is allowed to be optional. */
69 pe_lcomm_internal (int needs_align
, symbolS
*symbolP
, addressT size
)
76 && *input_line_pointer
== ',')
78 align
= parse_align (needs_align
- 1);
80 if (align
== (addressT
) -1)
95 bss_alloc (symbolP
, size
, align
);
100 pe_lcomm (int needs_align
)
102 s_comm_internal (needs_align
* 2, pe_lcomm_internal
);
105 /* The target specific pseudo-ops which we support. */
106 const pseudo_typeS md_pseudo_table
[] =
110 { "dword", cons
, 8 },
111 { "lcomm", pe_lcomm
, 1 },
117 /* Command-line options processing. */
121 OPTION_LITTLE_ENDIAN
= OPTION_MD_BASE
,
129 struct option md_longopts
[] =
131 { "EL", no_argument
, NULL
, OPTION_LITTLE_ENDIAN
},
132 { "EB", no_argument
, NULL
, OPTION_BIG_ENDIAN
},
133 { "mxbpf", no_argument
, NULL
, OPTION_XBPF
},
134 { "mdialect", required_argument
, NULL
, OPTION_DIALECT
},
135 { "misa-spec", required_argument
, NULL
, OPTION_ISA_SPEC
},
136 { "mno-relax", no_argument
, NULL
, OPTION_NO_RELAX
},
137 { NULL
, no_argument
, NULL
, 0 },
140 size_t md_longopts_size
= sizeof (md_longopts
);
142 const char * md_shortopts
= "";
144 /* BPF supports little-endian and big-endian variants. The following
145 global records what endianness to use. It can be configured using
146 command-line options. It defaults to the host endianness
147 initialized in md_begin. */
149 static int set_target_endian
= 0;
150 extern int target_big_endian
;
152 /* Whether to relax branch instructions. Default is yes. Can be
153 changed using the -mno-relax command line option. */
155 static int do_relax
= 1;
157 /* The ISA specification can be one of BPF_V1, BPF_V2, BPF_V3, BPF_V4
158 or BPF_XPBF. The ISA spec to use can be configured using
159 command-line options. It defaults to the latest BPF spec. */
161 static int isa_spec
= BPF_V4
;
163 /* The assembler supports two different dialects: "normal" syntax and
164 "pseudoc" syntax. The dialect to use can be configured using
165 command-line options. */
167 enum target_asm_dialect
173 static int asm_dialect
= DIALECT_NORMAL
;
176 md_parse_option (int c
, const char * arg
)
180 case OPTION_BIG_ENDIAN
:
181 set_target_endian
= 1;
182 target_big_endian
= 1;
184 case OPTION_LITTLE_ENDIAN
:
185 set_target_endian
= 0;
186 target_big_endian
= 0;
189 if (strcmp (arg
, "normal") == 0)
190 asm_dialect
= DIALECT_NORMAL
;
191 else if (strcmp (arg
, "pseudoc") == 0)
192 asm_dialect
= DIALECT_PSEUDOC
;
194 as_fatal (_("-mdialect=%s is not valid. Expected normal or pseudoc"),
197 case OPTION_ISA_SPEC
:
198 if (strcmp (arg
, "v1") == 0)
200 else if (strcmp (arg
, "v2") == 0)
202 else if (strcmp (arg
, "v3") == 0)
204 else if (strcmp (arg
, "v4") == 0)
206 else if (strcmp (arg
, "xbpf") == 0)
209 as_fatal (_("-misa-spec=%s is not valid. Expected v1, v2, v3, v4 o xbpf"),
213 /* This is an alias for -misa-spec=xbpf. */
216 case OPTION_NO_RELAX
:
227 md_show_usage (FILE * stream
)
229 fprintf (stream
, _("\nBPF options:\n"));
230 fprintf (stream
, _("\
232 -EL generate code for a little endian machine\n\
233 -EB generate code for a big endian machine\n\
234 -mdialect=DIALECT set the assembly dialect (normal, pseudoc)\n\
235 -misa-spec set the BPF ISA spec (v1, v2, v3, v4, xbpf)\n\
236 -mxbpf alias for -misa-spec=xbpf\n"));
240 /* This function is called once, at assembler startup time. This
241 should set up all the tables, etc that the MD part of the assembler
247 /* If not specified in the command line, use the host
249 if (!set_target_endian
)
251 #ifdef WORDS_BIGENDIAN
252 target_big_endian
= 1;
254 target_big_endian
= 0;
258 /* Ensure that lines can begin with '*' in BPF store pseudoc instruction. */
259 lex_type
['*'] |= LEX_BEGIN_NAME
;
261 /* Set the machine type. */
262 bfd_default_set_arch_mach (stdoutput
, bfd_arch_bpf
, bfd_mach_bpf
);
265 /* Round up a section size to the appropriate boundary. */
268 md_section_align (segT segment
, valueT size
)
270 int align
= bfd_section_alignment (segment
);
272 return ((size
+ (1 << align
) - 1) & -(1 << align
));
275 /* Return non-zero if the indicated VALUE has overflowed the maximum
276 range expressible by an signed number with the indicated number of
280 signed_overflow (offsetT value
, unsigned bits
)
283 if (bits
>= sizeof (offsetT
) * 8)
285 lim
= (offsetT
) 1 << (bits
- 1);
286 return (value
< -lim
|| value
>= lim
);
290 /* Functions concerning relocs. */
292 /* The location from which a PC relative jump should be calculated,
293 given a PC relative reloc. */
296 md_pcrel_from_section (fixS
*fixP
, segT sec
)
298 if (fixP
->fx_addsy
!= (symbolS
*) NULL
299 && (! S_IS_DEFINED (fixP
->fx_addsy
)
300 || (S_GET_SEGMENT (fixP
->fx_addsy
) != sec
)
301 || S_IS_EXTERNAL (fixP
->fx_addsy
)
302 || S_IS_WEAK (fixP
->fx_addsy
)))
304 /* The symbol is undefined (or is defined but not in this section).
305 Let the linker figure it out. */
309 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
312 /* Write a value out to the object file, using the appropriate endianness. */
315 md_number_to_chars (char * buf
, valueT val
, int n
)
317 if (target_big_endian
)
318 number_to_chars_bigendian (buf
, val
, n
);
320 number_to_chars_littleendian (buf
, val
, n
);
324 tc_gen_reloc (asection
*sec ATTRIBUTE_UNUSED
, fixS
*fixP
)
326 bfd_reloc_code_real_type r_type
= fixP
->fx_r_type
;
329 reloc
= XNEW (arelent
);
333 r_type
= (r_type
== BFD_RELOC_8
? BFD_RELOC_8_PCREL
334 : r_type
== BFD_RELOC_16
? BFD_RELOC_16_PCREL
335 : r_type
== BFD_RELOC_24
? BFD_RELOC_24_PCREL
336 : r_type
== BFD_RELOC_32
? BFD_RELOC_32_PCREL
337 : r_type
== BFD_RELOC_64
? BFD_RELOC_64_PCREL
341 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, r_type
);
343 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
345 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
346 _("relocation is not supported"));
350 //XXX gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
352 reloc
->sym_ptr_ptr
= XNEW (asymbol
*);
353 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixP
->fx_addsy
);
355 /* Use fx_offset for these cases. */
356 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
357 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
)
358 reloc
->addend
= fixP
->fx_offset
;
360 reloc
->addend
= fixP
->fx_addnumber
;
362 reloc
->address
= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
367 /* Relaxations supported by this assembler. */
369 #define RELAX_BRANCH_ENCODE(uncond, constant, length) \
372 | ((uncond) ? 1 : 0) \
373 | ((constant) ? 2 : 0) \
376 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
377 #define RELAX_BRANCH_LENGTH(i) (((i) >> 2) & 0xff)
378 #define RELAX_BRANCH_CONST(i) (((i) & 2) != 0)
379 #define RELAX_BRANCH_UNCOND(i) (((i) & 1) != 0)
382 /* Compute the length of a branch seuqence, and adjust the stored
383 length accordingly. If FRAG is NULL, the worst-case length is
387 relaxed_branch_length (fragS
*fragp
, asection
*sec
, int update
)
394 uncond
= RELAX_BRANCH_UNCOND (fragp
->fr_subtype
);
395 length
= RELAX_BRANCH_LENGTH (fragp
->fr_subtype
);
398 /* Length is the same for both JA and JAL. */
402 if (RELAX_BRANCH_CONST (fragp
->fr_subtype
))
404 int64_t val
= fragp
->fr_offset
;
406 if (val
< -32768 || val
> 32767)
411 else if (fragp
->fr_symbol
!= NULL
412 && S_IS_DEFINED (fragp
->fr_symbol
)
413 && !S_IS_WEAK (fragp
->fr_symbol
)
414 && sec
== S_GET_SEGMENT (fragp
->fr_symbol
))
416 offsetT val
= S_GET_VALUE (fragp
->fr_symbol
) + fragp
->fr_offset
;
418 /* Convert to 64-bit words, minus one. */
421 /* See if it fits in the signed 16-bits field. */
422 if (val
< -32768 || val
> 32767)
428 /* Use short version, and let the linker relax instead, if
429 appropriate and if supported. */
434 fragp
->fr_subtype
= RELAX_BRANCH_ENCODE (uncond
,
435 RELAX_BRANCH_CONST (fragp
->fr_subtype
),
441 /* Estimate the size of a variant frag before relaxing. */
444 md_estimate_size_before_relax (fragS
*fragp
, asection
*sec
)
446 return (fragp
->fr_var
= relaxed_branch_length (fragp
, sec
, true));
449 /* Read a BPF instruction word from BUF. */
452 read_insn_word (bfd_byte
*buf
)
454 return bfd_getb64 (buf
);
457 /* Write the given signed 16-bit value in the given BUFFER using the
458 target endianness. */
461 encode_int16 (int16_t value
, char *buffer
)
463 uint16_t val
= value
;
465 if (target_big_endian
)
467 buffer
[0] = (val
>> 8) & 0xff;
468 buffer
[1] = val
& 0xff;
472 buffer
[1] = (val
>> 8) & 0xff;
473 buffer
[0] = val
& 0xff;
477 /* Write the given signed 32-bit value in the given BUFFER using the
478 target endianness. */
481 encode_int32 (int32_t value
, char *buffer
)
483 uint32_t val
= value
;
485 if (target_big_endian
)
487 buffer
[0] = (val
>> 24) & 0xff;
488 buffer
[1] = (val
>> 16) & 0xff;
489 buffer
[2] = (val
>> 8) & 0xff;
490 buffer
[3] = val
& 0xff;
494 buffer
[3] = (val
>> 24) & 0xff;
495 buffer
[2] = (val
>> 16) & 0xff;
496 buffer
[1] = (val
>> 8) & 0xff;
497 buffer
[0] = value
& 0xff;
501 /* Write a BPF instruction to BUF. */
504 write_insn_bytes (bfd_byte
*buf
, char *bytes
)
508 for (i
= 0; i
< 8; ++i
)
509 md_number_to_chars ((char *) buf
+ i
, (valueT
) bytes
[i
], 1);
512 /* *FRAGP has been relaxed to its final size, and now needs to have
513 the bytes inside it modified to conform to the new size.
515 Called after relaxation is finished.
516 fragP->fr_type == rs_machine_dependent.
517 fragP->fr_subtype is the subtype of what the address relaxed to. */
520 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
521 segT sec ATTRIBUTE_UNUSED
,
522 fragS
*fragp ATTRIBUTE_UNUSED
)
524 bfd_byte
*buf
= (bfd_byte
*) fragp
->fr_literal
+ fragp
->fr_fix
;
528 int disp_is_known
= 0;
529 int64_t disp_to_target
= 0;
533 gas_assert (RELAX_BRANCH_P (fragp
->fr_subtype
));
535 /* Expression to be used in any resulting relocation in the relaxed
538 exp
.X_add_symbol
= fragp
->fr_symbol
;
539 exp
.X_add_number
= fragp
->fr_offset
;
541 gas_assert (fragp
->fr_var
== RELAX_BRANCH_LENGTH (fragp
->fr_subtype
));
543 /* Read an instruction word from the instruction to be relaxed, and
545 word
= read_insn_word (buf
);
546 code
= (word
>> 60) & 0xf;
548 /* Determine whether the 16-bit displacement to the target is known
550 if (RELAX_BRANCH_CONST (fragp
->fr_subtype
))
552 disp_to_target
= fragp
->fr_offset
;
555 else if (fragp
->fr_symbol
!= NULL
556 && S_IS_DEFINED (fragp
->fr_symbol
)
557 && !S_IS_WEAK (fragp
->fr_symbol
)
558 && sec
== S_GET_SEGMENT (fragp
->fr_symbol
))
560 offsetT val
= S_GET_VALUE (fragp
->fr_symbol
) + fragp
->fr_offset
;
561 /* Convert to 64-bit blocks minus one. */
562 disp_to_target
= (val
- 8) / 8;
566 /* The displacement should fit in a signed 32-bit number. */
567 if (disp_is_known
&& signed_overflow (disp_to_target
, 32))
568 as_bad_where (fragp
->fr_file
, fragp
->fr_line
,
569 _("signed instruction operand out of range, shall fit in 32 bits"));
571 /* Now relax particular jump instructions. */
572 if (code
== BPF_CODE_JA
)
574 /* Unconditional jump.
577 gas_assert (RELAX_BRANCH_UNCOND (fragp
->fr_subtype
));
581 if (disp_to_target
>= -32768 && disp_to_target
<= 32767)
583 /* 16-bit disp is known and in range. Install a fixup
584 for the disp16 if the branch value is not constant.
585 This will be resolved by the assembler and units
588 if (!RELAX_BRANCH_CONST (fragp
->fr_subtype
))
590 /* Install fixup for the JA. */
591 reloc_howto_type
*reloc_howto
592 = bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
596 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*) fragp
->fr_literal
,
597 bfd_get_reloc_size (reloc_howto
),
599 reloc_howto
->pc_relative
,
600 BFD_RELOC_BPF_DISP16
);
601 fixp
->fx_file
= fragp
->fr_file
;
602 fixp
->fx_line
= fragp
->fr_line
;
607 /* 16-bit disp is known and not in range. Turn the JA
608 into a JAL with a 32-bit displacement. */
611 bytes
[0] = ((BPF_CLASS_JMP32
|BPF_CODE_JA
|BPF_SRC_K
) >> 56) & 0xff;
612 bytes
[1] = (word
>> 48) & 0xff;
613 bytes
[2] = 0; /* disp16 high */
614 bytes
[3] = 0; /* disp16 lo */
615 encode_int32 ((int32_t) disp_to_target
, bytes
+ 4);
617 write_insn_bytes (buf
, bytes
);
622 /* The displacement to the target is not known. Do not
623 relax. The linker will maybe do it if it chooses to. */
625 reloc_howto_type
*reloc_howto
= NULL
;
627 gas_assert (!RELAX_BRANCH_CONST (fragp
->fr_subtype
));
629 /* Install fixup for the JA. */
630 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
634 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*) fragp
->fr_literal
,
635 bfd_get_reloc_size (reloc_howto
),
637 reloc_howto
->pc_relative
,
638 BFD_RELOC_BPF_DISP16
);
639 fixp
->fx_file
= fragp
->fr_file
;
640 fixp
->fx_line
= fragp
->fr_line
;
648 JXX d16 -> JXX +1; JA +1; JAL d32 */
650 gas_assert (!RELAX_BRANCH_UNCOND (fragp
->fr_subtype
));
654 if (disp_to_target
>= -32768 && disp_to_target
<= 32767)
656 /* 16-bit disp is known and in range. Install a fixup
657 for the disp16 if the branch value is not constant.
658 This will be resolved by the assembler and units
661 if (!RELAX_BRANCH_CONST (fragp
->fr_subtype
))
663 /* Install fixup for the branch. */
664 reloc_howto_type
*reloc_howto
665 = bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
669 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*) fragp
->fr_literal
,
670 bfd_get_reloc_size (reloc_howto
),
672 reloc_howto
->pc_relative
,
673 BFD_RELOC_BPF_DISP16
);
674 fixp
->fx_file
= fragp
->fr_file
;
675 fixp
->fx_line
= fragp
->fr_line
;
682 /* 16-bit disp is known and not in range. Turn the JXX
683 into a sequence JXX +1; JA +1; JAL d32. */
687 /* First, set the 16-bit offset in the current
690 if (target_big_endian
)
691 bfd_putb16 (1, buf
+ 2);
693 bfd_putl16 (1, buf
+ 2);
696 /* Then, write the JA + 1 */
698 bytes
[0] = 0x05; /* JA */
700 encode_int16 (1, bytes
+ 2);
705 write_insn_bytes (buf
, bytes
);
708 /* Finally, write the JAL to the target. */
710 bytes
[0] = ((BPF_CLASS_JMP32
|BPF_CODE_JA
|BPF_SRC_K
) >> 56) & 0xff;
714 encode_int32 ((int32_t) disp_to_target
, bytes
+ 4);
715 write_insn_bytes (buf
, bytes
);
721 /* The displacement to the target is not known. Do not
722 relax. The linker will maybe do it if it chooses to. */
724 reloc_howto_type
*reloc_howto
= NULL
;
726 gas_assert (!RELAX_BRANCH_CONST (fragp
->fr_subtype
));
728 /* Install fixup for the conditional jump. */
729 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
733 fixp
= fix_new_exp (fragp
, buf
- (bfd_byte
*) fragp
->fr_literal
,
734 bfd_get_reloc_size (reloc_howto
),
736 reloc_howto
->pc_relative
,
737 BFD_RELOC_BPF_DISP16
);
738 fixp
->fx_file
= fragp
->fr_file
;
739 fixp
->fx_line
= fragp
->fr_line
;
744 gas_assert (buf
== (bfd_byte
*)fragp
->fr_literal
745 + fragp
->fr_fix
+ fragp
->fr_var
);
747 fragp
->fr_fix
+= fragp
->fr_var
;
751 /* Apply a fixS (fixup of an instruction or data that we didn't have
752 enough info to complete immediately) to the data in a frag. */
755 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
757 char *where
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
759 switch (fixP
->fx_r_type
)
761 case BFD_RELOC_BPF_DISP16
:
762 /* Convert from bytes to number of 64-bit words to the target,
764 *valP
= (((long) (*valP
)) - 8) / 8;
766 case BFD_RELOC_BPF_DISPCALL32
:
767 case BFD_RELOC_BPF_DISP32
:
768 /* Convert from bytes to number of 64-bit words to the target,
770 *valP
= (((long) (*valP
)) - 8) / 8;
772 if (fixP
->fx_r_type
== BFD_RELOC_BPF_DISPCALL32
)
774 /* eBPF supports two kind of CALL instructions: the so
775 called pseudo calls ("bpf to bpf") and external calls
778 Both kind of calls use the same instruction (CALL).
779 However, external calls are constructed by passing a
780 constant argument to the instruction, whereas pseudo
781 calls result from expressions involving symbols. In
782 practice, instructions requiring a fixup are interpreted
783 as pseudo-calls. If we are executing this code, this is
786 The kernel expects for pseudo-calls to be annotated by
787 having BPF_PSEUDO_CALL in the SRC field of the
788 instruction. But beware the infamous nibble-swapping of
789 eBPF and take endianness into account here.
791 Note that the CALL instruction has only one operand, so
792 this code is executed only once per instruction. */
793 md_number_to_chars (where
+ 1, target_big_endian
? 0x01 : 0x10, 1);
796 case BFD_RELOC_16_PCREL
:
797 /* Convert from bytes to number of 64-bit words to the target,
799 *valP
= (((long) (*valP
)) - 8) / 8;
805 if (fixP
->fx_addsy
== (symbolS
*) NULL
)
810 /* We're finished with this fixup. Install it because
811 bfd_install_relocation won't be called to do it. */
812 switch (fixP
->fx_r_type
)
815 md_number_to_chars (where
, *valP
, 1);
818 md_number_to_chars (where
, *valP
, 2);
821 md_number_to_chars (where
, *valP
, 4);
824 md_number_to_chars (where
, *valP
, 8);
826 case BFD_RELOC_BPF_DISP16
:
827 md_number_to_chars (where
+ 2, (uint16_t) *valP
, 2);
829 case BFD_RELOC_BPF_DISP32
:
830 case BFD_RELOC_BPF_DISPCALL32
:
831 md_number_to_chars (where
+ 4, (uint32_t) *valP
, 4);
833 case BFD_RELOC_16_PCREL
:
834 md_number_to_chars (where
+ 2, (uint32_t) *valP
, 2);
837 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
838 _("internal error: can't install fix for reloc type %d (`%s')"),
839 fixP
->fx_r_type
, bfd_get_reloc_code_name (fixP
->fx_r_type
));
844 /* Tuck `value' away for use by tc_gen_reloc.
845 See the comment describing fx_addnumber in write.h.
846 This field is misnamed (or misused :-). */
847 fixP
->fx_addnumber
= *valP
;
851 /* Instruction writing routines. */
853 /* Encode a BPF instruction in the given buffer BYTES. Non-constant
854 immediates are encoded as zeroes. */
857 encode_insn (struct bpf_insn
*insn
, char *bytes
, int relaxed
)
861 /* Zero all the bytes. */
862 memset (bytes
, 0, 16);
864 /* First encode the opcodes. Note that we have to handle the
865 endianness groups of the BPF instructions: 8 | 4 | 4 | 16 |
867 if (target_big_endian
)
870 bytes
[0] = (insn
->opcode
>> 56) & 0xff;
872 bytes
[1] = (insn
->opcode
>> 48) & 0xff;
874 bytes
[2] = (insn
->opcode
>> 40) & 0xff;
875 bytes
[3] = (insn
->opcode
>> 32) & 0xff;
877 bytes
[4] = (insn
->opcode
>> 24) & 0xff;
878 bytes
[5] = (insn
->opcode
>> 16) & 0xff;
879 bytes
[6] = (insn
->opcode
>> 8) & 0xff;
880 bytes
[7] = insn
->opcode
& 0xff;
885 bytes
[0] = (insn
->opcode
>> 56) & 0xff;
887 bytes
[1] = (((((insn
->opcode
>> 48) & 0xff) & 0xf) << 4)
888 | (((insn
->opcode
>> 48) & 0xff) & 0xf));
890 bytes
[3] = (insn
->opcode
>> 40) & 0xff;
891 bytes
[2] = (insn
->opcode
>> 32) & 0xff;
893 bytes
[7] = (insn
->opcode
>> 24) & 0xff;
894 bytes
[6] = (insn
->opcode
>> 16) & 0xff;
895 bytes
[5] = (insn
->opcode
>> 8) & 0xff;
896 bytes
[4] = insn
->opcode
& 0xff;
899 /* Now the registers. */
900 src
= insn
->has_src
? insn
->src
: 0;
901 dst
= insn
->has_dst
? insn
->dst
: 0;
903 if (target_big_endian
)
904 bytes
[1] = ((dst
& 0xf) << 4) | (src
& 0xf);
906 bytes
[1] = ((src
& 0xf) << 4) | (dst
& 0xf);
908 /* Now the immediates that are known to be constant. */
910 if (insn
->has_imm32
&& insn
->imm32
.X_op
== O_constant
)
912 int64_t imm
= insn
->imm32
.X_add_number
;
914 if (signed_overflow (imm
, 32))
915 as_bad (_("signed immediate out of range, shall fit in 32 bits"));
917 encode_int32 (insn
->imm32
.X_add_number
, bytes
+ 4);
920 if (insn
->has_disp32
&& insn
->disp32
.X_op
== O_constant
)
922 int64_t disp
= insn
->disp32
.X_add_number
;
924 if (signed_overflow (disp
, 32))
925 as_bad (_("signed pc-relative offset out of range, shall fit in 32 bits"));
927 encode_int32 (insn
->disp32
.X_add_number
, bytes
+ 4);
930 if (insn
->has_offset16
&& insn
->offset16
.X_op
== O_constant
)
932 int64_t offset
= insn
->offset16
.X_add_number
;
934 if (signed_overflow (offset
, 16))
935 as_bad (_("signed pc-relative offset out of range, shall fit in 16 bits"));
937 encode_int16 (insn
->offset16
.X_add_number
, bytes
+ 2);
940 if (insn
->has_disp16
&& insn
->disp16
.X_op
== O_constant
)
942 int64_t disp
= insn
->disp16
.X_add_number
;
944 if (!relaxed
&& signed_overflow (disp
, 16))
945 as_bad (_("signed pc-relative offset out of range, shall fit in 16 bits"));
947 encode_int16 (insn
->disp16
.X_add_number
, bytes
+ 2);
950 if (insn
->has_imm64
&& insn
->imm64
.X_op
== O_constant
)
952 uint64_t imm64
= insn
->imm64
.X_add_number
;
954 if (target_big_endian
)
956 bytes
[12] = (imm64
>> 56) & 0xff;
957 bytes
[13] = (imm64
>> 48) & 0xff;
958 bytes
[14] = (imm64
>> 40) & 0xff;
959 bytes
[15] = (imm64
>> 32) & 0xff;
960 bytes
[4] = (imm64
>> 24) & 0xff;
961 bytes
[5] = (imm64
>> 16) & 0xff;
962 bytes
[6] = (imm64
>> 8) & 0xff;
963 bytes
[7] = imm64
& 0xff;
967 bytes
[15] = (imm64
>> 56) & 0xff;
968 bytes
[14] = (imm64
>> 48) & 0xff;
969 bytes
[13] = (imm64
>> 40) & 0xff;
970 bytes
[12] = (imm64
>> 32) & 0xff;
971 bytes
[7] = (imm64
>> 24) & 0xff;
972 bytes
[6] = (imm64
>> 16) & 0xff;
973 bytes
[5] = (imm64
>> 8) & 0xff;
974 bytes
[4] = imm64
& 0xff;
979 /* Install the fixups in INSN in their proper location in the
980 specified FRAG at the location pointed by WHERE. */
983 install_insn_fixups (struct bpf_insn
*insn
, fragS
*frag
, long where
)
987 switch (insn
->imm64
.X_op
)
993 reloc_howto_type
*reloc_howto
;
996 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_64
);
1000 size
= bfd_get_reloc_size (reloc_howto
);
1002 fix_new_exp (frag
, where
,
1003 size
, &insn
->imm64
, reloc_howto
->pc_relative
,
1008 /* Already handled in encode_insn. */
1015 if (insn
->has_imm32
)
1017 switch (insn
->imm32
.X_op
)
1024 reloc_howto_type
*reloc_howto
;
1027 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_32
);
1031 size
= bfd_get_reloc_size (reloc_howto
);
1033 fix_new_exp (frag
, where
+ 4,
1034 size
, &insn
->imm32
, reloc_howto
->pc_relative
,
1039 /* Already handled in encode_insn. */
1046 if (insn
->has_disp32
)
1048 switch (insn
->disp32
.X_op
)
1054 reloc_howto_type
*reloc_howto
;
1056 unsigned int bfd_reloc
1057 = (insn
->id
== BPF_INSN_CALL
1058 ? BFD_RELOC_BPF_DISPCALL32
1059 : BFD_RELOC_BPF_DISP32
);
1061 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, bfd_reloc
);
1065 size
= bfd_get_reloc_size (reloc_howto
);
1067 fix_new_exp (frag
, where
,
1068 size
, &insn
->disp32
, reloc_howto
->pc_relative
,
1073 /* Already handled in encode_insn. */
1080 if (insn
->has_offset16
)
1082 switch (insn
->offset16
.X_op
)
1088 reloc_howto_type
*reloc_howto
;
1091 /* XXX we really need a new pc-rel offset in bytes
1092 relocation for this. */
1093 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
1097 size
= bfd_get_reloc_size (reloc_howto
);
1099 fix_new_exp (frag
, where
,
1100 size
, &insn
->offset16
, reloc_howto
->pc_relative
,
1101 BFD_RELOC_BPF_DISP16
);
1105 /* Already handled in encode_insn. */
1112 if (insn
->has_disp16
)
1114 switch (insn
->disp16
.X_op
)
1120 reloc_howto_type
*reloc_howto
;
1123 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_BPF_DISP16
);
1127 size
= bfd_get_reloc_size (reloc_howto
);
1129 fix_new_exp (frag
, where
,
1130 size
, &insn
->disp16
, reloc_howto
->pc_relative
,
1131 BFD_RELOC_BPF_DISP16
);
1135 /* Already handled in encode_insn. */
1144 /* Add a new insn to the list of instructions. */
1147 add_fixed_insn (struct bpf_insn
*insn
)
1149 char *this_frag
= frag_more (insn
->size
);
1153 /* First encode the known parts of the instruction, including
1154 opcodes and constant immediates, and write them to the frag. */
1155 encode_insn (insn
, bytes
, 0 /* relax */);
1156 for (i
= 0; i
< insn
->size
; ++i
)
1157 md_number_to_chars (this_frag
+ i
, (valueT
) bytes
[i
], 1);
1159 /* Now install the instruction fixups. */
1160 install_insn_fixups (insn
, frag_now
,
1161 this_frag
- frag_now
->fr_literal
);
1164 /* Add a new relaxable to the list of instructions. */
1167 add_relaxed_insn (struct bpf_insn
*insn
, expressionS
*exp
)
1172 unsigned worst_case
= relaxed_branch_length (NULL
, NULL
, 0);
1173 unsigned best_case
= insn
->size
;
1175 /* We only support relaxing branches, for the moment. */
1176 relax_substateT subtype
1177 = RELAX_BRANCH_ENCODE (insn
->id
== BPF_INSN_JAR
,
1178 exp
->X_op
== O_constant
,
1181 frag_grow (worst_case
);
1182 this_frag
= frag_more (0);
1184 /* First encode the known parts of the instruction, including
1185 opcodes and constant immediates, and write them to the frag. */
1186 encode_insn (insn
, bytes
, 1 /* relax */);
1187 for (i
= 0; i
< insn
->size
; ++i
)
1188 md_number_to_chars (this_frag
+ i
, (valueT
) bytes
[i
], 1);
1190 /* Note that instruction fixups will be applied once the frag is
1191 relaxed, in md_convert_frag. */
1192 frag_var (rs_machine_dependent
,
1193 worst_case
, best_case
,
1194 subtype
, exp
->X_add_symbol
, exp
->X_add_number
/* offset */,
1199 /* Parse an operand expression. Returns the first character that is
1200 not part of the expression, or NULL in case of parse error.
1202 See md_operand below to see how exp_parse_failed is used. */
1204 static int exp_parse_failed
= 0;
1207 parse_expression (char *s
, expressionS
*exp
)
1209 char *saved_input_line_pointer
= input_line_pointer
;
1212 exp_parse_failed
= 0;
1213 input_line_pointer
= s
;
1215 s
= input_line_pointer
;
1216 input_line_pointer
= saved_input_line_pointer
;
1218 switch (exp
->X_op
== O_absent
|| exp_parse_failed
)
1221 /* The expression parser may consume trailing whitespaces. We have
1222 to undo that since the instruction templates may be expecting
1223 these whitespaces. */
1226 for (p
= s
- 1; p
>= saved_s
&& *p
== ' '; --p
)
1233 /* Parse a BPF register name and return the corresponding register
1234 number. Return NULL in case of parse error, or a pointer to the
1235 first character in S that is not part of the register name. */
1238 parse_bpf_register (char *s
, char rw
, uint8_t *regno
)
1240 if (asm_dialect
== DIALECT_NORMAL
)
1247 if (*s
== 'f' && *(s
+ 1) == 'p')
1261 if (*(s
+ 1) == '0')
1272 else if (*s
>= '0' && *s
<= '9')
1281 /* Collect a parse error message. */
1283 static int partial_match_length
= 0;
1284 static char *errmsg
= NULL
;
1287 parse_error (int length
, const char *fmt
, ...)
1289 if (length
> partial_match_length
)
1294 va_start (args
, fmt
);
1295 errmsg
= xvasprintf (fmt
, args
);
1297 partial_match_length
= length
;
1301 /* Assemble a machine instruction in STR and emit the frags/bytes it
1305 md_assemble (char *str ATTRIBUTE_UNUSED
)
1307 /* There are two different syntaxes that can be used to write BPF
1308 instructions. One is very conventional and like any other
1309 assembly language where each instruction is conformed by an
1310 instruction mnemonic followed by its operands. This is what we
1311 call the "normal" syntax. The other syntax tries to look like C
1312 statements. We have to support both syntaxes in this assembler.
1314 One of the many nuisances introduced by this eccentricity is that
1315 in the pseudo-c syntax it is not possible to hash the opcodes
1316 table by instruction mnemonic, because there is none. So we have
1317 no other choice than to try to parse all instruction opcodes
1318 until one matches. This is slow.
1320 Another problem is that emitting detailed diagnostics becomes
1321 tricky, since the lack of mnemonic means it is not clear what
1322 instruction was intended by the user, and we cannot emit
1323 diagnostics for every attempted template. So if an instruction
1324 is not parsed, we report the diagnostic corresponding to the
1325 partially parsed instruction that was matched further. */
1327 unsigned int idx
= 0;
1328 struct bpf_insn insn
;
1329 const struct bpf_opcode
*opcode
;
1331 /* Initialize the global diagnostic variables. See the parse_error
1333 partial_match_length
= 0;
1336 #define PARSE_ERROR(...) parse_error (s - str, __VA_ARGS__)
1338 while ((opcode
= bpf_get_opcode (idx
++)) != NULL
)
1342 const char *template
1343 = (asm_dialect
== DIALECT_PSEUDOC
? opcode
->pseudoc
: opcode
->normal
);
1345 /* Do not try to match opcodes with a higher version than the
1346 selected ISA spec. */
1347 if (opcode
->version
> isa_spec
)
1350 memset (&insn
, 0, sizeof (struct bpf_insn
));
1352 for (s
= str
, p
= template; *p
!= '\0';)
1356 /* Expect zero or more spaces. */
1357 while (*s
!= '\0' && (*s
== ' ' || *s
== '\t'))
1363 if (*(p
+ 1) == '%')
1367 PARSE_ERROR ("expected '%%'");
1373 else if (*(p
+ 1) == 'w')
1375 /* Expect zero or more spaces. */
1376 while (*s
!= '\0' && (*s
== ' ' || *s
== '\t'))
1380 else if (*(p
+ 1) == 'W')
1382 /* Expect one or more spaces. */
1383 if (*s
!= ' ' && *s
!= '\t')
1385 PARSE_ERROR ("expected white space, got '%s'",
1389 while (*s
!= '\0' && (*s
== ' ' || *s
== '\t'))
1393 else if (strncmp (p
, "%dr", 3) == 0)
1396 char *news
= parse_bpf_register (s
, 'r', ®no
);
1398 if (news
== NULL
|| (insn
.has_dst
&& regno
!= insn
.dst
))
1401 PARSE_ERROR ("expected register r%d, got r%d",
1404 PARSE_ERROR ("expected register name, got '%s'", s
);
1412 else if (strncmp (p
, "%sr", 3) == 0)
1415 char *news
= parse_bpf_register (s
, 'r', ®no
);
1417 if (news
== NULL
|| (insn
.has_src
&& regno
!= insn
.src
))
1420 PARSE_ERROR ("expected register r%d, got r%d",
1423 PARSE_ERROR ("expected register name, got '%s'", s
);
1431 else if (strncmp (p
, "%dw", 3) == 0)
1434 char *news
= parse_bpf_register (s
, 'w', ®no
);
1436 if (news
== NULL
|| (insn
.has_dst
&& regno
!= insn
.dst
))
1439 PARSE_ERROR ("expected register r%d, got r%d",
1442 PARSE_ERROR ("expected register name, got '%s'", s
);
1450 else if (strncmp (p
, "%sw", 3) == 0)
1453 char *news
= parse_bpf_register (s
, 'w', ®no
);
1455 if (news
== NULL
|| (insn
.has_src
&& regno
!= insn
.src
))
1458 PARSE_ERROR ("expected register r%d, got r%d",
1461 PARSE_ERROR ("expected register name, got '%s'", s
);
1469 else if (strncmp (p
, "%i32", 4) == 0
1470 || strncmp (p
, "%I32", 4) == 0)
1474 while (*s
== ' ' || *s
== '\t')
1476 if (*s
!= '+' && *s
!= '-')
1478 PARSE_ERROR ("expected `+' or `-', got `%c'", *s
);
1483 s
= parse_expression (s
, &insn
.imm32
);
1486 PARSE_ERROR ("expected signed 32-bit immediate");
1492 else if (strncmp (p
, "%o16", 4) == 0)
1494 while (*s
== ' ' || *s
== '\t')
1496 if (*s
!= '+' && *s
!= '-')
1498 PARSE_ERROR ("expected `+' or `-', got `%c'", *s
);
1502 s
= parse_expression (s
, &insn
.offset16
);
1505 PARSE_ERROR ("expected signed 16-bit offset");
1508 insn
.has_offset16
= 1;
1511 else if (strncmp (p
, "%d16", 4) == 0)
1513 s
= parse_expression (s
, &insn
.disp16
);
1516 PARSE_ERROR ("expected signed 16-bit displacement");
1519 insn
.has_disp16
= 1;
1520 insn
.is_relaxable
= 1;
1523 else if (strncmp (p
, "%d32", 4) == 0)
1525 s
= parse_expression (s
, &insn
.disp32
);
1528 PARSE_ERROR ("expected signed 32-bit displacement");
1531 insn
.has_disp32
= 1;
1534 else if (strncmp (p
, "%i64", 4) == 0)
1536 s
= parse_expression (s
, &insn
.imm64
);
1539 PARSE_ERROR ("expected signed 64-bit immediate");
1547 as_fatal (_("invalid %%-tag in BPF opcode '%s'\n"), template);
1551 /* Match a literal character. */
1555 PARSE_ERROR ("expected '%c'", *p
);
1558 /* This is to workaround a bug in as_bad. */
1565 PARSE_ERROR ("expected '%c', got '%s'", *p
, tmp
);
1568 PARSE_ERROR ("expected '%c', got '%c'", *p
, *s
);
1578 /* Allow white spaces at the end of the line. */
1579 while (*s
!= '\0' && (*s
== ' ' || *s
== '\t'))
1582 /* We parsed an instruction successfully. */
1584 PARSE_ERROR ("extra junk at end of line");
1590 as_bad (_("unrecognized instruction `%s'"), str
);
1593 as_bad ("%s", errmsg
);
1599 insn
.id
= opcode
->id
;
1600 insn
.opcode
= opcode
->opcode
;
1604 /* Generate the frags and fixups for the parsed instruction. */
1605 if (do_relax
&& isa_spec
>= BPF_V4
&& insn
.is_relaxable
)
1607 expressionS
*relaxable_exp
= NULL
;
1609 if (insn
.has_disp16
)
1610 relaxable_exp
= &insn
.disp16
;
1614 add_relaxed_insn (&insn
, relaxable_exp
);
1617 add_fixed_insn (&insn
);
1619 /* Emit DWARF2 debugging information. */
1620 dwarf2_emit_insn (insn
.size
);
1623 /* Parse an operand that is machine-specific. */
1626 md_operand (expressionS
*expressionP
)
1628 /* If this hook is invoked it means GAS failed to parse a generic
1629 expression. We should inhibit the as_bad in expr.c, so we can fail
1630 while parsing instruction alternatives. To do that, we change the
1631 expression to not have an O_absent. But then we also need to set
1632 exp_parse_failed to parse_expression above does the right thing. */
1633 ++input_line_pointer
;
1634 expressionP
->X_op
= O_constant
;
1635 expressionP
->X_add_number
= 0;
1636 exp_parse_failed
= 1;
1640 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1646 /* Turn a string in input_line_pointer into a floating point constant
1647 of type TYPE, and store the appropriate bytes in *LITP. The number
1648 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1649 returned, or NULL on OK. */
1652 md_atof (int type
, char *litP
, int *sizeP
)
1654 return ieee_md_atof (type
, litP
, sizeP
, false);
1658 /* Determine whether the equal sign in the given string corresponds to
1659 a BPF instruction, i.e. when it is not to be considered a symbol
1663 bpf_tc_equal_in_insn (int c ATTRIBUTE_UNUSED
, char *str ATTRIBUTE_UNUSED
)
1667 /* Only pseudo-c instructions can have equal signs, and of these,
1668 all that could be confused with a symbol assignment all start
1669 with a register name. */
1670 if (asm_dialect
== DIALECT_PSEUDOC
)
1672 char *w
= parse_bpf_register (str
, 'w', ®no
);
1673 char *r
= parse_bpf_register (str
, 'r', ®no
);
1675 if ((w
!= NULL
&& *w
== '\0')
1676 || (r
!= NULL
&& *r
== '\0'))
1683 /* Some special processing for a BPF ELF file. */
1686 bpf_elf_final_processing (void)
1688 /* Annotate the BPF ISA version in the ELF flag bits. */
1689 elf_elfheader (stdoutput
)->e_flags
|= (isa_spec
& EF_BPF_CPUVER
);