def exec_ok
bend-osdev-bpf@0.1.0.0 · PROOF.bend:113
import bend-osdev-bpf@0.1.0.0/PROOF.bend as PROOF
import Base
import bend-osdev-bpf@0.1.0.0/insn.bend as I
import bend-osdev-bpf@0.1.0.0/validate.bend as V
import bend-osdev-bpf@0.1.0.0/bpf.bend as R
113
114def exec_ok(op: I.BpfOp, st: R.BpfState, +inp: R.BpfInput, +pc: Nat, +r: Nat, h: {V.bpf_check.op(op, pc, r) == Done{Unit{}} : Result<&2, &2, I.BpfError, Unit>}) -> {step_ok(R.bpf_exec(op, st, inp), r) == True{} : Bool}:
115 match op:
116 case I.BpfLdAbs{+size, +k}:
117 step_of_ok(R.bpf_set_a.m(R.bpf_load(inp, size, k), st), r, nxt(pc, r, h))
118 case I.BpfLdInd{+size, +k}:
119 match st:
120 case R.BpfState{+a, +x, +mem}:
121 step_of_ok(R.bpf_set_a.m(R.bpf_load.ind(inp, size, x, k), R.BpfState{a, x, mem}), r, nxt(pc, r, h))
122 case I.BpfLdImm{+k}:
123 nxt(pc, r, h)
124 case I.BpfLdLen{}:
125 nxt(pc, r, h)
126 case I.BpfLdMem{+k}:
127 mem_ok(k, R.bpf_mem.lda(st, k), pc, r, h)
128 case I.BpfLdxImm{+k}:
129 nxt(pc, r, h)
130 case I.BpfLdxMem{+k}:
131 mem_ok(k, R.bpf_mem.ldx(st, k), pc, r, h)
132 case I.BpfLdxLen{}:
133 nxt(pc, r, h)
134 case I.BpfLdxMsh{+k}:
135 step_of_ok(R.bpf_set_x.m(R.bpf_load.msh(inp, k), st), r, nxt(pc, r, h))
136 case I.BpfSt{+k}:
137 mem_ok(k, R.bpf_mem.st(st, k), pc, r, h)
138 case I.BpfStx{+k}:
139 mem_ok(k, R.bpf_mem.stx(st, k), pc, r, h)
140 case I.BpfAlu{+o, +src}:
141 match st:
142 case R.BpfState{+a, +x, +mem}:
143 step_of_ok(R.bpf_set_a.m(R.bpf_alu(o, a, R.bpf_src(src, x)), R.BpfState{a, x, mem}), r, nxt(pc, r, both_r(V.bpf_check.div(o, src, pc), V.bpf_check.next(pc, r), h)))
144 case I.BpfNeg{}:
145 nxt(pc, r, h)
146 case I.BpfJa{+k}:
147 need_ok(Nat.is_lt(U32.to_nat(k), r), I.BpfErrJump{pc}, h)
148 case I.BpfJmp{+c, +src, +jt, +jf}:
149 match st:
150 case R.BpfState{+a, +x, +mem}:
151 jmp_ok(jt, jf, pc, r, R.bpf_test(c, a, R.bpf_src(src, x)), h)
152 case I.BpfRet{+v}:
153 match v:
154 case I.BpfRetK{+k}:
155 {==}
156 case I.BpfRetA{}:
157 {==}
158 case I.BpfTax{}:
159 nxt(pc, r, h)
160 case I.BpfTxa{}:
161 nxt(pc, r, h)