|
@@ -286,3 +286,550 @@ fn test_cranelift_err_call_unreg() {
|
|
let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
|
|
let vm = rbpf::EbpfVmNoData::new(Some(&prog)).unwrap();
|
|
vm.execute_cranelift().unwrap();
|
|
vm.execute_cranelift().unwrap();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+#[test]
|
|
|
|
+fn test_cranelift_call_memfrob() {
|
|
|
|
+ let prog = assemble(
|
|
|
|
+ "
|
|
|
|
+ mov r6, r1
|
|
|
|
+ add r1, 2
|
|
|
|
+ mov r2, 4
|
|
|
|
+ call 1
|
|
|
|
+ ldxdw r0, [r6]
|
|
|
|
+ be64 r0
|
|
|
|
+ exit",
|
|
|
|
+ )
|
|
|
|
+ .unwrap();
|
|
|
|
+
|
|
|
|
+ let mut vm = rbpf::EbpfVmRaw::new(Some(&prog)).unwrap();
|
|
|
|
+ vm.register_helper(1, helpers::memfrob).unwrap();
|
|
|
|
+ let mem = &mut [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08];
|
|
|
|
+ assert_eq!(vm.execute_cranelift(mem).unwrap(), 0x102292e2f2c0708);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div32_high_divisor,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 12
|
|
|
|
+ lddw r1, 0x100000004
|
|
|
|
+ div32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x3
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div32_imm,
|
|
|
|
+ "
|
|
|
|
+ lddw r0, 0x10000000c
|
|
|
|
+ div32 r0, 4
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x3
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div32_reg,
|
|
|
|
+ "
|
|
|
|
+ lddw r0, 0x10000000c
|
|
|
|
+ mov r1, 4
|
|
|
|
+ div32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x3
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div64_imm,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0xc
|
|
|
|
+ lsh r0, 32
|
|
|
|
+ div r0, 4
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x300000000
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div64_reg,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0xc
|
|
|
|
+ lsh r0, 32
|
|
|
|
+ mov r1, 4
|
|
|
|
+ div r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x300000000
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div64_by_zero_imm,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ div r0, 0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div_by_zero_imm,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ div32 r0, 0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod64_by_zero_imm,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mod r0, 0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod_by_zero_imm,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mod32 r0, 0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div64_by_zero_reg,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mov32 r1, 0
|
|
|
|
+ div r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_div_by_zero_reg,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mov32 r1, 0
|
|
|
|
+ div32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod64_by_zero_reg,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mov32 r1, 0
|
|
|
|
+ mod r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod_by_zero_reg,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 1
|
|
|
|
+ mov32 r1, 0
|
|
|
|
+ mod32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_exit,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_lddw,
|
|
|
|
+ "
|
|
|
|
+ lddw r0, 0x1122334455667788
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1122334455667788
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_lddw2,
|
|
|
|
+ "
|
|
|
|
+ lddw r0, 0x0000000080000000
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x80000000
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxb_all,
|
|
|
|
+ "
|
|
|
|
+ mov r0, r1
|
|
|
|
+ ldxb r9, [r0+0]
|
|
|
|
+ lsh r9, 0
|
|
|
|
+ ldxb r8, [r0+1]
|
|
|
|
+ lsh r8, 4
|
|
|
|
+ ldxb r7, [r0+2]
|
|
|
|
+ lsh r7, 8
|
|
|
|
+ ldxb r6, [r0+3]
|
|
|
|
+ lsh r6, 12
|
|
|
|
+ ldxb r5, [r0+4]
|
|
|
|
+ lsh r5, 16
|
|
|
|
+ ldxb r4, [r0+5]
|
|
|
|
+ lsh r4, 20
|
|
|
|
+ ldxb r3, [r0+6]
|
|
|
|
+ lsh r3, 24
|
|
|
|
+ ldxb r2, [r0+7]
|
|
|
|
+ lsh r2, 28
|
|
|
|
+ ldxb r1, [r0+8]
|
|
|
|
+ lsh r1, 32
|
|
|
|
+ ldxb r0, [r0+9]
|
|
|
|
+ lsh r0, 36
|
|
|
|
+ or r0, r1
|
|
|
|
+ or r0, r2
|
|
|
|
+ or r0, r3
|
|
|
|
+ or r0, r4
|
|
|
|
+ or r0, r5
|
|
|
|
+ or r0, r6
|
|
|
|
+ or r0, r7
|
|
|
|
+ or r0, r8
|
|
|
|
+ or r0, r9
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09],
|
|
|
|
+ 0x9876543210
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxb,
|
|
|
|
+ "
|
|
|
|
+ ldxb r0, [r1+2]
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0xaa, 0xbb, 0x11, 0xcc, 0xdd],
|
|
|
|
+ 0x11
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxdw,
|
|
|
|
+ "
|
|
|
|
+ ldxdw r0, [r1+2]
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0xcc, 0xdd],
|
|
|
|
+ 0x8877665544332211
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxh_all,
|
|
|
|
+ "
|
|
|
|
+ mov r0, r1
|
|
|
|
+ ldxh r9, [r0+0]
|
|
|
|
+ be16 r9
|
|
|
|
+ lsh r9, 0
|
|
|
|
+ ldxh r8, [r0+2]
|
|
|
|
+ be16 r8
|
|
|
|
+ lsh r8, 4
|
|
|
|
+ ldxh r7, [r0+4]
|
|
|
|
+ be16 r7
|
|
|
|
+ lsh r7, 8
|
|
|
|
+ ldxh r6, [r0+6]
|
|
|
|
+ be16 r6
|
|
|
|
+ lsh r6, 12
|
|
|
|
+ ldxh r5, [r0+8]
|
|
|
|
+ be16 r5
|
|
|
|
+ lsh r5, 16
|
|
|
|
+ ldxh r4, [r0+10]
|
|
|
|
+ be16 r4
|
|
|
|
+ lsh r4, 20
|
|
|
|
+ ldxh r3, [r0+12]
|
|
|
|
+ be16 r3
|
|
|
|
+ lsh r3, 24
|
|
|
|
+ ldxh r2, [r0+14]
|
|
|
|
+ be16 r2
|
|
|
|
+ lsh r2, 28
|
|
|
|
+ ldxh r1, [r0+16]
|
|
|
|
+ be16 r1
|
|
|
|
+ lsh r1, 32
|
|
|
|
+ ldxh r0, [r0+18]
|
|
|
|
+ be16 r0
|
|
|
|
+ lsh r0, 36
|
|
|
|
+ or r0, r1
|
|
|
|
+ or r0, r2
|
|
|
|
+ or r0, r3
|
|
|
|
+ or r0, r4
|
|
|
|
+ or r0, r5
|
|
|
|
+ or r0, r6
|
|
|
|
+ or r0, r7
|
|
|
|
+ or r0, r8
|
|
|
|
+ or r0, r9
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [
|
|
|
|
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00,
|
|
|
|
+ 0x07, 0x00, 0x08, 0x00, 0x09
|
|
|
|
+ ],
|
|
|
|
+ 0x9876543210
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxh_all2,
|
|
|
|
+ "
|
|
|
|
+ mov r0, r1
|
|
|
|
+ ldxh r9, [r0+0]
|
|
|
|
+ be16 r9
|
|
|
|
+ ldxh r8, [r0+2]
|
|
|
|
+ be16 r8
|
|
|
|
+ ldxh r7, [r0+4]
|
|
|
|
+ be16 r7
|
|
|
|
+ ldxh r6, [r0+6]
|
|
|
|
+ be16 r6
|
|
|
|
+ ldxh r5, [r0+8]
|
|
|
|
+ be16 r5
|
|
|
|
+ ldxh r4, [r0+10]
|
|
|
|
+ be16 r4
|
|
|
|
+ ldxh r3, [r0+12]
|
|
|
|
+ be16 r3
|
|
|
|
+ ldxh r2, [r0+14]
|
|
|
|
+ be16 r2
|
|
|
|
+ ldxh r1, [r0+16]
|
|
|
|
+ be16 r1
|
|
|
|
+ ldxh r0, [r0+18]
|
|
|
|
+ be16 r0
|
|
|
|
+ or r0, r1
|
|
|
|
+ or r0, r2
|
|
|
|
+ or r0, r3
|
|
|
|
+ or r0, r4
|
|
|
|
+ or r0, r5
|
|
|
|
+ or r0, r6
|
|
|
|
+ or r0, r7
|
|
|
|
+ or r0, r8
|
|
|
|
+ or r0, r9
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [
|
|
|
|
+ 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00,
|
|
|
|
+ 0x80, 0x01, 0x00, 0x02, 0x00
|
|
|
|
+ ],
|
|
|
|
+ 0x3ff
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxh,
|
|
|
|
+ "
|
|
|
|
+ ldxh r0, [r1+2]
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0xaa, 0xbb, 0x11, 0x22, 0xcc, 0xdd],
|
|
|
|
+ 0x2211
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxw_all,
|
|
|
|
+ "
|
|
|
|
+ mov r0, r1
|
|
|
|
+ ldxw r9, [r0+0]
|
|
|
|
+ be32 r9
|
|
|
|
+ ldxw r8, [r0+4]
|
|
|
|
+ be32 r8
|
|
|
|
+ ldxw r7, [r0+8]
|
|
|
|
+ be32 r7
|
|
|
|
+ ldxw r6, [r0+12]
|
|
|
|
+ be32 r6
|
|
|
|
+ ldxw r5, [r0+16]
|
|
|
|
+ be32 r5
|
|
|
|
+ ldxw r4, [r0+20]
|
|
|
|
+ be32 r4
|
|
|
|
+ ldxw r3, [r0+24]
|
|
|
|
+ be32 r3
|
|
|
|
+ ldxw r2, [r0+28]
|
|
|
|
+ be32 r2
|
|
|
|
+ ldxw r1, [r0+32]
|
|
|
|
+ be32 r1
|
|
|
|
+ ldxw r0, [r0+36]
|
|
|
|
+ be32 r0
|
|
|
|
+ or r0, r1
|
|
|
|
+ or r0, r2
|
|
|
|
+ or r0, r3
|
|
|
|
+ or r0, r4
|
|
|
|
+ or r0, r5
|
|
|
|
+ or r0, r6
|
|
|
|
+ or r0, r7
|
|
|
|
+ or r0, r8
|
|
|
|
+ or r0, r9
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [
|
|
|
|
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
|
|
|
+ 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
|
|
|
+ 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00
|
|
|
|
+ ],
|
|
|
|
+ 0x030f0f
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_ldxw,
|
|
|
|
+ "
|
|
|
|
+ ldxw r0, [r1+2]
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0xcc, 0xdd],
|
|
|
|
+ 0x44332211
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_le16,
|
|
|
|
+ "
|
|
|
|
+ ldxh r0, [r1]
|
|
|
|
+ le16 r0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0x22, 0x11],
|
|
|
|
+ 0x1122
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_le32,
|
|
|
|
+ "
|
|
|
|
+ ldxw r0, [r1]
|
|
|
|
+ le32 r0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0x44, 0x33, 0x22, 0x11],
|
|
|
|
+ 0x11223344
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_le64,
|
|
|
|
+ "
|
|
|
|
+ ldxdw r0, [r1]
|
|
|
|
+ le64 r0
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ [0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11],
|
|
|
|
+ 0x1122334455667788
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_lsh_reg,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0x1
|
|
|
|
+ mov r7, 4
|
|
|
|
+ lsh r0, r7
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x10
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, 5748
|
|
|
|
+ mod32 r0, 92
|
|
|
|
+ mov32 r1, 13
|
|
|
|
+ mod32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x5
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod32,
|
|
|
|
+ "
|
|
|
|
+ lddw r0, 0x100000003
|
|
|
|
+ mod32 r0, 3
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x0
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mod64,
|
|
|
|
+ "
|
|
|
|
+ mov32 r0, -1316649930
|
|
|
|
+ lsh r0, 32
|
|
|
|
+ or r0, 0x100dc5c8
|
|
|
|
+ mov32 r1, 0xdde263e
|
|
|
|
+ lsh r1, 32
|
|
|
|
+ or r1, 0x3cbef7f3
|
|
|
|
+ mod r0, r1
|
|
|
|
+ mod r0, 0x658f1778
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x30ba5a04
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mov,
|
|
|
|
+ "
|
|
|
|
+ mov32 r1, 1
|
|
|
|
+ mov32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x1
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mul32_imm,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 3
|
|
|
|
+ mul32 r0, 4
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0xc
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mul32_reg,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 3
|
|
|
|
+ mov r1, 4
|
|
|
|
+ mul32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0xc
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mul32_reg_overflow,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0x40000001
|
|
|
|
+ mov r1, 4
|
|
|
|
+ mul32 r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x4
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mul64_imm,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0x40000001
|
|
|
|
+ mul r0, 4
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x100000004
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+test_cranelift!(
|
|
|
|
+ test_cranelift_mul64_reg,
|
|
|
|
+ "
|
|
|
|
+ mov r0, 0x40000001
|
|
|
|
+ mov r1, 4
|
|
|
|
+ mul r0, r1
|
|
|
|
+ exit
|
|
|
|
+ ",
|
|
|
|
+ 0x100000004
|
|
|
|
+);
|