SBPF.Syntax — the sBPF instruction set #
Abstract syntax of the Solana eBPF (sBPF) instruction set, ported from
rBPFSyntax.thy. The headline type is Solanalib.SBPF.BpfInstruction, the
22-constructor algebraic representation of a decoded instruction, together with
the register, operand, operation, condition, and version enumerations it uses.
Main definitions #
Solanalib.SBPF.BpfIReg— the eleven integer registersBR0…BR10.Solanalib.SBPF.SndOp— an instruction's second operand (immediate or register).Solanalib.SBPF.BpfInstruction— a decoded sBPF instruction.Solanalib.SBPF.BpfIReg.toU4/ofU4— the register ↔ 4-bit-field bridge.
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Solanalib.SBPF.instDecidableEqSndOp.decEq (Solanalib.SBPF.SndOp.imm a) (Solanalib.SBPF.SndOp.imm b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Solanalib.SBPF.instDecidableEqSndOp.decEq (Solanalib.SBPF.SndOp.imm i) (Solanalib.SBPF.SndOp.reg r) = isFalse ⋯
- Solanalib.SBPF.instDecidableEqSndOp.decEq (Solanalib.SBPF.SndOp.reg r) (Solanalib.SBPF.SndOp.imm i) = isFalse ⋯
- Solanalib.SBPF.instDecidableEqSndOp.decEq (Solanalib.SBPF.SndOp.reg a) (Solanalib.SBPF.SndOp.reg b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Solanalib.SBPF.instReprSndOp = { reprPrec := Solanalib.SBPF.instReprSndOp.repr }
Operand width selector for ALU operations.
Instances For
Equations
- Solanalib.SBPF.instReprArch.repr Solanalib.SBPF.Arch.a32 prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Arch.a32")).group prec✝
- Solanalib.SBPF.instReprArch.repr Solanalib.SBPF.Arch.a64 prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Arch.a64")).group prec✝
Instances For
Equations
- Solanalib.SBPF.instReprArch = { reprPrec := Solanalib.SBPF.instReprArch.repr }
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Solanalib.SBPF.instReprBinop = { reprPrec := Solanalib.SBPF.instReprBinop.repr }
Equations
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.add prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.add")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.sub prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.sub")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.mul prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.mul")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.div prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.div")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.or prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.or")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.and prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.and")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.lsh prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.lsh")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.rsh prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.rsh")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.mod prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.mod")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.xor prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.xor")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.mov prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.mov")).group prec✝
- Solanalib.SBPF.instReprBinop.repr Solanalib.SBPF.Binop.arsh prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Binop.arsh")).group prec✝
Instances For
Equations
- Solanalib.SBPF.instReprPqrop = { reprPrec := Solanalib.SBPF.instReprPqrop.repr }
Equations
- Solanalib.SBPF.instReprPqrop.repr Solanalib.SBPF.Pqrop.lmul prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Pqrop.lmul")).group prec✝
- Solanalib.SBPF.instReprPqrop.repr Solanalib.SBPF.Pqrop.udiv prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Pqrop.udiv")).group prec✝
- Solanalib.SBPF.instReprPqrop.repr Solanalib.SBPF.Pqrop.urem prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Pqrop.urem")).group prec✝
- Solanalib.SBPF.instReprPqrop.repr Solanalib.SBPF.Pqrop.sdiv prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Pqrop.sdiv")).group prec✝
- Solanalib.SBPF.instReprPqrop.repr Solanalib.SBPF.Pqrop.srem prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Pqrop.srem")).group prec✝
Instances For
High-half multiply operations (the sBPF PQR2 class).
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- Solanalib.SBPF.instReprChunk = { reprPrec := Solanalib.SBPF.instReprChunk.repr }
Equations
- One or more equations did not get rendered due to their size.
- Solanalib.SBPF.instReprChunk.repr Solanalib.SBPF.Chunk.byte prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.Chunk.byte")).group prec✝
Instances For
Equations
- Solanalib.SBPF.instReprSBPFV.repr Solanalib.SBPF.SBPFV.v1 prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.SBPFV.v1")).group prec✝
- Solanalib.SBPF.instReprSBPFV.repr Solanalib.SBPF.SBPFV.v2 prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Solanalib.SBPF.SBPFV.v2")).group prec✝
Instances For
Equations
- Solanalib.SBPF.instReprSBPFV = { reprPrec := Solanalib.SBPF.instReprSBPFV.repr }
A decoded sBPF instruction. Constructors mirror rBPFSyntax.thy's
bpf_instruction; immediate fields are U32, offsets U16, interpreted signed
where the semantics requires it.
- ldImm
(dst : BpfIReg)
(immLo immHi : U32)
: BpfInstruction
Load a 64-bit immediate (assembled from two 32-bit halves).
- ldx
(chunk : MemoryChunk)
(dst src : BpfIReg)
(off : U16)
: BpfInstruction
Load from memory:
dst := mem[src + off]at widthchunk. - st
(chunk : MemoryChunk)
(dst : BpfIReg)
(src : SndOp)
(off : U16)
: BpfInstruction
Store to memory:
mem[dst + off] := srcat widthchunk. - addStk
(imm : U32)
: BpfInstruction
Add an immediate to the stack pointer.
- alu
(op : Binop)
(dst : BpfIReg)
(src : SndOp)
: BpfInstruction
32-bit ALU operation.
- neg32Reg
(dst : BpfIReg)
: BpfInstruction
32-bit register negation.
- le
(dst : BpfIReg)
(imm : U32)
: BpfInstruction
Little-endian byte swap.
- be
(dst : BpfIReg)
(imm : U32)
: BpfInstruction
Big-endian byte swap.
- alu64
(op : Binop)
(dst : BpfIReg)
(src : SndOp)
: BpfInstruction
64-bit ALU operation.
- neg64Reg
(dst : BpfIReg)
: BpfInstruction
64-bit register negation.
- hor64Imm
(dst : BpfIReg)
(imm : U32)
: BpfInstruction
OR a high-order 32-bit immediate into
dst(v2only). - pqr
(op : Pqrop)
(dst : BpfIReg)
(src : SndOp)
: BpfInstruction
32-bit product/quotient/remainder operation.
- pqr64
(op : Pqrop)
(dst : BpfIReg)
(src : SndOp)
: BpfInstruction
64-bit product/quotient/remainder operation.
- pqr2
(op : Pqrop2)
(dst : BpfIReg)
(src : SndOp)
: BpfInstruction
High-half multiply operation.
- ja
(off : U16)
: BpfInstruction
Unconditional jump by
off. - jump
(cond : Condition)
(r : BpfIReg)
(src : SndOp)
(off : U16)
: BpfInstruction
Conditional jump by
offwhencondholds betweenrandsrc. - callReg
(src : BpfIReg)
(imm : U32)
: BpfInstruction
Call the function whose address is held in register
src. - callImm
(src : BpfIReg)
(imm : U32)
: BpfInstruction
Call the function identified by immediate
imm. - exit : BpfInstruction
Return from the current frame, or halt at call depth 0.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
A program in assembly form: a list of decoded instructions.
Instances For
A program in binary form: a flat list of bytes.
Equations
Instances For
The 4-bit register-index field for a register.
Equations
- Solanalib.SBPF.BpfIReg.br0.toU4 = 0
- Solanalib.SBPF.BpfIReg.br1.toU4 = 1
- Solanalib.SBPF.BpfIReg.br2.toU4 = 2
- Solanalib.SBPF.BpfIReg.br3.toU4 = 3
- Solanalib.SBPF.BpfIReg.br4.toU4 = 4
- Solanalib.SBPF.BpfIReg.br5.toU4 = 5
- Solanalib.SBPF.BpfIReg.br6.toU4 = 6
- Solanalib.SBPF.BpfIReg.br7.toU4 = 7
- Solanalib.SBPF.BpfIReg.br8.toU4 = 8
- Solanalib.SBPF.BpfIReg.br9.toU4 = 9
- Solanalib.SBPF.BpfIReg.br10.toU4 = 10
Instances For
Decode a 4-bit register-index field, rejecting out-of-range values.
Equations
- One or more equations did not get rendered due to their size.