From 619c8de522251e0ab9477b475c22c084180877d4 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Wed, 5 Oct 2016 23:52:51 +0100 Subject: [PATCH] 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 Reviewed-by: Sirisha Gandikota --- src/intel/tools/aubinator.c | 18 +++++++++-- src/intel/tools/decoder.c | 64 +++++++++++++++++++++++++++++++++++++ src/intel/tools/decoder.h | 2 ++ 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); -- 2.30.2