Skip to content

Commit

Permalink
Update isa-support table
Browse files Browse the repository at this point in the history
Match https://github.com/ietf-wg-bpf/ebpf-docs/blob/main/rst/instruction-set-opcodes.rst

Fixes #3025

Signed-off-by: Dave Thaler <dthaler1968@gmail.com>
  • Loading branch information
dthaler committed Nov 19, 2023
1 parent 8adb26f commit 479eb8a
Showing 1 changed file with 53 additions and 48 deletions.
101 changes: 53 additions & 48 deletions docs/isa-support.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ are currently supported by PREVAIL, uBPF, and bpf2c, and which bpf_conformance t
opcode src imm off description PREVAIL uBPF bpf2c conformance
====== ==== ==== ==== =================================================== ======= ==== ===== ======================
0x00 0x0 any 0 (additional immediate value) Y Y Y arsh32-high-shift
0x04 0x0 any 0 dst = (u32)(dst + imm) Y Y Y add
0x04 0x0 any 0 dst = (u32)((u32)dst + (u32)imm) Y Y Y add
0x05 0x0 0x00 any goto +offset Y Y Y exit-not-last
0x06 0x0 any 0 goto +imm Y Y Y exit-not-last
0x07 0x0 any 0 dst += imm Y Y Y add64
0x0c any 0x00 0 dst = (u32)(dst + src) Y Y Y add
0x0c any 0x00 0 dst = (u32)((u32)dst + (u32)src) Y Y Y add
0x0f any 0x00 0 dst += src Y Y Y alu64-arith
0x14 0x0 any 0 dst = (u32)(dst - imm) Y Y Y alu-arith
0x14 0x0 any 0 dst = (u32)((u32)dst - (u32)imm) Y Y Y alu-arith
0x15 0x0 any any if dst == imm goto +offset Y Y Y jeq-imm
0x16 0x0 any any if (u32)dst == imm goto +offset Y Y Y jeq32-imm
0x17 0x0 any 0 dst -= imm Y Y Y alu64-arith
Expand All @@ -26,7 +26,7 @@ opcode src imm off description P
0x18 0x4 any 0 dst = code_addr(imm) no no no ???
0x18 0x5 any 0 dst = map_by_idx(imm) no no no ???
0x18 0x6 any 0 dst = mva(map_by_idx(imm)) + next_imm no no no ???
0x1c any 0x00 0 dst = (u32)(dst - src) Y Y Y alu-arith
0x1c any 0x00 0 dst = (u32)((u32)dst - (u32)src) Y Y Y alu-arith
0x1d any 0x00 any if dst == src goto +offset Y Y Y jeq-reg
0x1e any 0x00 any if (u32)dst == (u32)src goto +offset Y Y Y jeq32-reg
0x1f any 0x00 0 dst -= src Y Y Y alu64-arith
Expand All @@ -50,18 +50,18 @@ opcode src imm off description P
0x31 any any any (deprecated, implementation-specific) no no no (none)
0x32 any any any (deprecated, implementation-specific) no no no (none)
0x33 any any any (deprecated, implementation-specific) no no no (none)
0x34 0x0 any 0 dst = (u32)((imm != 0) ? (dst / imm) : 0) Y Y Y alu-arith
0x34 0x0 any 1 dst = (u32)((imm != 0) ? (dst s/ imm) : 0) no no no ???
0x34 0x0 any 0 dst = (u32)((imm != 0) ? ((u32)dst / (u32)imm) : 0) Y Y Y alu-arith
0x34 0x0 any 1 dst = (u32)((imm != 0) ? ((s32)dst s/ imm) : 0) no no no ???
0x35 0x0 any any if dst >= imm goto +offset Y Y Y jge-imm
0x36 0x0 any any if (u32)dst >= imm goto +offset Y Y Y jge32-imm
0x37 0x0 any 0 dst = (imm != 0) ? (dst / imm) : 0 Y Y Y alu64-arith
0x37 0x0 any 0 dst = (imm != 0) ? (dst / (u32)imm) : 0 Y Y Y alu64-arith
0x37 0x0 any 1 dst = (imm != 0) ? (dst s/ imm) : 0 no no no ???
0x38 any any any (deprecated, implementation-specific) no no no (none)
0x39 any any any (deprecated, implementation-specific) no no no (none)
0x3a any any any (deprecated, implementation-specific) no no no (none)
0x3b any any any (deprecated, implementation-specific) no no no (none)
0x3c any any 0 dst = (u32)((imm != 0) ? (dst / src) : 0) Y Y Y alu-arith
0x3c any any 1 dst = (u32)((imm != 0) ? (dst s/ src) : 0) no no no ???
0x3c any 0x00 0 dst = (u32)((src != 0) ? ((u32)dst / (u32)src) : 0) Y Y Y alu-arith
0x3c any 0x00 1 dst = (u32)((src != 0) ? ((s32)dst s/ (s32)src) : 0) no no no ???
0x3d any 0x00 any if dst >= src goto +offset Y Y Y prime
0x3e any 0x00 any if (u32)dst >= (u32)src goto +offset Y Y Y jge32-reg
0x3f any 0x00 0 dst = (src !+ 0) ? (dst / src) : 0 Y Y Y alu64-arith
Expand Down Expand Up @@ -127,17 +127,17 @@ opcode src imm off description P
0x7e any 0x00 any if (s32)dst s>= (s32)src goto +offset Y Y Y jsge32-reg
0x7f any 0x00 0 dst >>= src Y Y Y rsh-reg
0x84 0x0 0x00 0 dst = (u32)-dst Y Y Y neg
0x85 0x0 any 0 call helper function imm Y Y Y call_unwind_fail
0x85 0x0 any 0 call helper function by address Y Y Y call_unwind_fail
0x85 0x1 any 0 call PC += imm no no no call_local
0x85 0x2 any 0 call runtime function imm no no no ???
0x85 0x2 any 0 call helper function by BTF ID no no no ???
0x87 0x0 0x00 0 dst = -dst Y Y Y neg64
0x94 0x0 any 0 dst = (u32)((imm != 0) ? (dst % imm) : dst) Y Y Y mod
0x94 0x0 any 1 dst = (u32)((imm != 0) ? (dst s% imm) : dst) no no no ???
0x94 0x0 any 0 dst = (u32)((imm != 0) ? ((u32)dst % (u32)imm) : dst) Y Y Y mod
0x94 0x0 any 1 dst = (u32)((imm != 0) ? ((s32)dst s% imm) : dst) no no no ???
0x95 0x0 0x00 0 return Y Y Y exit
0x97 0x0 any 0 dst = (imm != 0) ? (dst % imm) : dst Y Y Y mod64
0x97 0x0 any 0 dst = (imm != 0) ? (dst % (u32)imm) : dst Y Y Y mod64
0x97 0x0 any 1 dst = (imm != 0) ? (dst s% imm) : dst no no no ???
0x9c any 0x00 0 dst = (u32)((src != 0) ? (dst % src) : dst) Y Y Y mod
0x9c any 0x00 1 dst = (u32)((src != 0) ? (dst s% src) : dst) no no no ???
0x9c any 0x00 0 dst = (u32)((src != 0) ? ((u32)dst % (u32)src) : dst) Y Y Y mod
0x9c any 0x00 1 dst = (u32)((src != 0) ? ((s32)dst s% (s32)src) : dst) no no no ???
0x9f any 0x00 0 dst = (src != 0) ? (dst % src) : dst Y Y Y mod64
0x9f any 0x00 1 dst = (src != 0) ? (dst s% src) : dst no no no ???
0xa4 0x0 any 0 dst = (u32)(dst ^ imm) Y Y Y alu-bit
Expand All @@ -158,39 +158,44 @@ opcode src imm off description P
0xb7 0x0 any 16 dst = (s64) (s16) imm no no no ???
0xb7 0x0 any 32 dst = (s64) (s32) imm no no no ???
0xbc any 0x00 0 dst = (u32) src Y Y Y mov
0xbc any 0x00 8 dst = (u32) (s32) (s8) src no no no ???
0xbc any 0x00 16 dst = (u32) (s32) (s16) src no no no ???
0xbd any 0x00 any if dst <= src goto +offset Y Y Y jle-reg
0xbe any 0x00 any if (u32)dst <= (u32)src goto +offset Y Y Y jle32-reg
0xbf any 0x00 0 dst = src Y Y Y ldxb-all
0xbf any 0x00 8 dst = (s64) (s8) src no no no ???
0xbf any 0x00 16 dst = (s64) (s16) src no no no ???
0xbf any 0x00 32 dst = (s64) (s32) src no no no ???
0xc3 any 0x00 any lock \*(u32 \*)(dst + offset) += src no no Y lock_add32
0xc3 any 0x01 any lock:: no no Y lock_fetch_add32

*(u32 *)(dst + offset) += src
src = *(u32 *)(dst + offset)
0xc3 any 0x40 any \*(u32 \*)(dst + offset) \|= src no no Y lock_or32
\*(u32 \*)(dst + offset) += src
src = \*(u32 \*)(dst + offset)
0xc3 any 0x40 any lock \*(u32 \*)(dst + offset) \|= src no no Y lock_or32
0xc3 any 0x41 any lock:: no no Y lock_fetch_or32

*(u32 *)(dst + offset) |= src
src = *(u32 *)(dst + offset)
0xc3 any 0x50 any \*(u32 \*)(dst + offset) &= src no no Y lock_and32
\*(u32 \*)(dst + offset) |= src
src = \*(u32 \*)(dst + offset)
0xc3 any 0x50 any lock \*(u32 \*)(dst + offset) &= src no no Y lock_and32
0xc3 any 0x51 any lock:: no no Y lock_fetch_and32

*(u32 *)(dst + offset) &= src
src = *(u32 *)(dst + offset)
0xc3 any 0xa0 any \*(u32 \*)(dst + offset) ^= src no no Y lock_xor32
\*(u32 \*)(dst + offset) &= src
src = \*(u32 \*)(dst + offset)
0xc3 any 0xa0 any lock \*(u32 \*)(dst + offset) ^= src no no Y lock_xor32
0xc3 any 0xa1 any lock:: no no Y lock_fetch_xor32

*(u32 *)(dst + offset) ^= src
src = *(u32 *)(dst + offset)
\*(u32 \*)(dst + offset) ^= src
src = \*(u32 \*)(dst + offset)
0xc3 any 0xe1 any lock:: no no Y lock_xchg32

temp = *(u32 *)(dst + offset)
*(u32 *)(dst + offset) = src
temp = \*(u32 \*)(dst + offset)
\*(u32 \*)(dst + offset) = src
src = temp
0xc3 any 0xf1 any lock:: no no Y lock_cmpxchg32

temp = *(u32 *)(dst + offset)
if *(u32)(dst + offset) == R0
*(u32)(dst + offset) = src
temp = \*(u32 \*)(dst + offset)
if \*(u32)(dst + offset) == R0
\*(u32)(dst + offset) = src
R0 = temp
0xc4 0x0 any 0 dst = (u32)(dst s>> imm) Y Y Y arsh
0xc5 0x0 any any if dst s< imm goto +offset Y Y Y jslt-imm
Expand All @@ -211,33 +216,33 @@ opcode src imm off description P
0xdb any 0x00 any lock \*(u64 \*)(dst + offset) += src no no Y lock_add
0xdb any 0x01 any lock:: no no Y lock_fetch_add

*(u64 *)(dst + offset) += src
src = *(u64 *)(dst + offset)
0xdb any 0x40 any \*(u64 \*)(dst + offset) \|= src no no Y lock_or
\*(u64 \*)(dst + offset) += src
src = \*(u64 \*)(dst + offset)
0xdb any 0x40 any lock \*(u64 \*)(dst + offset) \|= src no no Y lock_or
0xdb any 0x41 any lock:: no no Y lock_fetch_or

*(u64 *)(dst + offset) |= src
lock src = *(u64 *)(dst + offset)
0xdb any 0x50 any \*(u64 \*)(dst + offset) &= src no no Y lock_and
\*(u64 \*)(dst + offset) |= src
src = \*(u64 \*)(dst + offset)
0xdb any 0x50 any lock \*(u64 \*)(dst + offset) &= src no no Y lock_and
0xdb any 0x51 any lock:: no no Y lock_fetch_and

*(u64 *)(dst + offset) &= src
src = *(u64 *)(dst + offset)
0xdb any 0xa0 any \*(u64 \*)(dst + offset) ^= src no no Y lock_xor
\*(u64 \*)(dst + offset) &= src
src = \*(u64 \*)(dst + offset)
0xdb any 0xa0 any lock \*(u64 \*)(dst + offset) ^= src no no Y lock_xor
0xdb any 0xa1 any lock:: no no Y lock_fetch_xor

*(u64 *)(dst + offset) ^= src
src = *(u64 *)(dst + offset)
\*(u64 \*)(dst + offset) ^= src
src = \*(u64 \*)(dst + offset)
0xdb any 0xe1 any lock:: no no Y lock_xchg

temp = *(u64 *)(dst + offset)
*(u64 *)(dst + offset) = src
temp = \*(u64 \*)(dst + offset)
\*(u64 \*)(dst + offset) = src
src = temp
0xdb any 0xf1 any lock:: no no Y lock_cmpxchg

temp = *(u64 *)(dst + offset)
if *(u64)(dst + offset) == R0
*(u64)(dst + offset) = src
temp = \*(u64 \*)(dst + offset)
if \*(u64)(dst + offset) == R0
\*(u64)(dst + offset) = src
R0 = temp
0xdc 0x0 0x10 0 dst = htobe16(dst) Y Y Y be16
0xdc 0x0 0x20 0 dst = htobe32(dst) Y Y Y be32
Expand Down

0 comments on commit 479eb8a

Please sign in to comment.