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)}