summaryrefslogtreecommitdiffstats
path: root/src/intel/tools
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2016-10-05 23:52:51 +0100
committerLionel Landwerlin <[email protected]>2016-10-08 02:17:35 +0100
commit619c8de522251e0ab9477b475c22c084180877d4 (patch)
tree2a5735306e7659eec38b9a08a50c24c579a7ebde /src/intel/tools
parent63a366a8813fec3836213cfd5ab006add332ec84 (diff)
intel: aubinator: enable loading xml files from a given directory
This might be useful for people who debug with out of tree descriptions. Signed-off-by: Lionel Landwerlin <[email protected]> Reviewed-by: Sirisha Gandikota <[email protected]>
Diffstat (limited to 'src/intel/tools')
-rw-r--r--src/intel/tools/aubinator.c18
-rw-r--r--src/intel/tools/decoder.c64
-rw-r--r--src/intel/tools/decoder.h2
3 files changed, 81 insertions, 3 deletions
diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c
index 8be7580c2b1..7f6655acbbe 100644
--- a/src/intel/tools/aubinator.c
+++ b/src/intel/tools/aubinator.c
@@ -1037,7 +1037,8 @@ print_help(const char *progname, FILE *file)
" --color[=WHEN] colorize the output; WHEN can be 'auto' (default\n"
" if omitted), 'always', or 'never'\n"
" --no-pager don't launch pager\n"
- " --no-offsets don't print instruction offsets\n",
+ " --no-offsets don't print instruction offsets\n"
+ " --xml=DIR load hardware xml description from directory DIR\n",
progname);
}
@@ -1047,7 +1048,7 @@ int main(int argc, char *argv[])
struct aub_file *file;
int c, i;
bool help = false, pager = true;
- const char *input_file = NULL;
+ char *input_file = NULL, *xml_path = NULL;
char gen_val[24];
const struct {
const char *name;
@@ -1069,6 +1070,7 @@ int main(int argc, char *argv[])
{ "gen", required_argument, NULL, 'g' },
{ "headers", no_argument, (int *) &option_full_decode, false },
{ "color", required_argument, NULL, 'c' },
+ { "xml", required_argument, NULL, 'x' },
{ NULL, 0, NULL, 0 }
};
struct gen_device_info devinfo;
@@ -1091,6 +1093,9 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
break;
+ case 'x':
+ xml_path = strdup(optarg);
+ break;
default:
break;
}
@@ -1131,9 +1136,15 @@ int main(int argc, char *argv[])
if (isatty(1) && pager)
setup_pager();
- spec = gen_spec_load(&devinfo);
+ if (xml_path == NULL)
+ spec = gen_spec_load(&devinfo);
+ else
+ spec = gen_spec_load_from_path(&devinfo, xml_path);
disasm = gen_disasm_create(gen->pci_id);
+ if (spec == NULL || disasm == NULL)
+ exit(EXIT_FAILURE);
+
if (input_file == NULL) {
print_help(input_file, stderr);
exit(EXIT_FAILURE);
@@ -1147,6 +1158,7 @@ int main(int argc, char *argv[])
fflush(stdout);
/* close the stdout which is opened to write the output */
close(1);
+ free(xml_path);
wait(NULL);
diff --git a/src/intel/tools/decoder.c b/src/intel/tools/decoder.c
index 778cd5bd9b5..267b821404c 100644
--- a/src/intel/tools/decoder.c
+++ b/src/intel/tools/decoder.c
@@ -482,6 +482,70 @@ gen_spec_load(const struct gen_device_info *devinfo)
return ctx.spec;
}
+struct gen_spec *
+gen_spec_load_from_path(const struct gen_device_info *devinfo,
+ const char *path)
+{
+ struct parser_context ctx;
+ size_t len, filename_len = strlen(path) + 20;
+ char *filename = malloc(filename_len);
+ void *buf;
+ FILE *input;
+
+ len = snprintf(filename, filename_len, "%s/gen%i.xml",
+ path, devinfo_to_gen(devinfo));
+ assert(len < filename_len);
+
+ input = fopen(filename, "r");
+ if (input == NULL) {
+ fprintf(stderr, "failed to open xml description\n");
+ free(filename);
+ return NULL;
+ }
+
+ memset(&ctx, 0, sizeof ctx);
+ ctx.parser = XML_ParserCreate(NULL);
+ XML_SetUserData(ctx.parser, &ctx);
+ if (ctx.parser == NULL) {
+ fprintf(stderr, "failed to create parser\n");
+ free(filename);
+ return NULL;
+ }
+
+ XML_SetElementHandler(ctx.parser, start_element, end_element);
+ XML_SetCharacterDataHandler(ctx.parser, character_data);
+ ctx.loc.filename = filename;
+ ctx.spec = xzalloc(sizeof(*ctx.spec));
+
+ do {
+ buf = XML_GetBuffer(ctx.parser, XML_BUFFER_SIZE);
+ len = fread(buf, 1, XML_BUFFER_SIZE, input);
+ if (len < 0) {
+ fprintf(stderr, "fread: %m\n");
+ fclose(input);
+ free(filename);
+ return NULL;
+ }
+ if (XML_ParseBuffer(ctx.parser, len, len == 0) == 0) {
+ fprintf(stderr,
+ "Error parsing XML at line %ld col %ld: %s\n",
+ XML_GetCurrentLineNumber(ctx.parser),
+ XML_GetCurrentColumnNumber(ctx.parser),
+ XML_ErrorString(XML_GetErrorCode(ctx.parser)));
+ fclose(input);
+ free(filename);
+ return NULL;
+ }
+ } while (len > 0);
+
+ XML_ParserFree(ctx.parser);
+
+ fclose(input);
+ free(filename);
+
+ return ctx.spec;
+}
+
struct gen_group *
gen_spec_find_instruction(struct gen_spec *spec, const uint32_t *p)
{
diff --git a/src/intel/tools/decoder.h b/src/intel/tools/decoder.h
index 5bea9b957f6..739f194e3bd 100644
--- a/src/intel/tools/decoder.h
+++ b/src/intel/tools/decoder.h
@@ -39,6 +39,8 @@ static inline uint32_t gen_make_gen(uint32_t major, uint32_t minor)
struct gen_group *gen_spec_find_struct(struct gen_spec *spec, const char *name);
struct gen_spec *gen_spec_load(const struct gen_device_info *devinfo);
+struct gen_spec *gen_spec_load_from_path(const struct gen_device_info *devinfo,
+ const char *path);
uint32_t gen_spec_get_gen(struct gen_spec *spec);
struct gen_group *gen_spec_find_instruction(struct gen_spec *spec, const uint32_t *p);
struct gen_group *gen_spec_find_register(struct gen_spec *spec, uint32_t offset);