xref: /aosp_15_r20/external/mesa3d/src/freedreno/isa/ir3-disasm.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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