diff --git a/tests/execution.rs b/tests/execution.rs index 1140ab582..d0e4280f3 100644 --- a/tests/execution.rs +++ b/tests/execution.rs @@ -143,7 +143,7 @@ macro_rules! test_interpreter_and_jit { } macro_rules! test_interpreter_and_jit_asm { - ($source:tt, $config:expr, $mem:tt, ($($location:expr => $syscall_function:expr),* $(,)?), $context_object:expr, $expected_result:expr $(,)?) => { + ($source:expr, $config:expr, $mem:tt, ($($location:expr => $syscall_function:expr),* $(,)?), $context_object:expr, $expected_result:expr $(,)?) => { #[allow(unused_mut)] { let mut config = $config; @@ -155,7 +155,7 @@ macro_rules! test_interpreter_and_jit_asm { test_interpreter_and_jit!(executable, $mem, $context_object, $expected_result); } }; - ($source:tt, $mem:tt, ($($location:expr => $syscall_function:expr),* $(,)?), $context_object:expr, $expected_result:expr $(,)?) => { + ($source:expr, $mem:tt, ($($location:expr => $syscall_function:expr),* $(,)?), $context_object:expr, $expected_result:expr $(,)?) => { #[allow(unused_mut)] { test_interpreter_and_jit_asm!($source, Config::default(), $mem, ($($location => $syscall_function),*), $context_object, $expected_result); @@ -918,35 +918,40 @@ fn test_err_divide_overflow() { #[test] fn test_memory_instructions() { for sbpf_version in [SBPFVersion::V1, SBPFVersion::V2] { + let final_instr = if sbpf_version == SBPFVersion::V1 { + "exit" + } else { + "return" + }; + let config = Config { enabled_sbpf_versions: sbpf_version.clone()..=sbpf_version, ..Config::default() }; + let asm = format!("ldxb r0, [r1+2]\n{final_instr}"); test_interpreter_and_jit_asm!( - " - ldxb r0, [r1+2] - exit", + asm.as_str(), config.clone(), [0xaa, 0xbb, 0x11, 0xcc, 0xdd], (), TestContextObject::new(2), ProgramResult::Ok(0x11), ); + + let asm = format!("ldxh r0, [r1+2]\n{final_instr}"); test_interpreter_and_jit_asm!( - " - ldxh r0, [r1+2] - exit", + asm.as_str(), config.clone(), [0xaa, 0xbb, 0x11, 0x22, 0xcc, 0xdd], (), TestContextObject::new(2), ProgramResult::Ok(0x2211), ); + + let asm = format!("ldxw r0, [r1+2]\n{final_instr}"); test_interpreter_and_jit_asm!( - " - ldxw r0, [r1+2] - exit", + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0xcc, 0xdd, // @@ -955,10 +960,10 @@ fn test_memory_instructions() { TestContextObject::new(2), ProgramResult::Ok(0x44332211), ); + + let asm = format!("ldxdw r0, [r1+2]\n{final_instr}"); test_interpreter_and_jit_asm!( - " - ldxdw r0, [r1+2] - exit", + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, // @@ -969,22 +974,29 @@ fn test_memory_instructions() { ProgramResult::Ok(0x8877665544332211), ); - test_interpreter_and_jit_asm!( + let asm = format!( " stb [r1+2], 0x11 ldxb r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [0xaa, 0xbb, 0xff, 0xcc, 0xdd], (), TestContextObject::new(3), ProgramResult::Ok(0x11), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " sth [r1+2], 0x2211 ldxh r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd, // @@ -993,11 +1005,15 @@ fn test_memory_instructions() { TestContextObject::new(3), ProgramResult::Ok(0x2211), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " stw [r1+2], 0x44332211 ldxw r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd, // @@ -1006,11 +1022,15 @@ fn test_memory_instructions() { TestContextObject::new(3), ProgramResult::Ok(0x44332211), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " stdw [r1+2], 0x44332211 ldxdw r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // @@ -1021,12 +1041,15 @@ fn test_memory_instructions() { ProgramResult::Ok(0x44332211), ); - test_interpreter_and_jit_asm!( + let asm = format!( " mov32 r2, 0x11 stxb [r1+2], r2 ldxb r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xcc, 0xdd, // @@ -1035,12 +1058,16 @@ fn test_memory_instructions() { TestContextObject::new(4), ProgramResult::Ok(0x11), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " mov32 r2, 0x2211 stxh [r1+2], r2 ldxh r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xcc, 0xdd, // @@ -1049,12 +1076,16 @@ fn test_memory_instructions() { TestContextObject::new(4), ProgramResult::Ok(0x2211), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " mov32 r2, 0x44332211 stxw [r1+2], r2 ldxw r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xdd, // @@ -1063,14 +1094,18 @@ fn test_memory_instructions() { TestContextObject::new(4), ProgramResult::Ok(0x44332211), ); - test_interpreter_and_jit_asm!( + + let asm = format!( " mov r2, -2005440939 lsh r2, 32 or r2, 0x44332211 stxdw [r1+2], r2 ldxdw r0, [r1+2] - exit", + {final_instr}" + ); + test_interpreter_and_jit_asm!( + asm.as_str(), config.clone(), [ 0xaa, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // @@ -1489,14 +1524,13 @@ fn test_exit() { "return" }; let asm = format!("mov r0, 0\n{final_instr}\n"); - let asm_str = asm.as_str(); let config = Config { enabled_sbpf_versions: SBPFVersion::V1..=sbpf_version, ..Config::default() }; test_interpreter_and_jit_asm!( - asm_str, + asm.as_str(), config, [], (), @@ -1515,14 +1549,13 @@ fn test_early_exit() { "return" }; let asm = format!("mov r0, 3\n{final_instr}\nmov r0, 4\n{final_instr}\n"); - let asm_str = asm.as_str(); let config = Config { enabled_sbpf_versions: SBPFVersion::V1..=sbpf_version, ..Config::default() }; test_interpreter_and_jit_asm!( - asm_str, + asm.as_str(), config, [], (), @@ -2247,12 +2280,11 @@ fn test_entrypoint_exit() { mov r0, 12 {final_instr}" ); - let asm_str = asm.as_str(); // This checks that when foo exits we don't stop execution even if the // stack is empty (stack size and call depth are decoupled) test_interpreter_and_jit_asm!( - asm_str, + asm.as_str(), config, [], (), @@ -2292,10 +2324,8 @@ fn test_stack_call_depth_tracking() { " ); - let asm_str = asm.as_str(); - test_interpreter_and_jit_asm!( - asm_str, + asm.as_str(), config.clone(), [], (), @@ -2318,9 +2348,8 @@ fn test_stack_call_depth_tracking() { " ); - let asm_str = asm.as_str(); test_interpreter_and_jit_asm!( - asm_str, + asm.as_str(), config, [], (),