Skip to content

Commit 2c639df

Browse files
committed
generator: more vm interp tests
1 parent 0b40548 commit 2c639df

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

generators/vm_interp.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def exact_cu_cost(data_vec):
6565
# fmt: off
6666
test_vectors_all_ix = []
6767
for op in range(0xFF):
68+
# for op in [0x07]:
6869
def validate():
6970
for sreg in [0, 2, 6, 9, 10, 11]:
7071
for dreg in [0, 9, 10, 11]:
@@ -169,11 +170,31 @@ def validate():
169170
0x71e3cf81, # magic - always SIGSTACK (ignore call_whitelist)
170171
0x12345678, # invalid
171172
0x0b00c380, # inverse of magic - just invalid
173+
0x3770fb22, # syscall: sol_memset_
174+
1, # success without relocation. works in v3+
175+
0,
176+
2,
177+
3,
178+
4,
179+
0xffffffff, # overflow ok because of negative offsets
172180
]:
173181
test_vectors_all_ix.append({
174182
"op": f"{op:02x}",
175183
"cu_avail": 100,
176-
# hashmap containing vaild pc: 0, 1, 2 (higher are trimmed)
184+
# hashmap containing valid function
185+
"call_whitelist": [0x04],
186+
"rodata":
187+
bytes([op, ((sreg << 4) + dreg) % 0xFF, 0, 0]) + imm.to_bytes(4, "little") + \
188+
bytes([0x95, 0, 0, 0, 0, 0, 0, 0]) + \
189+
bytes([0x95, 0, 0, 0, 0, 0, 0, 0])
190+
})
191+
# TODO: the following generates invalid functions to test validate()
192+
# it's ok in v0-v2, it should return -2 in v3+
193+
test_vectors_all_ix.append({
194+
"op": f"{op:02x}",
195+
"cu_avail": 100,
196+
# hashmap containing valid pc: 0, 1, 2 (higher are trimmed)
197+
# these are invalid fn in v3+
177198
"call_whitelist": [0xff],
178199
"rodata":
179200
bytes([op, ((sreg << 4) + dreg) % 0xFF, 0, 0]) + imm.to_bytes(4, "little") + \
@@ -248,6 +269,41 @@ def validate():
248269
bytes([op, ((sreg << 4) + dreg) % 0xFF]) + offset.to_bytes(2, "little") + imm.to_bytes(4, "little") + \
249270
bytes([0x95, 0, 0, 0, 0, 0, 0, 0])
250271
})
272+
273+
if op in [0xc6, 0xce, 0xd6, 0xde, 0xe6, 0xee, 0xf6, 0xfe]:
274+
sreg = 2
275+
dreg = 3
276+
for imm in [0x0, 0xffffffffffffffff]:
277+
for r3 in [
278+
0x80000000, # not INT_MIN / LONG_MIN
279+
0xffffffff80000000, # INT_MIN
280+
0x8000000000000000, # LONG_MIN
281+
]:
282+
test_vectors_all_ix.append({
283+
"op": f"{op:02x}",
284+
"cu_avail": 100,
285+
"r2": imm,
286+
"r3": r3,
287+
"rodata":
288+
bytes([op, ((sreg << 4) + dreg) % 0xFF, 0, 0]) + (imm & 0xFFFFFFFF).to_bytes(4, "little") + \
289+
bytes([0x95, 0, 0, 0, 0, 0, 0, 0])
290+
})
291+
292+
# syscall (v3)
293+
if op == 0x95:
294+
sreg = 0
295+
dreg = 0
296+
for imm in [
297+
3, # sol_memset_
298+
100, # invalid
299+
]:
300+
test_vectors_all_ix.append({
301+
"op": f"{op:02x}",
302+
"cu_avail": 100,
303+
"rodata":
304+
bytes([ op, 0, 0, 0]) + imm.to_bytes(4, "little") + \
305+
bytes([0x9d, 0, 0, 0, 0, 0, 0, 0])
306+
})
251307
# fmt: on
252308

253309

@@ -320,4 +376,12 @@ def _into_key_data(key_prefix, test_vectors):
320376
with open(f"{OUTPUT_DIR}/{testname}/v2/{filename}.bin", "wb") as f:
321377
f.write(serialized_instr)
322378

379+
syscall_ctx.vm_ctx.sbpf_version = 3
380+
syscall_ctx.vm_ctx.rodata = bytes(
381+
[x if x != 0x95 else 0x9D for x in syscall_ctx.vm_ctx.rodata]
382+
)
383+
serialized_instr = syscall_ctx.SerializeToString(deterministic=True)
384+
with open(f"{OUTPUT_DIR}/{testname}/v3/{filename}.bin", "wb") as f:
385+
f.write(serialized_instr)
386+
323387
print("done!")

0 commit comments

Comments
 (0)