ここでは単純に表と図のみでeBPFにどのような命令が含まれて、
どのように動作するのかを示す。Instruction set archの設計論などは
まったく触れない。 (ただつかう段階では必要ないため。)
必要があれば、それぞれのBitにどのような意味があるかも説明していく。
Encoding
struct ebpf_insn {
uint8_t opcode;
uint8_t src:4;
uint8_t dst:4;
uint16_t offset;
uint32_t imm;
};
msb lsb
+------------------------+----------------+----+----+--------+
|immediate |offset |src |dst |opcode |
+------------------------+----------------+----+----+--------+
Instruction Classは以下の3つに分類できる.
- ALU
- Byteswap
- Memory Access
- Branch
ALU
64bit ALU命令
Opcode |
Mnemonic |
Pseudocode |
0x07 |
add dst, imm |
dst += imm |
0x0f |
add dst, src |
dst += src |
0x17 |
sub dst, imm |
dst -= imm |
0x1f |
sub dst, src |
dst -= src |
0x27 |
mul dst, imm |
dst *= imm |
0x2f |
mul dst, src |
dst *= src |
0x37 |
div dst, imm |
dst /= imm |
0x3f |
div dst, src |
dst /= src |
0x47 |
or dst, imm |
dst |= imm |
0x4f |
or dst, src |
dst |= src |
0x57 |
and dst, imm |
dst &= imm |
0x5f |
and dst, src |
dst &= src |
0x67 |
lsh dst, imm |
dst <<= imm |
0x6f |
lsh dst, src |
dst <<= src |
0x77 |
rsh dst, imm |
dst >>= imm (logical) |
0x7f |
rsh dst, src |
dst >>= src (logical) |
0x87 |
neg dst |
dst = -dst |
0x97 |
mod dst, imm |
dst %= imm |
0x9f |
mod dst, src |
dst %= src |
0xa7 |
xor dst, imm |
dst ^= imm |
0xaf |
xor dst, src |
dst ^= src |
0xb7 |
mov dst, imm |
dst = imm |
0xbf |
mov dst, src |
dst = src |
0xc7 |
arsh dst, imm |
dst >>= imm (arithmetic) |
0xcf |
arsh dst, src |
dst >>= src (arithmetic) |
Opcode |
Mnemonic |
Pseudocode |
0x04 |
add32 dst, imm |
dst += imm |
0x0c |
add32 dst, src |
dst += src |
0x14 |
sub32 dst, imm |
dst -= imm |
0x1c |
sub32 dst, src |
dst -= src |
0x24 |
mul32 dst, imm |
dst *= imm |
0x2c |
mul32 dst, src |
dst *= src |
0x34 |
div32 dst, imm |
dst /= imm |
0x3c |
div32 dst, src |
dst /= src |
0x44 |
or32 dst, imm |
dst |= imm |
0x4c |
or32 dst, src |
dst |= src |
0x54 |
and32 dst, imm |
dst &= imm |
0x5c |
and32 dst, src |
dst &= src |
0x64 |
lsh32 dst, imm |
dst <<= imm |
0x6c |
lsh32 dst, src |
dst <<= src |
0x74 |
rsh32 dst, imm |
dst >>= imm (logical) |
0x7c |
rsh32 dst, src |
dst >>= src (logical) |
0x84 |
neg32 dst |
dst = -dst |
0x94 |
mod32 dst, imm |
dst %= imm |
0x9c |
mod32 dst, src |
dst %= src |
0xa4 |
xor32 dst, imm |
dst ^= imm |
0xac |
xor32 dst, src |
dst ^= src |
0xb4 |
mov32 dst, imm |
dst = imm |
0xbc |
mov32 dst, src |
dst = src |
0xc4 |
arsh32 dst, imm |
dst >>= imm (arithmetic) |
0xcc |
arsh32 dst, src |
dst >>= src (arithmetic) |
Byteswap
Opcode |
Mnemonic |
Pseudocode |
0xd4 (imm == 16) |
le16 dst |
dst = htole16(dst) |
0xd4 (imm == 32) |
le32 dst |
dst = htole32(dst) |
0xd4 (imm == 64) |
le64 dst |
dst = htole64(dst) |
0xdc (imm == 16) |
be16 dst |
dst = htobe16(dst) |
0xdc (imm == 32) |
be32 dst |
dst = htobe32(dst) |
0xdc (imm == 64) |
be64 dst |
dst = htobe64(dst) |
Opcode |
Mnemonic |
Pseudocode |
0x18 |
lddw dst, imm |
dst = imm |
0x20 |
ldabsw src, dst, imm |
See kernel documentation |
0x28 |
ldabsh src, dst, imm |
… |
0x30 |
ldabsb src, dst, imm |
… |
0x38 |
ldabsdw src, dst, imm |
… |
0x40 |
ldindw src, dst, imm |
… |
0x48 |
ldindh src, dst, imm |
… |
0x50 |
ldindb src, dst, imm |
… |
0x58 |
ldinddw src, dst, imm |
… |
0x61 |
ldxw dst, [src+off] |
dst = (uint32_t ) (src + off) |
0x69 |
ldxh dst, [src+off] |
dst = (uint16_t ) (src + off) |
0x71 |
ldxb dst, [src+off] |
dst = (uint8_t ) (src + off) |
0x79 |
ldxdw dst, [src+off] |
dst = (uint64_t ) (src + off) |
0x62 |
stw [dst+off], imm |
(uint32_t ) (dst + off) = imm |
0x6a |
sth [dst+off], imm |
(uint16_t ) (dst + off) = imm |
0x72 |
stb [dst+off], imm |
(uint8_t ) (dst + off) = imm |
0x7a |
stdw [dst+off], imm |
(uint64_t ) (dst + off) = imm |
0x63 |
stxw [dst+off], src |
(uint32_t ) (dst + off) = src |
0x6b |
stxh [dst+off], src |
(uint16_t ) (dst + off) = src |
0x73 |
stxb [dst+off], src |
(uint8_t ) (dst + off) = src |
0x7b |
stxdw [dst+off], src |
(uint64_t ) (dst + off) = src |
Branch
Opcode |
Mnemonic |
Pseudocode |
0x05 |
ja +off |
PC += off |
0x15 |
jeq dst, imm, +off |
PC += off if dst == imm |
0x1d |
jeq dst, src, +off |
PC += off if dst == src |
0x25 |
jgt dst, imm, +off |
PC += off if dst > imm |
0x2d |
jgt dst, src, +off |
PC += off if dst > src |
0x35 |
jge dst, imm, +off |
PC += off if dst >= imm |
0x3d |
jge dst, src, +off |
PC += off if dst >= src |
0x45 |
jset dst, imm, +off |
PC += off if dst & imm |
0x4d |
jset dst, src, +off |
PC += off if dst & src |
0x55 |
jne dst, imm, +off |
PC += off if dst != imm |
0x5d |
jne dst, src, +off |
PC += off if dst != src |
0x65 |
jsgt dst, imm, +off |
PC += off if dst > imm (signed) |
0x6d |
jsgt dst, src, +off |
PC += off if dst > src (signed) |
0x75 |
jsge dst, imm, +off |
PC += off if dst >= imm (signed) |
0x7d |
jsge dst, src, +off |
PC += off if dst >= src (signed) |
0x85 |
call imm |
Function call |
0x95 |
exit |
return r0 |
Reference