@@ -429,6 +429,48 @@ static void test_add_block_hook(void)
429429 OK (uc_close (uc ));
430430}
431431
432+ static void test_add_block_icount_hook_block_cb (uc_engine * uc , uint64_t address , uint32_t size , void * user_data )
433+ {
434+ uint64_t * icount = user_data ;
435+ * icount += size ;
436+ }
437+
438+ static void test_add_block_icount_hook (void )
439+ {
440+ uc_engine * uc ;
441+ uint64_t icount = 0 ;
442+ uc_hook syscall_hook ;
443+ uc_hook block_hook ;
444+ /* nop
445+ * syscall
446+ */
447+ char code [] = "\x90\x0F\x05" ;
448+
449+ uc_common_setup (& uc , UC_ARCH_X86 , UC_MODE_64 , code , sizeof (code ) - 1 );
450+ OK (uc_hook_add (uc , & syscall_hook , UC_HOOK_INSN , & test_add_block_hook_syscall_cb , NULL , 1 , 0 , UC_X86_INS_SYSCALL ));
451+ OK (uc_emu_start (uc , code_start , 0 , 0 , 0 ));
452+ OK (uc_hook_add (uc , & block_hook , UC_HOOK_BLOCK_ICOUNT , & test_add_block_icount_hook_block_cb , & icount , code_start , code_start + 0x1000 ));
453+ OK (uc_emu_start (uc , code_start , 0 , 0 , 0 ));
454+ TEST_CHECK (icount == 2 );
455+ TEST_CHECK (uc_hook_add (uc , & block_hook , UC_HOOK_BLOCK , & test_add_block_icount_hook_block_cb , & icount , 0 , code_start + 0x1000 ) == UC_ERR_HOOK_EXIST );
456+ TEST_CHECK (uc_hook_add (uc , & block_hook , UC_HOOK_BLOCK ,
457+ & test_add_block_icount_hook_block_cb , & icount ,
458+ code_start + 0x1000 ,
459+ code_start + 0x2000 ) == UC_ERR_HOOK_EXIST );
460+ TEST_CHECK (uc_hook_add (uc , & block_hook ,
461+ UC_HOOK_BLOCK | UC_HOOK_BLOCK_ICOUNT ,
462+ & test_add_block_icount_hook_block_cb , & icount ,
463+ code_start , code_start ) == UC_ERR_HOOK );
464+ OK (uc_hook_del (uc , block_hook ));
465+ OK (uc_hook_add (uc , & block_hook , UC_HOOK_BLOCK_ICOUNT ,
466+ & test_add_block_icount_hook_block_cb , & icount , code_start ,
467+ code_start ));
468+ TEST_CHECK (uc_hook_add (uc , & block_hook , UC_HOOK_BLOCK ,
469+ & test_add_block_icount_hook_block_cb , & icount ,
470+ code_start , code_start ) == UC_ERR_HOOK_EXIST );
471+ OK (uc_close (uc ));
472+ }
473+
432474TEST_LIST = {
433475 {"test_uc_ctl_mode" , test_uc_ctl_mode },
434476 {"test_uc_ctl_page_size" , test_uc_ctl_page_size },
@@ -448,4 +490,5 @@ TEST_LIST = {
448490 {"test_tlb_clear" , test_tlb_clear },
449491 {"test_noexec" , test_noexec },
450492 {"test_add_block_hook" , test_add_block_hook },
493+ {"test_add_block_icount_hook" , test_add_block_icount_hook },
451494 {NULL , NULL }};
0 commit comments