def bpf_exec

bend-osdev-bpf@0.1.0.0 · bpf.bend:269

import bend-osdev-bpf@0.1.0.0/bpf.bend as Bpf
import Base
import bend-osdev-bpf@0.1.0.0/insn.bend as I

269def bpf_exec(op: I.BpfOp, st: BpfState, +inp: BpfInput) -> BpfStep:
270  match op:
271    case I.BpfLdAbs{size, k}:
272      bpf_step.of(bpf_set_a.m(bpf_load(inp, size, k), st))
273    case I.BpfLdInd{size, k}:
274      match st:
275        case BpfState{a, +x, mem}:
276          bpf_step.of(bpf_set_a.m(bpf_load.ind(inp, size, x, k), BpfState{a, x, mem}))
277    case I.BpfLdImm{k}:
278      BpfNext{0n, bpf_set_a(st, k)}
279    case I.BpfLdLen{}:
280      BpfNext{0n, bpf_set_a(st, bpf_len(inp))}
281    case I.BpfLdMem{+k}:
282      bpf_scratch(U32.is_lt(k, I.bpf_memwords()), k, bpf_mem.lda(st, k))
283    case I.BpfLdxImm{k}:
284      BpfNext{0n, bpf_set_x(st, k)}
285    case I.BpfLdxMem{+k}:
286      bpf_scratch(U32.is_lt(k, I.bpf_memwords()), k, bpf_mem.ldx(st, k))
287    case I.BpfLdxLen{}:
288      BpfNext{0n, bpf_set_x(st, bpf_len(inp))}
289    case I.BpfLdxMsh{k}:
290      bpf_step.of(bpf_set_x.m(bpf_load.msh(inp, k), st))
291    case I.BpfSt{+k}:
292      bpf_scratch(U32.is_lt(k, I.bpf_memwords()), k, bpf_mem.st(st, k))
293    case I.BpfStx{+k}:
294      bpf_scratch(U32.is_lt(k, I.bpf_memwords()), k, bpf_mem.stx(st, k))
295    case I.BpfAlu{o, src}:
296      match st:
297        case BpfState{+a, +x, mem}:
298          bpf_step.of(bpf_set_a.m(bpf_alu(o, a, bpf_src(src, x)), BpfState{a, x, mem}))
299    case I.BpfNeg{}:
300      BpfNext{0n, bpf_neg(st)}
301    case I.BpfJa{k}:
302      BpfNext{U32.to_nat(k), st}
303    case I.BpfJmp{c, src, jt, jf}:
304      match st:
305        case BpfState{+a, +x, mem}:
306          BpfNext{bpf_jsel(bpf_test(c, a, bpf_src(src, x)), jt, jf), BpfState{a, x, mem}}
307    case I.BpfRet{v}:
308      match v:
309        case I.BpfRetK{k}:
310          BpfStop{k}
311        case I.BpfRetA{}:
312          BpfStop{bpf_get_a(st)}
313    case I.BpfTax{}:
314      BpfNext{0n, bpf_tax(st)}
315    case I.BpfTxa{}:
316      BpfNext{0n, bpf_txa(st)}

Uses (30)

Used by (4)