test_ppc.c
Go to the documentation of this file.
1 /* Capstone Disassembler Engine */
2 /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013 */
3 
4 #include <stdio.h>
5 
6 #include <capstone/platform.h>
7 #include <capstone/capstone.h>
8 
9 struct platform {
10  cs_arch arch;
11  cs_mode mode;
12  unsigned char *code;
13  size_t size;
14  const char *comment;
15 };
16 
17 static csh handle;
18 
19 static void print_string_hex(const char *comment, unsigned char *str, size_t len)
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 }
30 
31 static const char* get_bc_name(int bc)
32 {
33  switch(bc) {
34  default:
35  case PPC_BC_INVALID:
36  return ("invalid");
37  case PPC_BC_LT:
38  return ("lt");
39  case PPC_BC_LE:
40  return ("le");
41  case PPC_BC_EQ:
42  return ("eq");
43  case PPC_BC_GE:
44  return ("ge");
45  case PPC_BC_GT:
46  return ("gt");
47  case PPC_BC_NE:
48  return ("ne");
49  case PPC_BC_UN:
50  return ("un");
51  case PPC_BC_NU:
52  return ("nu");
53  case PPC_BC_SO:
54  return ("so");
55  case PPC_BC_NS:
56  return ("ns");
57  }
58 }
59 
60 static void print_insn_detail(cs_insn *ins)
61 {
62  cs_ppc *ppc;
63  int i;
64 
65  // detail can be NULL on "data" instruction if SKIPDATA option is turned ON
66  if (ins->detail == NULL)
67  return;
68 
69  ppc = &(ins->detail->ppc);
70  if (ppc->op_count)
71  printf("\top_count: %u\n", ppc->op_count);
72 
73  for (i = 0; i < ppc->op_count; i++) {
74  cs_ppc_op *op = &(ppc->operands[i]);
75  switch((int)op->type) {
76  default:
77  break;
78  case PPC_OP_REG:
79  printf("\t\toperands[%u].type: REG = %s\n", i, cs_reg_name(handle, op->reg));
80  break;
81  case PPC_OP_IMM:
82  printf("\t\toperands[%u].type: IMM = 0x%" PRIx64 "\n", i, op->imm);
83  break;
84  case PPC_OP_MEM:
85  printf("\t\toperands[%u].type: MEM\n", i);
86  if (op->mem.base != PPC_REG_INVALID)
87  printf("\t\t\toperands[%u].mem.base: REG = %s\n",
88  i, cs_reg_name(handle, op->mem.base));
89  if (op->mem.disp != 0)
90  printf("\t\t\toperands[%u].mem.disp: 0x%x\n", i, op->mem.disp);
91 
92  break;
93  case PPC_OP_CRX:
94  printf("\t\toperands[%u].type: CRX\n", i);
95  printf("\t\t\toperands[%u].crx.scale: %d\n", i, op->crx.scale);
96  printf("\t\t\toperands[%u].crx.reg: %s\n", i, cs_reg_name(handle, op->crx.reg));
97  printf("\t\t\toperands[%u].crx.cond: %s\n", i, get_bc_name(op->crx.cond));
98  break;
99  }
100  }
101 
102  if (ppc->bc != 0)
103  printf("\tBranch code: %u\n", ppc->bc);
104 
105  if (ppc->bh != 0)
106  printf("\tBranch hint: %u\n", ppc->bh);
107 
108  if (ppc->update_cr0)
109  printf("\tUpdate-CR0: True\n");
110 
111  printf("\n");
112 }
113 
114 static void test()
115 {
116 #define PPC_CODE "\x43\x20\x0c\x07\x41\x56\xff\x17\x80\x20\x00\x00\x80\x3f\x00\x00\x10\x43\x23\x0e\xd0\x44\x00\x80\x4c\x43\x22\x02\x2d\x03\x00\x80\x7c\x43\x20\x14\x7c\x43\x20\x93\x4f\x20\x00\x21\x4c\xc8\x00\x21\x40\x82\x00\x14"
117 #define PPC_CODE2 "\x10\x60\x2a\x10\x10\x64\x28\x88\x7c\x4a\x5d\x0f"
118 
119  struct platform platforms[] = {
120  {
121  CS_ARCH_PPC,
123  (unsigned char*)PPC_CODE,
124  sizeof(PPC_CODE) - 1,
125  "PPC-64",
126  },
127  {
128  CS_ARCH_PPC,
130  (unsigned char*)PPC_CODE2,
131  sizeof(PPC_CODE2) - 1,
132  "PPC-64 + QPX",
133  },
134  };
135 
136  uint64_t address = 0x1000;
137  cs_insn *insn;
138  int i;
139  size_t count;
140 
141  for (i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
142  cs_err err = cs_open(platforms[i].arch, platforms[i].mode, &handle);
143  if (err) {
144  printf("Failed on cs_open() with error returned: %u\n", err);
145  abort();
146  }
147 
149 
150  count = cs_disasm(handle, platforms[i].code, platforms[i].size, address, 0, &insn);
151  if (count) {
152  size_t j;
153 
154  printf("****************\n");
155  printf("Platform: %s\n", platforms[i].comment);
157  printf("Disasm:\n");
158 
159  for (j = 0; j < count; j++) {
160  printf("0x%" PRIx64 ":\t%s\t%s\n", insn[j].address, insn[j].mnemonic, insn[j].op_str);
161  print_insn_detail(&insn[j]);
162  }
163  printf("0x%" PRIx64 ":\n", insn[j-1].address + insn[j-1].size);
164 
165  // free memory allocated by cs_disasm()
166  cs_free(insn, count);
167  } else {
168  printf("****************\n");
169  printf("Platform: %s\n", platforms[i].comment);
171  printf("ERROR: Failed to disasm given code!\n");
172  abort();
173  }
174 
175  printf("\n");
176 
177  cs_close(&handle);
178  }
179 }
180 
181 int main()
182 {
183  test();
184 
185  return 0;
186 }
xds_interop_client.str
str
Definition: xds_interop_client.py:487
cs_close
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_close(csh *handle)
Definition: cs.c:522
get_bc_name
static const char * get_bc_name(int bc)
Definition: test_ppc.c:31
PPC_BC_EQ
@ PPC_BC_EQ
Definition: ppc.h:22
PPC_REG_INVALID
@ PPC_REG_INVALID
Definition: ppc.h:52
cs_ppc_op
Instruction operand.
Definition: ppc.h:283
platform::code
unsigned char * code
Definition: test_arm_regression.c:21
handle
static csh handle
Definition: test_ppc.c:17
cs_disasm
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:822
CS_ARCH_PPC
@ CS_ARCH_PPC
PowerPC architecture.
Definition: capstone.h:79
ppc
Definition: test_winkernel.cpp:71
printf
_Use_decl_annotations_ int __cdecl printf(const char *_Format,...)
Definition: cs_driver.c:91
error_ref_leak.err
err
Definition: error_ref_leak.py:35
cs_open
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle)
Definition: cs.c:474
platform::mode
cs_mode mode
Definition: test_arm_regression.c:20
cs_arch
cs_arch
Architecture type.
Definition: capstone.h:74
PPC_OP_MEM
@ PPC_OP_MEM
= CS_OP_MEM (Memory operand).
Definition: ppc.h:46
mode
const char int mode
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:135
CS_OPT_DETAIL
@ CS_OPT_DETAIL
Break down instruction structure into details.
Definition: capstone.h:172
PPC_BC_NU
@ PPC_BC_NU
Definition: ppc.h:27
cs_option
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_option(csh ud, cs_opt_type type, size_t value)
Definition: cs.c:670
PPC_BC_LT
@ PPC_BC_LT
Definition: ppc.h:20
cs_mode
cs_mode
Mode type.
Definition: capstone.h:103
capstone.h
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
PPC_BC_GE
@ PPC_BC_GE
Definition: ppc.h:23
PPC_BC_GT
@ PPC_BC_GT
Definition: ppc.h:24
cs_ppc
Instruction structure.
Definition: ppc.h:294
CS_MODE_QPX
@ CS_MODE_QPX
Quad Processing eXtensions mode (PPC)
Definition: capstone.h:117
cs_reg_name
const CAPSTONE_EXPORT char *CAPSTONE_API cs_reg_name(csh ud, unsigned int reg)
Definition: cs.c:1176
platform.h
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
PPC_BC_UN
@ PPC_BC_UN
Definition: ppc.h:26
PPC_BC_INVALID
@ PPC_BC_INVALID
Definition: ppc.h:19
CS_OPT_ON
@ CS_OPT_ON
Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA).
Definition: capstone.h:184
platform::comment
char * comment
Definition: test_arm_regression.c:23
print_string_hex
static void print_string_hex(const char *comment, unsigned char *str, size_t len)
Definition: test_ppc.c:19
CS_MODE_BIG_ENDIAN
@ CS_MODE_BIG_ENDIAN
big-endian mode
Definition: capstone.h:124
PPC_BC_NS
@ PPC_BC_NS
not summary overflow
Definition: ppc.h:31
arch
cs_arch arch
Definition: cstool.c:13
platform::arch
cs_arch arch
Definition: test_arm_regression.c:19
PPC_BC_NE
@ PPC_BC_NE
Definition: ppc.h:25
PPC_BC_SO
@ PPC_BC_SO
summary overflow
Definition: ppc.h:30
csh
size_t csh
Definition: capstone.h:71
PPC_OP_REG
@ PPC_OP_REG
= CS_OP_REG (Register operand).
Definition: ppc.h:44
PPC_CODE2
#define PPC_CODE2
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
main
int main()
Definition: test_ppc.c:181
PPC_BC_LE
@ PPC_BC_LE
Definition: ppc.h:21
PPC_CODE
#define PPC_CODE
cs_free
CAPSTONE_EXPORT void CAPSTONE_API cs_free(cs_insn *insn, size_t count)
Definition: cs.c:1039
code
Definition: bloaty/third_party/zlib/contrib/infback9/inftree9.h:24
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
platforms
struct platform platforms[]
Definition: fuzz_diff.c:18
PPC_OP_IMM
@ PPC_OP_IMM
= CS_OP_IMM (Immediate operand).
Definition: ppc.h:45
print_insn_detail
static void print_insn_detail(cs_insn *ins)
Definition: test_ppc.c:60
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
platform
Definition: test_arm_regression.c:18
platform::size
size_t size
Definition: test_arm_regression.c:22
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
test
static void test()
Definition: test_ppc.c:114
PPC_OP_CRX
@ PPC_OP_CRX
Condition Register field.
Definition: ppc.h:47


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:28