package bpf

  1. Overview
  2. Docs

Module EBPFSource

Embedded eBPF assembler

Types

Sourcetype size =
  1. | W
    (*

    word = 32 bit

    *)
  2. | H
    (*

    half-word = 16 bit

    *)
  3. | B
    (*

    byte

    *)
  4. | DW
    (*

    double word = 64 bit

    *)
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
    (*

    equal

    *)
  2. | `GE
    (*

    greater or equal

    *)
  3. | `GT
    (*

    greater than

    *)
  4. | `NE
    (*

    not equal

    *)
  5. | `SET
    (*

    bitwise AND

    *)
  6. | `SGE
    (*

    signed greater or equal

    *)
  7. | `SGT
    (*

    signed greater than

    *)
]
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 be 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

raw jump instructions with manually-computed offset

you probably want to use functions above which take labels

Sourceval jump_ : int16 -> 'a insn
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

Sourcetype options = {
  1. disable_all_checks : bool;
    (*

    disable all checks, may generate invalid code

    *)
  2. jump_back : bool;
    (*

    allow jump backwards, may result in infinite loop

    *)
  3. jump_self : bool;
    (*

    allow jump to self, guaranteed infinite loop

    *)
}
Sourceval default : options
Sourceval assemble : ?options:options -> 'a insn list -> string