mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-24 09:28:36 +00:00
Added basic block hook regression test
This commit is contained in:
parent
5c3b681945
commit
7273013263
2 changed files with 83 additions and 1 deletions
2
regress/Makefile
Normal file → Executable file
2
regress/Makefile
Normal file → Executable file
|
@ -1,7 +1,7 @@
|
||||||
CFLAGS += -I../include
|
CFLAGS += -I../include
|
||||||
LDFLAGS = -L.. -lunicorn
|
LDFLAGS = -L.. -lunicorn
|
||||||
|
|
||||||
TESTS = map_crash sigill sigill2
|
TESTS = map_crash sigill sigill2 block_test
|
||||||
|
|
||||||
all: $(TESTS)
|
all: $(TESTS)
|
||||||
|
|
||||||
|
|
82
regress/block_test.c
Executable file
82
regress/block_test.c
Executable file
|
@ -0,0 +1,82 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <unicorn/unicorn.h>
|
||||||
|
|
||||||
|
static count = 1;
|
||||||
|
|
||||||
|
// Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK)
|
||||||
|
// @address: address where the code is being executed
|
||||||
|
// @size: size of machine instruction being executed
|
||||||
|
// @user_data: user data passed to tracing APIs.
|
||||||
|
void cb_hookblock(uch handle, uint64_t address, uint32_t size, void *user_data) {
|
||||||
|
fprintf(stderr, "# >>> Tracing basic block at 0x%llx, block size = 0x%x\n", address, size);
|
||||||
|
if (address != 0x1000000 && address != 0x1000200) {
|
||||||
|
fprintf(stderr, "not ok %d - address != 0x1000000 && address != 0x1000200\n", count++);
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - address (0x%x) is start of basic block\n", count++, address);
|
||||||
|
if (size != 0x200) {
|
||||||
|
fprintf(stderr, "not ok %d - basic block size != 0x200\n", count++);
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - basic block size is correct\n", count++);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
uch u;
|
||||||
|
|
||||||
|
fprintf(stderr, "# basic block callback test\n");
|
||||||
|
fprintf(stderr, "# there are only two basic blocks 0x1000000-0x10001ff and 0x1000200-0x10003ff\n");
|
||||||
|
|
||||||
|
uc_err err = uc_open(UC_ARCH_X86, UC_MODE_32, &u);
|
||||||
|
if (err != UC_ERR_OK) {
|
||||||
|
fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - uc_open\n", count++);
|
||||||
|
|
||||||
|
err = uc_mem_map(u, 0x1000000, 4096);
|
||||||
|
if (err != UC_ERR_OK) {
|
||||||
|
fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - uc_mem_map\n", count++);
|
||||||
|
|
||||||
|
uint8_t code[1024];
|
||||||
|
//build a program that consists of 1019 nops followed by a jump -512
|
||||||
|
//this program contains exactly 2 basic blocks, a block of 512 nops, followed
|
||||||
|
//by a loop body containing 507 nops and jump to the top of the loop
|
||||||
|
//the first basic block begins at address 0x1000000, and the second
|
||||||
|
//basic block begins at address 0x1000200
|
||||||
|
memset(code, 0x90, sizeof(code));
|
||||||
|
memcpy(code + 1024 - 5, "\xe9\x00\xfe\xff\xff", 5);
|
||||||
|
|
||||||
|
err = uc_mem_write(u, 0x1000000, code, sizeof(code));
|
||||||
|
if (err != UC_ERR_OK) {
|
||||||
|
fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - uc_mem_write\n", count++);
|
||||||
|
|
||||||
|
uch h1, h2;
|
||||||
|
|
||||||
|
err = uc_hook_add(u, &h1, UC_HOOK_BLOCK, cb_hookblock, NULL, (uint64_t)1, (uint64_t)0);
|
||||||
|
if (err != UC_ERR_OK) {
|
||||||
|
fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - uc_hook_add\n", count++);
|
||||||
|
|
||||||
|
err = uc_emu_start(u, 0x1000000, 0x1000000 + sizeof(code), 0, 1030);
|
||||||
|
if (err != UC_ERR_OK) {
|
||||||
|
fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok %d - uc_emu_start\n", count++);
|
||||||
|
|
||||||
|
fprintf(stderr, "ok %d - Done", count++);
|
||||||
|
}
|
Loading…
Reference in a new issue