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