Skip to content

Commit

Permalink
bpf: gas,include,opcode: add suppor for instructions BSWAP{16,32,64}
Browse files Browse the repository at this point in the history
This patch adds support for the BPF V4 ISA byte swap instructions to
opcodes, assembler and disassembler.

Tested in bpf-unknown-none.

include/ChangeLog:

2023-07-24  Jose E. Marchesi  <[email protected]>

	* opcode/bpf.h (BPF_IMM32_BSWAP16): Define.
	(BPF_IMM32_BSWAP32): Likewise.
	(BPF_IMM32_BSWAP64): Likewise.
	(enum bpf_insn_id): New entries BPF_INSN_BSWAP{16,32,64}.

opcodes/ChangeLog:

2023-07-24  Jose E. Marchesi  <[email protected]>

	* bpf-opc.c (bpf_opcodes): Add entries for the BSWAP*
	instructions.

gas/ChangeLog:

2023-07-24  Jose E. Marchesi  <[email protected]>

	* doc/c-bpf.texi (BPF Instructions): Document BSWAP* instructions.
	* testsuite/gas/bpf/alu.s: Test BSWAP{16,32,64} instructions.
	* testsuite/gas/bpf/alu.d: Likewise.
	* testsuite/gas/bpf/alu-be.d: Likewise.
	* testsuite/gas/bpf/alu-pseudoc.s: Likewise.
	* testsuite/gas/bpf/alu-pseudoc.d: Likewise.
	* testsuite/gas/bpf/alu-be-pseudoc.d: Likewise.
  • Loading branch information
jemarch committed Jul 24, 2023
1 parent a50ead7 commit 5cbe549
Show file tree
Hide file tree
Showing 12 changed files with 74 additions and 0 deletions.
10 changes: 10 additions & 0 deletions gas/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2023-07-24 Jose E. Marchesi <[email protected]>

* doc/c-bpf.texi (BPF Instructions): Document BSWAP* instructions.
* testsuite/gas/bpf/alu.s: Test BSWAP{16,32,64} instructions.
* testsuite/gas/bpf/alu.d: Likewise.
* testsuite/gas/bpf/alu-be.d: Likewise.
* testsuite/gas/bpf/alu-pseudoc.s: Likewise.
* testsuite/gas/bpf/alu-pseudoc.d: Likewise.
* testsuite/gas/bpf/alu-be-pseudoc.d: Likewise.

2023-07-24 Jose E. Marchesi <[email protected]>

* doc/c-bpf.texi (BPF Instructions): The pseudoc syntax for MOVS*
Expand Down
20 changes: 20 additions & 0 deletions gas/doc/c-bpf.texi
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,26 @@ Convert the 16-bit, 32-bit or 64-bit value in @code{rd} to big-endian
and store it back in @code{rd}.
@end table

@subsection Byte swap instructions

@table @code
@item bswap rd, 16
@itemx rd = bswap16 rd
Swap the least-significant 16-bit word in @code{rd} with the
most-significant 16-bit word.

@item bswap rd, 32
@itemx rd = bswap32 rd
Swap the least-significant 32-bit word in @code{rd} with the
most-significant 32-bit word.

@item bswap rd, 64
@itemx rd = bswap64 rd
Swap the least-significant 64-bit word in @code{rd} with the
most-significant 64-bit word.
@end table


@subsection 64-bit load and pseudo maps

@table @code
Expand Down
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu-be-pseudoc.d
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ Disassembly of section .text:
1b8: bf 12 00 08 00 00 00 00 r1 = \(s8\) r2
1c0: bf 12 00 10 00 00 00 00 r1 = \(s16\) r2
1c8: bf 12 00 20 00 00 00 00 r1 = \(s32\) r2
1d0: d7 10 00 00 00 00 00 10 r1 = bswap16 r1
1d8: d7 20 00 00 00 00 00 20 r2 = bswap32 r2
1e0: d7 30 00 00 00 00 00 40 r3 = bswap64 r3
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu-be.d
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ Disassembly of section .text:
1b8: bf 12 00 08 00 00 00 00 movs %r1,%r2,8
1c0: bf 12 00 10 00 00 00 00 movs %r1,%r2,16
1c8: bf 12 00 20 00 00 00 00 movs %r1,%r2,32
1d0: d7 10 00 00 00 00 00 10 bswap %r1,16
1d8: d7 20 00 00 00 00 00 20 bswap %r2,32
1e0: d7 30 00 00 00 00 00 40 bswap %r3,64
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu-pseudoc.d
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ Disassembly of section .text:
1b8: bf 21 08 00 00 00 00 00 r1 = \(s8\) r2
1c0: bf 21 10 00 00 00 00 00 r1 = \(s16\) r2
1c8: bf 21 20 00 00 00 00 00 r1 = \(s32\) r2
1d0: d7 01 00 00 10 00 00 00 r1 = bswap16 r1
1d8: d7 02 00 00 20 00 00 00 r2 = bswap32 r2
1e0: d7 03 00 00 40 00 00 00 r3 = bswap64 r3
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu-pseudoc.s
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,6 @@
r1 = (s8) r2
r1 = (s16) r2
r1 = (s32) r2
r1 = bswap16 r1
r2 = bswap32 r2
r3 = bswap64 r3
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu.d
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,6 @@ Disassembly of section .text:
1b8: bf 21 08 00 00 00 00 00 movs %r1,%r2,8
1c0: bf 21 10 00 00 00 00 00 movs %r1,%r2,16
1c8: bf 21 20 00 00 00 00 00 movs %r1,%r2,32
1d0: d7 01 00 00 10 00 00 00 bswap %r1,16
1d8: d7 02 00 00 20 00 00 00 bswap %r2,32
1e0: d7 03 00 00 40 00 00 00 bswap %r3,64
3 changes: 3 additions & 0 deletions gas/testsuite/gas/bpf/alu.s
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,6 @@
movs %r1,%r2,8
movs %r1,%r2,16
movs %r1,%r2,32
bswap %r1, 16
bswap %r2, 32
bswap %r3, 64
7 changes: 7 additions & 0 deletions include/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2023-07-24 Jose E. Marchesi <[email protected]>

* opcode/bpf.h (BPF_IMM32_BSWAP16): Define.
(BPF_IMM32_BSWAP32): Likewise.
(BPF_IMM32_BSWAP64): Likewise.
(enum bpf_insn_id): New entries BPF_INSN_BSWAP{16,32,64}.

2023-07-24 Jose E. Marchesi <[email protected]>

* opcode/bpf.h (enum bpf_insn_id): Add entry BPF_INSN_JAL.
Expand Down
6 changes: 6 additions & 0 deletions include/opcode/bpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ typedef uint64_t bpf_insn_word;
#define BPF_IMM32_END32 ((uint64_t)0x00000020)
#define BPF_IMM32_END64 ((uint64_t)0x00000040)

#define BPF_IMM32_BSWAP16 ((uint64_t)0x00000010)
#define BPF_IMM32_BSWAP32 ((uint64_t)0x00000020)
#define BPF_IMM32_BSWAP64 ((uint64_t)0x00000040)

#define BPF_IMM32_AADD ((uint64_t)0x00000000)
#define BPF_IMM32_AOR ((uint64_t)0x00000040)
#define BPF_IMM32_AAND ((uint64_t)0x00000050)
Expand Down Expand Up @@ -178,6 +182,8 @@ enum bpf_insn_id
BPF_INSN_RSH32R, BPF_INSN_RSH32I, BPF_INSN_ARSH32R, BPF_INSN_ARSH32I,
BPF_INSN_MOVS328R, BPF_INSN_MOVS3216R, BPF_INSN_MOVS3232R,
BPF_INSN_MOV32R, BPF_INSN_MOV32I,
/* Byte swap instructions. */
BPF_INSN_BSWAP16, BPF_INSN_BSWAP32, BPF_INSN_BSWAP64,
/* Endianness conversion instructions. */
BPF_INSN_ENDLE16, BPF_INSN_ENDLE32, BPF_INSN_ENDLE64,
BPF_INSN_ENDBE16, BPF_INSN_ENDBE32, BPF_INSN_ENDBE64,
Expand Down
5 changes: 5 additions & 0 deletions opcodes/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2023-07-24 Jose E. Marchesi <[email protected]>

* bpf-opc.c (bpf_opcodes): Add entries for the BSWAP*
instructions.

2023-07-24 Jose E. Marchesi <[email protected]>

* bpf-opc.c (bpf_opcodes): Fix pseudo-c syntax for MOVS* and LDXS*
Expand Down
8 changes: 8 additions & 0 deletions opcodes/bpf-opc.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,14 @@ const struct bpf_opcode bpf_opcodes[] =
{BPF_INSN_ENDBE64, "endbe%W%dr , 64", "%dr = be64%w%dr",
BPF_V1, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU|BPF_CODE_END|BPF_SRC_X|BPF_IMM32_END64},

/* Byte-swap instructions. */
{BPF_INSN_BSWAP16, "bswap%W%dr , 16", "%dr%w=%wbswap16%w%dr",
BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP16},
{BPF_INSN_BSWAP32, "bswap%W%dr , 32", "%dr%w=%wbswap32%w%dr",
BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP32},
{BPF_INSN_BSWAP64, "bswap%W%dr , 64", "%dr%w=%wbswap64%w%dr",
BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP64},

/* 64-bit load instruction. */
{BPF_INSN_LDDW, "lddw%W%dr , %i64", "%dr = %i64%wll",
BPF_V1, BPF_CODE, BPF_CLASS_LD|BPF_SIZE_DW|BPF_MODE_IMM},
Expand Down

0 comments on commit 5cbe549

Please sign in to comment.