From 89cda0065272606c6a1f5d66901bda908e47ab29 Mon Sep 17 00:00:00 2001 From: Khairulmizam Samsudin Date: Thu, 12 Mar 2020 11:48:41 +0800 Subject: [PATCH] Add test for x64 to verify fpu and xmm register size and offset (#16186) --- test/unit/test_debug.c | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 test/unit/test_debug.c diff --git a/test/unit/test_debug.c b/test/unit/test_debug.c new file mode 100644 index 0000000000..96802c7f90 --- /dev/null +++ b/test/unit/test_debug.c @@ -0,0 +1,63 @@ +#include +#include "minunit.h" +#if __linux__ +#include + +#ifndef offsetof +#define offsetof(type, field) ((size_t) &((type *)0)->field) +#endif + +#endif //__linux__ + +bool test_r_debug_use(void) { + RDebug *dbg; + bool res; + + dbg = r_debug_new (true); + mu_assert_notnull (dbg, "r_debug_new () failed"); + + res = r_debug_use (dbg, "null"); + mu_assert_eq (res, true, "r_debug_use () failed"); + + r_debug_free (dbg); + mu_end; +} + +bool test_r_debug_reg_offset(void) { +#if __linux__ +#ifdef __x86_64__ +#define FPREGS struct user_fpregs_struct + FPREGS regs; + mu_assert_eq (sizeof (regs.cwd), 2, "cwd size"); + mu_assert_eq (offsetof (FPREGS, cwd), 0, "cwd offset"); + + mu_assert_eq (sizeof (regs.rip), 8, "rip size"); + mu_assert_eq (offsetof (FPREGS, rip), 8, "rip offset"); + + mu_assert_eq (sizeof (regs.mxcsr), 4, "mxcsr size"); + mu_assert_eq (offsetof (FPREGS, mxcsr), 24, "mxcsr offset"); + + mu_assert_eq (sizeof (regs.mxcr_mask), 4, "mxcr_mask size"); + mu_assert_eq (offsetof (FPREGS, mxcr_mask), 28, "mxcr_mask offset"); + + mu_assert_eq (sizeof (regs.st_space[0]) * 2, 8, "st0 size"); + mu_assert_eq (offsetof (FPREGS, st_space[0]), 32, "st0 offset"); + + mu_assert_eq (sizeof (regs.xmm_space[0]) * 4, 16, "xmm0 size"); + mu_assert_eq (offsetof (FPREGS, xmm_space[0]), 160, "xmm0 offset"); + + mu_assert_eq (offsetof (FPREGS, padding[0]), 416, "x64"); +#endif //__x86_64__ +#endif //__linux__ + mu_end; +} + +int all_tests() { + mu_run_test (test_r_debug_use); + mu_run_test (test_r_debug_reg_offset); + return tests_passed != tests_run; +} + +int main(int argc, char **argv) { + return all_tests (); +}