Skip to content

Commit

Permalink
Move M68K tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Rot127 committed Aug 6, 2024
1 parent 5926fc8 commit f7fdd64
Show file tree
Hide file tree
Showing 7 changed files with 713 additions and 52 deletions.
7 changes: 5 additions & 2 deletions suite/cstest/include/test_detail.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "test_detail_tms320c64x.h"
#include "test_detail_wasm.h"
#include "test_detail_x86.h"
#include "test_detail_m68k.h"
#include "test_compare.h"
#include <capstone/capstone.h>
#include <cyaml/cyaml.h>
Expand Down Expand Up @@ -57,8 +58,7 @@ typedef struct {
TestDetailLoongArch *loongarch;
TestDetailWASM *wasm;
TestDetailX86 *x86;
// cs_x86_test x86;
// cs_m68k_test m68k;
TestDetailM68K *m68k;

char **regs_read;
uint8_t regs_read_count;
Expand Down Expand Up @@ -136,6 +136,9 @@ static const cyaml_schema_field_t test_detail_mapping_schema[] = {
CYAML_FIELD_MAPPING_PTR("x86", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetail, x86,
test_detail_x86_mapping_schema),
CYAML_FIELD_MAPPING_PTR(
"m68k", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL, TestDetail,
m68k, test_detail_m68k_mapping_schema),
CYAML_FIELD_SEQUENCE("regs_read",
CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetail, regs_read, &reg_group_schema, 0, 255),
Expand Down
151 changes: 151 additions & 0 deletions suite/cstest/include/test_detail_m68k.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// Copyright © 2024 Rot127 <[email protected]>
// SPDX-License-Identifier: BSD-3

#ifndef TEST_DETAIL_M68K_H
#define TEST_DETAIL_M68K_H

#include "test_compare.h"
#include <cyaml/cyaml.h>
#include <capstone/capstone.h>

typedef struct {
char *base_reg;
char *index_reg;
char *in_base_reg;
tbool index_size; // -1 == word, 1 == long
int16_t disp;
uint32_t in_disp;
uint32_t out_disp;
uint8_t scale;
uint8_t bitfield;
uint8_t width;
uint8_t offset;
} TestDetailM68KOpMem;

static const cyaml_schema_field_t test_detail_m68k_op_mem_mapping_schema[] = {
CYAML_FIELD_INT("disp", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem, disp),
CYAML_FIELD_STRING_PTR(
"base_reg", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOpMem, base_reg, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR(
"index_reg", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOpMem, index_reg, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR(
"in_base_reg", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOpMem, in_base_reg, 0, CYAML_UNLIMITED),
CYAML_FIELD_INT("index_size", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOpMem, index_size),
CYAML_FIELD_INT("disp", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem, disp),
CYAML_FIELD_UINT("in_disp", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
in_disp),
CYAML_FIELD_UINT("out_disp", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
out_disp),
CYAML_FIELD_UINT("scale", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
scale),
CYAML_FIELD_UINT("bitfield", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
bitfield),
CYAML_FIELD_UINT("width", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
width),
CYAML_FIELD_UINT("offset", CYAML_FLAG_OPTIONAL, TestDetailM68KOpMem,
offset),
CYAML_FIELD_END
};

typedef struct {
char *type;
char *address_mode;

char *reg;
char *reg_pair_0;
char *reg_pair_1;

uint64_t imm;
int32_t br_disp;
uint8_t br_disp_size;

uint32_t register_bits;

double dimm;
float simm;

TestDetailM68KOpMem *mem;
} TestDetailM68KOp;

static const cyaml_schema_value_t test_detail_m68k_op_sys_psr_schema = {
CYAML_VALUE_STRING(CYAML_FLAG_POINTER, char, 0, CYAML_UNLIMITED),
};

static const cyaml_schema_field_t test_detail_m68k_op_mapping_schema[] = {
CYAML_FIELD_STRING_PTR("type", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOp, type, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR(
"address_mode", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOp, address_mode, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("reg", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOp, reg, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR(
"reg_pair_0", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOp, reg_pair_0, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR(
"reg_pair_1", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68KOp, reg_pair_1, 0, CYAML_UNLIMITED),
CYAML_FIELD_INT("imm", CYAML_FLAG_OPTIONAL, TestDetailM68KOp, imm),
CYAML_FIELD_INT("br_disp", CYAML_FLAG_OPTIONAL, TestDetailM68KOp,
br_disp),
CYAML_FIELD_UINT("br_disp_size", CYAML_FLAG_OPTIONAL, TestDetailM68KOp,
br_disp_size),
CYAML_FIELD_UINT("register_bits", CYAML_FLAG_OPTIONAL, TestDetailM68KOp,
register_bits),
CYAML_FIELD_FLOAT("dimm", CYAML_FLAG_OPTIONAL, TestDetailM68KOp, dimm),
CYAML_FIELD_FLOAT("simm", CYAML_FLAG_OPTIONAL, TestDetailM68KOp, simm),
CYAML_FIELD_MAPPING_PTR("mem", CYAML_FLAG_OPTIONAL, TestDetailM68KOp,
mem, test_detail_m68k_op_mem_mapping_schema),
CYAML_FIELD_END
};

static const cyaml_schema_value_t test_detail_m68k_op_schema = {
CYAML_VALUE_MAPPING(CYAML_FLAG_POINTER, TestDetailM68KOp,
test_detail_m68k_op_mapping_schema),
};

typedef struct {
char *op_size_type;
char *op_size_fpu;
char *op_size_cpu;

TestDetailM68KOp **operands;
uint32_t operands_count;
} TestDetailM68K;

static const cyaml_schema_field_t test_detail_m68k_mapping_schema[] = {
CYAML_FIELD_STRING_PTR(
"op_size_type", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68K, op_size_type, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("op_size_fpu",
CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68K, op_size_fpu, 0, CYAML_UNLIMITED),
CYAML_FIELD_STRING_PTR("op_size_cpu",
CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68K, op_size_cpu, 0, CYAML_UNLIMITED),
CYAML_FIELD_SEQUENCE(
"operands", CYAML_FLAG_POINTER | CYAML_FLAG_OPTIONAL,
TestDetailM68K, operands, &test_detail_m68k_op_schema, 0,
CYAML_UNLIMITED), // 0-MAX options
CYAML_FIELD_END
};

TestDetailM68K *test_detail_m68k_new();
TestDetailM68K *test_detail_m68k_clone(TestDetailM68K *detail);
void test_detail_m68k_free(TestDetailM68K *detail);

TestDetailM68KOp *test_detail_m68k_op_new();
TestDetailM68KOp *test_detail_m68k_op_clone(TestDetailM68KOp *detail);
void test_detail_m68k_op_free(TestDetailM68KOp *detail);

TestDetailM68KOpMem *test_detail_m68k_op_mem_new();
TestDetailM68KOpMem *test_detail_m68k_op_mem_clone(TestDetailM68KOpMem *detail);
void test_detail_m68k_op_mem_free(TestDetailM68KOpMem *detail);

bool test_expected_m68k(csh *handle, cs_m68k *actual, TestDetailM68K *expected);

#endif // TEST_DETAIL_M68K_H
59 changes: 59 additions & 0 deletions suite/cstest/include/test_mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -727,6 +727,65 @@ static const cs_enum_id_map cs_enum_map[] = {
{ .str = "M680X_OP_REGISTER", .val = M680X_OP_REGISTER },
{ .str = "M680X_OP_RELATIVE", .val = M680X_OP_RELATIVE },
{ .str = "M680X_SECOND_OP_IN_MNEM", .val = M680X_SECOND_OP_IN_MNEM },
{ .str = "M68K_AM_ABSOLUTE_DATA_LONG",
.val = M68K_AM_ABSOLUTE_DATA_LONG },
{ .str = "M68K_AM_ABSOLUTE_DATA_SHORT",
.val = M68K_AM_ABSOLUTE_DATA_SHORT },
{ .str = "M68K_AM_AREGI_INDEX_8_BIT_DISP",
.val = M68K_AM_AREGI_INDEX_8_BIT_DISP },
{ .str = "M68K_AM_AREGI_INDEX_BASE_DISP",
.val = M68K_AM_AREGI_INDEX_BASE_DISP },
{ .str = "M68K_AM_BRANCH_DISPLACEMENT",
.val = M68K_AM_BRANCH_DISPLACEMENT },
{ .str = "M68K_AM_IMMEDIATE", .val = M68K_AM_IMMEDIATE },
{ .str = "M68K_AM_MEMI_POST_INDEX", .val = M68K_AM_MEMI_POST_INDEX },
{ .str = "M68K_AM_MEMI_PRE_INDEX", .val = M68K_AM_MEMI_PRE_INDEX },
{ .str = "M68K_AM_NONE", .val = M68K_AM_NONE },
{ .str = "M68K_AM_PCI_DISP", .val = M68K_AM_PCI_DISP },
{ .str = "M68K_AM_PCI_INDEX_8_BIT_DISP",
.val = M68K_AM_PCI_INDEX_8_BIT_DISP },
{ .str = "M68K_AM_PCI_INDEX_BASE_DISP",
.val = M68K_AM_PCI_INDEX_BASE_DISP },
{ .str = "M68K_AM_PC_MEMI_POST_INDEX",
.val = M68K_AM_PC_MEMI_POST_INDEX },
{ .str = "M68K_AM_PC_MEMI_PRE_INDEX",
.val = M68K_AM_PC_MEMI_PRE_INDEX },
{ .str = "M68K_AM_REGI_ADDR", .val = M68K_AM_REGI_ADDR },
{ .str = "M68K_AM_REGI_ADDR_DISP", .val = M68K_AM_REGI_ADDR_DISP },
{ .str = "M68K_AM_REGI_ADDR_POST_INC",
.val = M68K_AM_REGI_ADDR_POST_INC },
{ .str = "M68K_AM_REGI_ADDR_PRE_DEC",
.val = M68K_AM_REGI_ADDR_PRE_DEC },
{ .str = "M68K_AM_REG_DIRECT_ADDR", .val = M68K_AM_REG_DIRECT_ADDR },
{ .str = "M68K_AM_REG_DIRECT_DATA", .val = M68K_AM_REG_DIRECT_DATA },
{ .str = "M68K_CPU_SIZE_BYTE", .val = M68K_CPU_SIZE_BYTE },
{ .str = "M68K_CPU_SIZE_LONG", .val = M68K_CPU_SIZE_LONG },
{ .str = "M68K_CPU_SIZE_NONE", .val = M68K_CPU_SIZE_NONE },
{ .str = "M68K_CPU_SIZE_WORD", .val = M68K_CPU_SIZE_WORD },
{ .str = "M68K_FPU_SIZE_DOUBLE", .val = M68K_FPU_SIZE_DOUBLE },
{ .str = "M68K_FPU_SIZE_EXTENDED", .val = M68K_FPU_SIZE_EXTENDED },
{ .str = "M68K_FPU_SIZE_NONE", .val = M68K_FPU_SIZE_NONE },
{ .str = "M68K_FPU_SIZE_SINGLE", .val = M68K_FPU_SIZE_SINGLE },
{ .str = "M68K_GRP_BRANCH_RELATIVE", .val = M68K_GRP_BRANCH_RELATIVE },
{ .str = "M68K_GRP_IRET", .val = M68K_GRP_IRET },
{ .str = "M68K_GRP_JUMP", .val = M68K_GRP_JUMP },
{ .str = "M68K_GRP_RET", .val = M68K_GRP_RET },
{ .str = "M68K_OP_BR_DISP", .val = M68K_OP_BR_DISP },
{ .str = "M68K_OP_BR_DISP_SIZE_BYTE",
.val = M68K_OP_BR_DISP_SIZE_BYTE },
{ .str = "M68K_OP_BR_DISP_SIZE_LONG",
.val = M68K_OP_BR_DISP_SIZE_LONG },
{ .str = "M68K_OP_BR_DISP_SIZE_WORD",
.val = M68K_OP_BR_DISP_SIZE_WORD },
{ .str = "M68K_OP_FP_DOUBLE", .val = M68K_OP_FP_DOUBLE },
{ .str = "M68K_OP_FP_SINGLE", .val = M68K_OP_FP_SINGLE },
{ .str = "M68K_OP_IMM", .val = M68K_OP_IMM },
{ .str = "M68K_OP_MEM", .val = M68K_OP_MEM },
{ .str = "M68K_OP_REG", .val = M68K_OP_REG },
{ .str = "M68K_OP_REG_BITS", .val = M68K_OP_REG_BITS },
{ .str = "M68K_OP_REG_PAIR", .val = M68K_OP_REG_PAIR },
{ .str = "M68K_SIZE_TYPE_CPU", .val = M68K_SIZE_TYPE_CPU },
{ .str = "M68K_SIZE_TYPE_FPU", .val = M68K_SIZE_TYPE_FPU },
{ .str = "MIPS_OP_IMM", .val = MIPS_OP_IMM },
{ .str = "MIPS_OP_MEM", .val = MIPS_OP_MEM },
{ .str = "MIPS_OP_REG", .val = MIPS_OP_REG },
Expand Down
23 changes: 17 additions & 6 deletions suite/cstest/src/test_detail.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,15 @@ TestDetail *test_detail_clone(TestDetail *detail)
if (detail->aarch64) {
clone->aarch64 = test_detail_aarch64_clone(detail->aarch64);
}

if (detail->arm) {
clone->arm = test_detail_arm_clone(detail->arm);
}

if (detail->ppc) {
clone->ppc = test_detail_ppc_clone(detail->ppc);
}

if (detail->tricore) {
clone->tricore = test_detail_tricore_clone(detail->tricore);
}

if (detail->alpha) {
clone->alpha = test_detail_alpha_clone(detail->alpha);
}
Expand Down Expand Up @@ -108,6 +104,9 @@ TestDetail *test_detail_clone(TestDetail *detail)
if (detail->x86) {
clone->x86 = test_detail_x86_clone(detail->x86);
}
if (detail->m68k) {
clone->m68k = test_detail_m68k_clone(detail->m68k);
}

return clone;
}
Expand Down Expand Up @@ -193,6 +192,9 @@ void test_detail_free(TestDetail *detail)
if (detail->x86) {
test_detail_x86_free(detail->x86);
}
if (detail->m68k) {
test_detail_m68k_free(detail->m68k);
}

cs_mem_free(detail);
}
Expand All @@ -204,8 +206,13 @@ bool test_expected_detail(csh *handle, const cs_insn *insn,
cs_detail *actual = insn->detail;
cs_regs regs_read, regs_write;
uint8_t regs_read_count, regs_write_count;
cs_regs_access(*handle, insn, regs_read, &regs_read_count, regs_write,
&regs_write_count);
cs_err err = cs_regs_access(*handle, insn, regs_read, &regs_read_count,
regs_write, &regs_write_count);
if (err != CS_ERR_OK) {
fprintf(stderr, "cs_regs_access() failed with '%s'\n",
cs_strerror(err));
return false;
}

if (expected->regs_read_count > 0) {
compare_uint32_ret(regs_read_count, expected->regs_read_count,
Expand Down Expand Up @@ -308,5 +315,9 @@ bool test_expected_detail(csh *handle, const cs_insn *insn,
if (expected->x86) {
return test_expected_x86(handle, &actual->x86, expected->x86);
}
if (expected->m68k) {
return test_expected_m68k(handle, &actual->m68k,
expected->m68k);
}
return true;
}
Loading

0 comments on commit f7fdd64

Please sign in to comment.