1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Google, Inc.
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
7*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
8*61046927SAndroid Build Coastguard Worker #include <stdint.h>
9*61046927SAndroid Build Coastguard Worker #include <stdio.h>
10*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
11*61046927SAndroid Build Coastguard Worker #include <unistd.h>
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "util/os_file.h"
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker #include "freedreno_dev_info.h"
16*61046927SAndroid Build Coastguard Worker #include "ir3-isa.h"
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker static void
disasm_instr_cb(void * d,unsigned n,void * instr)19*61046927SAndroid Build Coastguard Worker disasm_instr_cb(void *d, unsigned n, void *instr)
20*61046927SAndroid Build Coastguard Worker {
21*61046927SAndroid Build Coastguard Worker uint32_t *dwords = (uint32_t *)instr;
22*61046927SAndroid Build Coastguard Worker printf("%3d[%08x_%08x] ", n, dwords[1], dwords[0]);
23*61046927SAndroid Build Coastguard Worker }
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker static void
usage(const char * prog)26*61046927SAndroid Build Coastguard Worker usage(const char *prog)
27*61046927SAndroid Build Coastguard Worker {
28*61046927SAndroid Build Coastguard Worker fprintf(stderr,
29*61046927SAndroid Build Coastguard Worker "Usage: %s [-g GPU_ID | -c CHIP_ID] [-x HEX | FILE]\n"
30*61046927SAndroid Build Coastguard Worker " -g GPU_ID: specify GPU ID\n"
31*61046927SAndroid Build Coastguard Worker " -c CHIP_ID: specify GPU chip ID in hex\n"
32*61046927SAndroid Build Coastguard Worker " -x HEX: disassemble instruction encoded as HEX\n",
33*61046927SAndroid Build Coastguard Worker prog);
34*61046927SAndroid Build Coastguard Worker }
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker int
main(int argc,char ** argv)37*61046927SAndroid Build Coastguard Worker main(int argc, char **argv)
38*61046927SAndroid Build Coastguard Worker {
39*61046927SAndroid Build Coastguard Worker size_t sz;
40*61046927SAndroid Build Coastguard Worker void *raw = NULL;
41*61046927SAndroid Build Coastguard Worker uint64_t raw_hex;
42*61046927SAndroid Build Coastguard Worker const struct fd_dev_info *info = NULL;
43*61046927SAndroid Build Coastguard Worker int opt;
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker while ((opt = getopt(argc, argv, "g:c:x:")) != -1) {
46*61046927SAndroid Build Coastguard Worker switch (opt) {
47*61046927SAndroid Build Coastguard Worker case 'g':
48*61046927SAndroid Build Coastguard Worker info = fd_dev_info_raw_by_name(optarg);
49*61046927SAndroid Build Coastguard Worker if (!info) {
50*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Unknown GPU name: %s\n", optarg);
51*61046927SAndroid Build Coastguard Worker usage(argv[0]);
52*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
53*61046927SAndroid Build Coastguard Worker }
54*61046927SAndroid Build Coastguard Worker break;
55*61046927SAndroid Build Coastguard Worker case 'c': {
56*61046927SAndroid Build Coastguard Worker uint64_t chip_id;
57*61046927SAndroid Build Coastguard Worker if (sscanf(optarg, "%" PRIx64, &chip_id) != 1) {
58*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Invalid chip ID: %s\n", optarg);
59*61046927SAndroid Build Coastguard Worker usage(argv[0]);
60*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker struct fd_dev_id id = {.chip_id = chip_id};
64*61046927SAndroid Build Coastguard Worker info = fd_dev_info_raw(&id);
65*61046927SAndroid Build Coastguard Worker if (!info) {
66*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Unknown chip ID: %s\n", optarg);
67*61046927SAndroid Build Coastguard Worker usage(argv[0]);
68*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker break;
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker case 'x':
73*61046927SAndroid Build Coastguard Worker if (sscanf(optarg, "%" PRIx64, &raw_hex) != 1) {
74*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Invalid hex number: %s\n", optarg);
75*61046927SAndroid Build Coastguard Worker usage(argv[0]);
76*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker raw = &raw_hex;
80*61046927SAndroid Build Coastguard Worker sz = sizeof(raw_hex);
81*61046927SAndroid Build Coastguard Worker break;
82*61046927SAndroid Build Coastguard Worker default:
83*61046927SAndroid Build Coastguard Worker usage(argv[0]);
84*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker if (!raw) {
89*61046927SAndroid Build Coastguard Worker if (optind >= argc) {
90*61046927SAndroid Build Coastguard Worker fprintf(stderr, "No file specified\n");
91*61046927SAndroid Build Coastguard Worker usage(argv[0]);
92*61046927SAndroid Build Coastguard Worker return EXIT_FAILURE;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker
95*61046927SAndroid Build Coastguard Worker raw = os_read_file(argv[optind], &sz);
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker unsigned chip = info ? info->chip : 7;
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker ir3_isa_disasm(raw, sz, stdout,
101*61046927SAndroid Build Coastguard Worker &(struct isa_decode_options){
102*61046927SAndroid Build Coastguard Worker .show_errors = true,
103*61046927SAndroid Build Coastguard Worker .branch_labels = true,
104*61046927SAndroid Build Coastguard Worker .pre_instr_cb = disasm_instr_cb,
105*61046927SAndroid Build Coastguard Worker .gpu_id = chip * 100,
106*61046927SAndroid Build Coastguard Worker });
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker return 0;
109*61046927SAndroid Build Coastguard Worker }
110