Rizin
unix-like reverse engineering framework and cli tools
test_sparc.c File Reference
#include <stdio.h>
#include <capstone/platform.h>
#include <capstone/capstone.h>

Go to the source code of this file.

Classes

struct  platform
 

Macros

#define SPARC_CODE   "\x80\xa0\x40\x02\x85\xc2\x60\x08\x85\xe8\x20\x01\x81\xe8\x00\x00\x90\x10\x20\x01\xd5\xf6\x10\x16\x21\x00\x00\x0a\x86\x00\x40\x02\x01\x00\x00\x00\x12\xbf\xff\xff\x10\xbf\xff\xff\xa0\x02\x00\x09\x0d\xbf\xff\xff\xd4\x20\x60\x00\xd4\x4e\x00\x16\x2a\xc2\x80\x03"
 
#define SPARCV9_CODE   "\x81\xa8\x0a\x24\x89\xa0\x10\x20\x89\xa0\x1a\x60\x89\xa0\x00\xe0"
 

Functions

static void print_string_hex (const char *comment, unsigned char *str, size_t len)
 
static void print_insn_detail (cs_insn *ins)
 
static void test ()
 
int main ()
 

Variables

static csh handle
 

Macro Definition Documentation

◆ SPARC_CODE

#define SPARC_CODE   "\x80\xa0\x40\x02\x85\xc2\x60\x08\x85\xe8\x20\x01\x81\xe8\x00\x00\x90\x10\x20\x01\xd5\xf6\x10\x16\x21\x00\x00\x0a\x86\x00\x40\x02\x01\x00\x00\x00\x12\xbf\xff\xff\x10\xbf\xff\xff\xa0\x02\x00\x09\x0d\xbf\xff\xff\xd4\x20\x60\x00\xd4\x4e\x00\x16\x2a\xc2\x80\x03"

◆ SPARCV9_CODE

#define SPARCV9_CODE   "\x81\xa8\x0a\x24\x89\xa0\x10\x20\x89\xa0\x1a\x60\x89\xa0\x00\xe0"

Function Documentation

◆ main()

int main ( void  )

Definition at line 147 of file test_sparc.c.

148 {
149  test();
150 
151  return 0;
152 }
static void test()
Definition: test_sparc.c:79

References test().

◆ print_insn_detail()

static void print_insn_detail ( cs_insn *  ins)
static

Definition at line 31 of file test_sparc.c.

32 {
33  cs_sparc *sparc;
34  int i;
35 
36  // detail can be NULL on "data" instruction if SKIPDATA option is turned ON
37  if (ins->detail == NULL)
38  return;
39 
40  sparc = &(ins->detail->sparc);
41  if (sparc->op_count)
42  printf("\top_count: %u\n", sparc->op_count);
43 
44  for (i = 0; i < sparc->op_count; i++) {
45  cs_sparc_op *op = &(sparc->operands[i]);
46  switch((int)op->type) {
47  default:
48  break;
49  case SPARC_OP_REG:
50  printf("\t\toperands[%u].type: REG = %s\n", i, cs_reg_name(handle, op->reg));
51  break;
52  case SPARC_OP_IMM:
53  printf("\t\toperands[%u].type: IMM = 0x%" PRIx64 "\n", i, op->imm);
54  break;
55  case SPARC_OP_MEM:
56  printf("\t\toperands[%u].type: MEM\n", i);
57  if (op->mem.base != X86_REG_INVALID)
58  printf("\t\t\toperands[%u].mem.base: REG = %s\n",
59  i, cs_reg_name(handle, op->mem.base));
60  if (op->mem.index != X86_REG_INVALID)
61  printf("\t\t\toperands[%u].mem.index: REG = %s\n",
62  i, cs_reg_name(handle, op->mem.index));
63  if (op->mem.disp != 0)
64  printf("\t\t\toperands[%u].mem.disp: 0x%x\n", i, op->mem.disp);
65 
66  break;
67  }
68  }
69 
70  if (sparc->cc != 0)
71  printf("\tCode condition: %u\n", sparc->cc);
72 
73  if (sparc->hint != 0)
74  printf("\tHint code: %u\n", sparc->hint);
75 
76  printf("\n");
77 }
lzma_index ** i
Definition: index.h:629
@ X86_REG_INVALID
Definition: x86.h:20
#define NULL
Definition: cris-opc.c:27
CAPSTONE_EXPORT const char *CAPSTONE_API cs_reg_name(csh ud, unsigned int reg)
Definition: cs.c:1154
_Use_decl_annotations_ int __cdecl printf(const char *const _Format,...)
Definition: cs_driver.c:93
Instruction operand.
Definition: sparc.h:189
Instruction structure.
Definition: sparc.h:199
@ SPARC_OP_MEM
= CS_OP_MEM (Memory operand).
Definition: sparc.h:74
@ SPARC_OP_IMM
= CS_OP_IMM (Immediate operand).
Definition: sparc.h:73
@ SPARC_OP_REG
= CS_OP_REG (Register operand).
Definition: sparc.h:72
#define PRIx64
Definition: sysdefs.h:94
static csh handle
Definition: test_sparc.c:17
Definition: dis.c:32

References cs_reg_name(), handle, i, NULL, printf(), PRIx64, SPARC_OP_IMM, SPARC_OP_MEM, SPARC_OP_REG, and X86_REG_INVALID.

Referenced by test().

◆ print_string_hex()

static void print_string_hex ( const char *  comment,
unsigned char *  str,
size_t  len 
)
static

Definition at line 19 of file test_sparc.c.

20 {
21  unsigned char *c;
22 
23  printf("%s", comment);
24  for (c = str; c < str + len; c++) {
25  printf("0x%02x ", *c & 0xff);
26  }
27 
28  printf("\n");
29 }
size_t len
Definition: 6502dis.c:15
#define c(i)
Definition: sha256.c:43

References c, len, printf(), and cmd_descs_generate::str.

Referenced by test().

◆ test()

static void test ( )
static

Definition at line 79 of file test_sparc.c.

80 {
81 #define SPARC_CODE "\x80\xa0\x40\x02\x85\xc2\x60\x08\x85\xe8\x20\x01\x81\xe8\x00\x00\x90\x10\x20\x01\xd5\xf6\x10\x16\x21\x00\x00\x0a\x86\x00\x40\x02\x01\x00\x00\x00\x12\xbf\xff\xff\x10\xbf\xff\xff\xa0\x02\x00\x09\x0d\xbf\xff\xff\xd4\x20\x60\x00\xd4\x4e\x00\x16\x2a\xc2\x80\x03"
82 
83 #define SPARCV9_CODE "\x81\xa8\x0a\x24\x89\xa0\x10\x20\x89\xa0\x1a\x60\x89\xa0\x00\xe0"
84 
85  struct platform platforms[] = {
86  {
89  (unsigned char*)SPARC_CODE,
90  sizeof(SPARC_CODE) - 1,
91  "Sparc",
92  },
93  {
96  (unsigned char*)SPARCV9_CODE,
97  sizeof(SPARCV9_CODE) - 1,
98  "SparcV9"
99  },
100  };
101 
102  uint64_t address = 0x1000;
103  cs_insn *insn;
104  int i;
105  size_t count;
106 
107  for (i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
108  cs_err err = cs_open(platforms[i].arch, platforms[i].mode, &handle);
109  if (err) {
110  printf("Failed on cs_open() with error returned: %u\n", err);
111  abort();
112  }
113 
115 
116  count = cs_disasm(handle, platforms[i].code, platforms[i].size, address, 0, &insn);
117  if (count) {
118  size_t j;
119 
120  printf("****************\n");
121  printf("Platform: %s\n", platforms[i].comment);
123  printf("Disasm:\n");
124 
125  for (j = 0; j < count; j++) {
126  printf("0x%" PRIx64 ":\t%s\t%s\n", insn[j].address, insn[j].mnemonic, insn[j].op_str);
127  print_insn_detail(&insn[j]);
128  }
129  printf("0x%" PRIx64 ":\n", insn[j-1].address + insn[j-1].size);
130 
131  // free memory allocated by cs_disasm()
132  cs_free(insn, count);
133  } else {
134  printf("****************\n");
135  printf("Platform: %s\n", platforms[i].comment);
137  printf("ERROR: Failed to disasm given code!\n");
138  abort();
139  }
140 
141  printf("\n");
142 
143  cs_close(&handle);
144  }
145 }
static bool err
Definition: armass.c:435
@ CS_ARCH_SPARC
Sparc architecture.
Definition: capstone.h:80
cs_mode
Mode type.
Definition: capstone.h:102
@ CS_MODE_BIG_ENDIAN
big-endian mode
Definition: capstone.h:123
@ CS_MODE_V9
SparcV9 mode (Sparc)
Definition: capstone.h:115
@ CS_OPT_DETAIL
Break down instruction structure into details.
Definition: capstone.h:171
@ CS_OPT_ON
Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA).
Definition: capstone.h:183
CAPSTONE_EXPORT size_t CAPSTONE_API cs_disasm(csh ud, const uint8_t *buffer, size_t size, uint64_t offset, size_t count, cs_insn **insn)
Definition: cs.c:798
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle)
Definition: cs.c:453
CAPSTONE_EXPORT void CAPSTONE_API cs_free(cs_insn *insn, size_t count)
Definition: cs.c:1017
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_close(csh *handle)
Definition: cs.c:501
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_option(csh ud, cs_opt_type type, size_t value)
Definition: cs.c:646
cs_arch arch
Definition: cstool.c:13
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
Definition: sflib.h:98
struct platform platforms[]
Definition: fuzz_diff.c:18
voidpf void uLong size
Definition: ioapi.h:138
const char int mode
Definition: ioapi.h:137
unsigned long uint64_t
Definition: sftypes.h:28
Definition: inftree9.h:24
#define SPARCV9_CODE
static void print_string_hex(const char *comment, unsigned char *str, size_t len)
Definition: test_sparc.c:19
static void print_insn_detail(cs_insn *ins)
Definition: test_sparc.c:31
#define SPARC_CODE
mnemonic
Definition: z80asm.h:48

References arch, platform::comment, count, CS_ARCH_SPARC, cs_close(), cs_disasm(), cs_free(), CS_MODE_BIG_ENDIAN, CS_MODE_V9, cs_open(), CS_OPT_DETAIL, CS_OPT_ON, cs_option(), err, handle, i, platforms, print_insn_detail(), print_string_hex(), printf(), PRIx64, SPARC_CODE, and SPARCV9_CODE.

Referenced by main().

Variable Documentation

◆ handle

csh handle
static

Definition at line 17 of file test_sparc.c.

Referenced by print_insn_detail(), and test().