package bpf

  1. Overview
  2. Docs

Module EBPFSource

Embedded eBPF assembler

Types

Sourcetype size =
  1. | W
  2. | H
  3. | B
  4. | DW
Sourcetype reg =
  1. | R0
  2. | R1
  3. | R2
  4. | R3
  5. | R4
  6. | R5
  7. | R6
  8. | R7
  9. | R8
  10. | R9
  11. | R10
Sourcetype int16 = int
Sourcetype cond = [
  1. | `EQ
  2. | `GE
  3. | `GT
  4. | `NE
  5. | `SET
  6. | `SGE
  7. | `SGT
]
Sourcetype +'label insn

Single eBPF instruction. 'label is type of labels, can be any hashable type, e.g. string, int, open variant, etc

Memory instructions

Sourceval ldx : size -> reg -> (reg * int16) -> 'a insn
Sourceval lddw : reg -> int64 -> 'a insn
Sourceval stx : size -> (reg * int16) -> reg -> 'a insn
Sourceval st : size -> (reg * int16) -> int -> 'a insn

Branch instructions

Sourceval label : 'label -> 'label insn

mark label position, each label should unique

Sourceval ret : 'a insn
Sourceval call : int -> 'a insn
Sourceval jump : 'label -> 'label insn
Sourceval jmpi : 'label -> reg -> cond -> int -> 'label insn
Sourceval jmp : 'label -> reg -> cond -> reg -> 'label insn
Sourceval jump_ : int16 -> 'a insn

raw jump instructions with manually-computed offset, you probably want to use version with labels

Sourceval jmpi_ : int16 -> reg -> cond -> int -> 'a insn
Sourceval jmp_ : int16 -> reg -> cond -> reg -> 'a insn

ALU (arithmetic/logic) instructions

Sourcemodule type ALU = sig ... end
Sourcemodule I32 : ALU

64-bit instructions, for 32-bit instructions use I32

include ALU
Sourceval add : reg -> reg -> 'a insn
Sourceval addi : reg -> int -> 'a insn
Sourceval sub : reg -> reg -> 'a insn
Sourceval subi : reg -> int -> 'a insn
Sourceval mul : reg -> reg -> 'a insn
Sourceval muli : reg -> int -> 'a insn
Sourceval div : reg -> reg -> 'a insn
Sourceval divi : reg -> int -> 'a insn
Sourceval or_ : reg -> reg -> 'a insn
Sourceval ori : reg -> int -> 'a insn
Sourceval and_ : reg -> reg -> 'a insn
Sourceval andi : reg -> int -> 'a insn
Sourceval lsh : reg -> reg -> 'a insn
Sourceval lshi : reg -> int -> 'a insn
Sourceval rsh : reg -> reg -> 'a insn
Sourceval rshi : reg -> int -> 'a insn
Sourceval neg : reg -> reg -> 'a insn
Sourceval negi : reg -> int -> 'a insn
Sourceval mod_ : reg -> reg -> 'a insn
Sourceval modi : reg -> int -> 'a insn
Sourceval xor : reg -> reg -> 'a insn
Sourceval xori : reg -> int -> 'a insn
Sourceval mov : reg -> reg -> 'a insn
Sourceval movi : reg -> int -> 'a insn
Sourceval arsh : reg -> reg -> 'a insn
Sourceval arshi : reg -> int -> 'a insn

Byteswap instructions

Sourceval le16 : reg -> 'a insn
Sourceval be16 : reg -> 'a insn
Sourceval le32 : reg -> 'a insn
Sourceval be32 : reg -> 'a insn
Sourceval le64 : reg -> 'a insn
Sourceval be64 : reg -> 'a insn

Assembler

Sourceval assemble : 'a insn list -> string