xref: /aosp_15_r20/external/igt-gpu-tools/assembler/disasm-main.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2008 Keith Packard
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission to use, copy, modify, distribute, and sell this software and its
5*d83cc019SAndroid Build Coastguard Worker  * documentation for any purpose is hereby granted without fee, provided that
6*d83cc019SAndroid Build Coastguard Worker  * the above copyright notice appear in all copies and that both that copyright
7*d83cc019SAndroid Build Coastguard Worker  * notice and this permission notice appear in supporting documentation, and
8*d83cc019SAndroid Build Coastguard Worker  * that the name of the copyright holders not be used in advertising or
9*d83cc019SAndroid Build Coastguard Worker  * publicity pertaining to distribution of the software without specific,
10*d83cc019SAndroid Build Coastguard Worker  * written prior permission.  The copyright holders make no representations
11*d83cc019SAndroid Build Coastguard Worker  * about the suitability of this software for any purpose.  It is provided "as
12*d83cc019SAndroid Build Coastguard Worker  * is" without express or implied warranty.
13*d83cc019SAndroid Build Coastguard Worker  *
14*d83cc019SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15*d83cc019SAndroid Build Coastguard Worker  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16*d83cc019SAndroid Build Coastguard Worker  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17*d83cc019SAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18*d83cc019SAndroid Build Coastguard Worker  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20*d83cc019SAndroid Build Coastguard Worker  * OF THIS SOFTWARE.
21*d83cc019SAndroid Build Coastguard Worker  */
22*d83cc019SAndroid Build Coastguard Worker 
23*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
24*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
25*d83cc019SAndroid Build Coastguard Worker #include <string.h>
26*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
27*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include "gen4asm.h"
30*d83cc019SAndroid Build Coastguard Worker #include "brw_eu.h"
31*d83cc019SAndroid Build Coastguard Worker #include "gen8_instruction.h"
32*d83cc019SAndroid Build Coastguard Worker 
33*d83cc019SAndroid Build Coastguard Worker static const struct option longopts[] = {
34*d83cc019SAndroid Build Coastguard Worker 	{ NULL, 0, NULL, 0 }
35*d83cc019SAndroid Build Coastguard Worker };
36*d83cc019SAndroid Build Coastguard Worker 
37*d83cc019SAndroid Build Coastguard Worker static struct brw_program *
read_program(FILE * input)38*d83cc019SAndroid Build Coastguard Worker read_program (FILE *input)
39*d83cc019SAndroid Build Coastguard Worker {
40*d83cc019SAndroid Build Coastguard Worker     uint32_t			    inst[4];
41*d83cc019SAndroid Build Coastguard Worker     struct brw_program		    *program;
42*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction  *entry, **prev;
43*d83cc019SAndroid Build Coastguard Worker     int			c;
44*d83cc019SAndroid Build Coastguard Worker     int			n = 0;
45*d83cc019SAndroid Build Coastguard Worker 
46*d83cc019SAndroid Build Coastguard Worker     program = malloc (sizeof (struct brw_program));
47*d83cc019SAndroid Build Coastguard Worker     program->first = NULL;
48*d83cc019SAndroid Build Coastguard Worker     prev = &program->first;
49*d83cc019SAndroid Build Coastguard Worker     while ((c = getc (input)) != EOF) {
50*d83cc019SAndroid Build Coastguard Worker 	if (c == '0') {
51*d83cc019SAndroid Build Coastguard Worker 	    if (fscanf (input, "x%x", &inst[n]) == 1) {
52*d83cc019SAndroid Build Coastguard Worker 		++n;
53*d83cc019SAndroid Build Coastguard Worker 		if (n == 4) {
54*d83cc019SAndroid Build Coastguard Worker 		    entry = malloc (sizeof (struct brw_program_instruction));
55*d83cc019SAndroid Build Coastguard Worker 		    memcpy (&entry->insn, inst, 4 * sizeof (uint32_t));
56*d83cc019SAndroid Build Coastguard Worker 		    entry->next = NULL;
57*d83cc019SAndroid Build Coastguard Worker 		    *prev = entry;
58*d83cc019SAndroid Build Coastguard Worker 		    prev = &entry->next;
59*d83cc019SAndroid Build Coastguard Worker 		    n = 0;
60*d83cc019SAndroid Build Coastguard Worker 		}
61*d83cc019SAndroid Build Coastguard Worker 	    }
62*d83cc019SAndroid Build Coastguard Worker 	}
63*d83cc019SAndroid Build Coastguard Worker     }
64*d83cc019SAndroid Build Coastguard Worker     return program;
65*d83cc019SAndroid Build Coastguard Worker }
66*d83cc019SAndroid Build Coastguard Worker 
67*d83cc019SAndroid Build Coastguard Worker static struct brw_program *
read_program_binary(FILE * input)68*d83cc019SAndroid Build Coastguard Worker read_program_binary (FILE *input)
69*d83cc019SAndroid Build Coastguard Worker {
70*d83cc019SAndroid Build Coastguard Worker     uint32_t			    temp;
71*d83cc019SAndroid Build Coastguard Worker     uint8_t			    inst[16];
72*d83cc019SAndroid Build Coastguard Worker     struct brw_program		    *program;
73*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction  *entry, **prev;
74*d83cc019SAndroid Build Coastguard Worker     int			c;
75*d83cc019SAndroid Build Coastguard Worker     int			n = 0;
76*d83cc019SAndroid Build Coastguard Worker 
77*d83cc019SAndroid Build Coastguard Worker     program = malloc (sizeof (struct brw_program));
78*d83cc019SAndroid Build Coastguard Worker     program->first = NULL;
79*d83cc019SAndroid Build Coastguard Worker     prev = &program->first;
80*d83cc019SAndroid Build Coastguard Worker     while ((c = getc (input)) != EOF) {
81*d83cc019SAndroid Build Coastguard Worker 	if (c == '0') {
82*d83cc019SAndroid Build Coastguard Worker 	    if (fscanf (input, "x%2x", &temp) == 1) {
83*d83cc019SAndroid Build Coastguard Worker 		inst[n++] = (uint8_t)temp;
84*d83cc019SAndroid Build Coastguard Worker 		if (n == 16) {
85*d83cc019SAndroid Build Coastguard Worker 		    entry = malloc (sizeof (struct brw_program_instruction));
86*d83cc019SAndroid Build Coastguard Worker 		    memcpy (&entry->insn, inst, 16 * sizeof (uint8_t));
87*d83cc019SAndroid Build Coastguard Worker 		    entry->next = NULL;
88*d83cc019SAndroid Build Coastguard Worker 		    *prev = entry;
89*d83cc019SAndroid Build Coastguard Worker 		    prev = &entry->next;
90*d83cc019SAndroid Build Coastguard Worker 		    n = 0;
91*d83cc019SAndroid Build Coastguard Worker 		}
92*d83cc019SAndroid Build Coastguard Worker 	    }
93*d83cc019SAndroid Build Coastguard Worker 	}
94*d83cc019SAndroid Build Coastguard Worker     }
95*d83cc019SAndroid Build Coastguard Worker     return program;
96*d83cc019SAndroid Build Coastguard Worker }
97*d83cc019SAndroid Build Coastguard Worker 
usage(void)98*d83cc019SAndroid Build Coastguard Worker static void usage(void)
99*d83cc019SAndroid Build Coastguard Worker {
100*d83cc019SAndroid Build Coastguard Worker     fprintf(stderr, "usage: intel-gen4disasm [options] inputfile\n");
101*d83cc019SAndroid Build Coastguard Worker     fprintf(stderr, "\t-b, --binary                         C style binary output\n");
102*d83cc019SAndroid Build Coastguard Worker     fprintf(stderr, "\t-o, --output {outputfile}            Specify output file\n");
103*d83cc019SAndroid Build Coastguard Worker     fprintf(stderr, "\t-g, --gen <4|5|6|7|8|9>              Specify GPU generation\n");
104*d83cc019SAndroid Build Coastguard Worker }
105*d83cc019SAndroid Build Coastguard Worker 
main(int argc,char ** argv)106*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
107*d83cc019SAndroid Build Coastguard Worker {
108*d83cc019SAndroid Build Coastguard Worker     struct brw_program	*program;
109*d83cc019SAndroid Build Coastguard Worker     FILE		*input = stdin;
110*d83cc019SAndroid Build Coastguard Worker     FILE		*output = stdout;
111*d83cc019SAndroid Build Coastguard Worker     char		*input_filename = NULL;
112*d83cc019SAndroid Build Coastguard Worker     char		*output_file = NULL;
113*d83cc019SAndroid Build Coastguard Worker     int			byte_array_input = 0;
114*d83cc019SAndroid Build Coastguard Worker     int			o;
115*d83cc019SAndroid Build Coastguard Worker     int			gen = 4;
116*d83cc019SAndroid Build Coastguard Worker     struct brw_program_instruction  *inst;
117*d83cc019SAndroid Build Coastguard Worker 
118*d83cc019SAndroid Build Coastguard Worker     while ((o = getopt_long(argc, argv, "o:bg:", longopts, NULL)) != -1) {
119*d83cc019SAndroid Build Coastguard Worker 	switch (o) {
120*d83cc019SAndroid Build Coastguard Worker 	case 'o':
121*d83cc019SAndroid Build Coastguard Worker 	    if (strcmp(optarg, "-") != 0)
122*d83cc019SAndroid Build Coastguard Worker 		output_file = optarg;
123*d83cc019SAndroid Build Coastguard Worker 	    break;
124*d83cc019SAndroid Build Coastguard Worker 	case 'b':
125*d83cc019SAndroid Build Coastguard Worker 	    byte_array_input = 1;
126*d83cc019SAndroid Build Coastguard Worker 	    break;
127*d83cc019SAndroid Build Coastguard Worker 	case 'g':
128*d83cc019SAndroid Build Coastguard Worker 	    gen = strtol(optarg, NULL, 10);
129*d83cc019SAndroid Build Coastguard Worker 
130*d83cc019SAndroid Build Coastguard Worker 	    if (gen < 4 || gen > 9) {
131*d83cc019SAndroid Build Coastguard Worker 		    usage();
132*d83cc019SAndroid Build Coastguard Worker 		    exit(1);
133*d83cc019SAndroid Build Coastguard Worker 	    }
134*d83cc019SAndroid Build Coastguard Worker 
135*d83cc019SAndroid Build Coastguard Worker 	    break;
136*d83cc019SAndroid Build Coastguard Worker 	default:
137*d83cc019SAndroid Build Coastguard Worker 	    usage();
138*d83cc019SAndroid Build Coastguard Worker 	    exit(1);
139*d83cc019SAndroid Build Coastguard Worker 	}
140*d83cc019SAndroid Build Coastguard Worker     }
141*d83cc019SAndroid Build Coastguard Worker     argc -= optind;
142*d83cc019SAndroid Build Coastguard Worker     argv += optind;
143*d83cc019SAndroid Build Coastguard Worker     if (argc != 1) {
144*d83cc019SAndroid Build Coastguard Worker 	usage();
145*d83cc019SAndroid Build Coastguard Worker 	exit(1);
146*d83cc019SAndroid Build Coastguard Worker     }
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker     if (strcmp(argv[0], "-") != 0) {
149*d83cc019SAndroid Build Coastguard Worker 	input_filename = argv[0];
150*d83cc019SAndroid Build Coastguard Worker 	input = fopen(input_filename, "r");
151*d83cc019SAndroid Build Coastguard Worker 	if (input == NULL) {
152*d83cc019SAndroid Build Coastguard Worker 	    perror("Couldn't open input file");
153*d83cc019SAndroid Build Coastguard Worker 	    exit(1);
154*d83cc019SAndroid Build Coastguard Worker 	}
155*d83cc019SAndroid Build Coastguard Worker     }
156*d83cc019SAndroid Build Coastguard Worker     if (byte_array_input)
157*d83cc019SAndroid Build Coastguard Worker 	program = read_program_binary (input);
158*d83cc019SAndroid Build Coastguard Worker     else
159*d83cc019SAndroid Build Coastguard Worker 	program = read_program (input);
160*d83cc019SAndroid Build Coastguard Worker     if (!program)
161*d83cc019SAndroid Build Coastguard Worker 	exit (1);
162*d83cc019SAndroid Build Coastguard Worker     if (output_file) {
163*d83cc019SAndroid Build Coastguard Worker 	output = fopen (output_file, "w");
164*d83cc019SAndroid Build Coastguard Worker 	if (output == NULL) {
165*d83cc019SAndroid Build Coastguard Worker 	    perror("Couldn't open output file");
166*d83cc019SAndroid Build Coastguard Worker 	    exit(1);
167*d83cc019SAndroid Build Coastguard Worker 	}
168*d83cc019SAndroid Build Coastguard Worker     }
169*d83cc019SAndroid Build Coastguard Worker 
170*d83cc019SAndroid Build Coastguard Worker     for (inst = program->first; inst; inst = inst->next)
171*d83cc019SAndroid Build Coastguard Worker 	if (gen >= 8)
172*d83cc019SAndroid Build Coastguard Worker 	    gen8_disassemble(output, &inst->insn.gen8, gen);
173*d83cc019SAndroid Build Coastguard Worker 	else
174*d83cc019SAndroid Build Coastguard Worker 	    brw_disasm (output, &inst->insn.gen, gen);
175*d83cc019SAndroid Build Coastguard Worker 
176*d83cc019SAndroid Build Coastguard Worker     exit (0);
177*d83cc019SAndroid Build Coastguard Worker }
178