/*
 * Copyright © 2016 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <expat.h>
#include <inttypes.h>
#include <zlib.h>

#include <util/list.h>
#include <util/macros.h>
#include <util/os_file.h>
#include <util/ralloc.h>
#include <util/u_math.h>

#include "intel_decoder.h"

#include "isl/isl.h"
#include "genxml/genX_xml.h"

#define XML_BUFFER_SIZE 4096
#define MAX_VALUE_ITEMS 128

struct location {
   const char *filename;
   int line_number;
};

struct genxml_import_exclusion {
   struct list_head link;
   char *name;
};

struct genxml_import {
   struct list_head link;
   struct list_head exclusions;
   char *name;
};

struct parser_context {
   XML_Parser parser;
   int foo;
   struct location loc;

   struct intel_group *group;
   struct intel_enum *enoom;
   const char *dirname;
   struct genxml_import import;

   int n_values, n_allocated_values;
   struct intel_value **values;

   struct intel_field *last_field;

   struct intel_spec *spec;
};

const char *
intel_group_get_name(const struct intel_group *group)
{
   return group->name;
}

uint32_t
intel_group_get_opcode(const struct intel_group *group)
{
   return group->opcode;
}

struct intel_group *
intel_spec_find_struct(struct intel_spec *spec, const char *name)
{
   struct hash_entry *entry = _mesa_hash_table_search(spec->structs,
                                                      name);
   return entry ? entry->data : NULL;
}

struct intel_group *
intel_spec_find_register(struct intel_spec *spec, uint32_t offset)
{
   struct hash_entry *entry =
      _mesa_hash_table_search(spec->registers_by_offset,
                              (void *) (uintptr_t) offset);
   return entry ? entry->data : NULL;
}

struct intel_group *
intel_spec_find_register_by_name(struct intel_spec *spec, const char *name)
{
   struct hash_entry *entry =
      _mesa_hash_table_search(spec->registers_by_name, name);
   return entry ? entry->data : NULL;
}

struct intel_enum *
intel_spec_find_enum(struct intel_spec *spec, const char *name)
{
   struct hash_entry *entry = _mesa_hash_table_search(spec->enums,
                                                      name);
   return entry ? entry->data : NULL;
}

uint32_t
intel_spec_get_gen(struct intel_spec *spec)
{
   return spec->gen;
}

static void __attribute__((noreturn))
fail(struct location *loc, const char *msg, ...)
{
   va_list ap;

   va_start(ap, msg);
   fprintf(stderr, "%s:%d: error: ",
           loc->filename, loc->line_number);
   vfprintf(stderr, msg, ap);
   fprintf(stderr, "\n");
   va_end(ap);
   exit(EXIT_FAILURE);
}

static void
get_array_offset_count(const char **atts, uint32_t *offset, uint32_t *count,
                       uint32_t *size, bool *variable)
{
   for (int i = 0; atts[i]; i += 2) {
      char *p;

      if (strcmp(atts[i], "count") == 0) {
         *count = strtoul(atts[i + 1], &p, 0);
         if (*count == 0)
            *variable = true;
      } else if (strcmp(atts[i], "start") == 0) {
         *offset = strtoul(atts[i + 1], &p, 0);
      } else if (strcmp(atts[i], "size") == 0) {
         *size = strtoul(atts[i + 1], &p, 0);
      }
   }
   return;
}

static struct intel_group *
create_group(struct parser_context *ctx,
             const char *name,
             const char **atts,
             struct intel_group *parent,
             bool fixed_length)
{
   struct intel_group *group;

   group = rzalloc(ctx->spec, struct intel_group);
   if (name)
      group->name = ralloc_strdup(group, name);

   group->spec = ctx->spec;
   group->variable = false;
   group->fixed_length = fixed_length;
   group->dword_length_field = NULL;
   group->dw_length = 0;
   group->engine_mask = INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_RENDER) |
                        INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_COMPUTE) |
                        INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_VIDEO) |
                        INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_COPY);
   group->bias = 1;

   for (int i = 0; atts[i]; i += 2) {
      char *p;
      if (strcmp(atts[i], "length") == 0) {
         group->dw_length = strtoul(atts[i + 1], &p, 0);
      } else if (strcmp(atts[i], "bias") == 0) {
         group->bias = strtoul(atts[i + 1], &p, 0);
      } else if (strcmp(atts[i], "engine") == 0) {
         void *mem_ctx = ralloc_context(NULL);
         char *tmp = ralloc_strdup(mem_ctx, atts[i + 1]);
         char *save_ptr;
         char *tok = strtok_r(tmp, "|", &save_ptr);

         group->engine_mask = 0;
         while (tok != NULL) {
            if (strcmp(tok, "render") == 0) {
               group->engine_mask |= INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_RENDER);
            } else if (strcmp(tok, "compute") == 0) {
               group->engine_mask |= INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_COMPUTE);
            } else if (strcmp(tok, "video") == 0) {
               group->engine_mask |= INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_VIDEO);
            } else if (strcmp(tok, "blitter") == 0) {
               group->engine_mask |= INTEL_ENGINE_CLASS_TO_MASK(INTEL_ENGINE_CLASS_COPY);
            } else {
               fprintf(stderr, "unknown engine class defined for instruction \"%s\": %s\n", name, atts[i + 1]);
            }

            tok = strtok_r(NULL, "|", &save_ptr);
         }

         ralloc_free(mem_ctx);
      }
   }

   if (parent) {
      group->parent = parent;
      get_array_offset_count(atts,
                             &group->array_offset,
                             &group->array_count,
                             &group->array_item_size,
                             &group->variable);
   }

   return group;
}

static struct intel_enum *
create_enum(struct parser_context *ctx, const char *name, const char **atts)
{
   struct intel_enum *e;

   e = rzalloc(ctx->spec, struct intel_enum);
   if (name)
      e->name = ralloc_strdup(e, name);

   return e;
}

static void
get_register_offset(const char **atts, uint32_t *offset)
{
   for (int i = 0; atts[i]; i += 2) {
      char *p;

      if (strcmp(atts[i], "num") == 0)
         *offset = strtoul(atts[i + 1], &p, 0);
   }
   return;
}

static void
get_start_end_pos(int *start, int *end)
{
   /* start value has to be mod with 32 as we need the relative
    * start position in the first DWord. For the end position, add
    * the length of the field to the start position to get the
    * relative position in the 64 bit address.
    */
   if (*end - *start > 32) {
      int len = *end - *start;
      *start = *start % 32;
      *end = *start + len;
   } else {
      *start = *start % 32;
      *end = *end % 32;
   }

   return;
}

static inline uint64_t
mask(int start, int end)
{
   uint64_t v;

   v = ~0ULL >> (63 - end + start);

   return v << start;
}

static inline uint64_t
field_value(uint64_t value, int start, int end)
{
   get_start_end_pos(&start, &end);
   return (value & mask(start, end)) >> (start);
}

static struct intel_type
string_to_type(struct parser_context *ctx, const char *s)
{
   int i, f;
   struct intel_group *g;
   struct intel_enum *e;

   if (strcmp(s, "int") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_INT };
   else if (strcmp(s, "uint") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_UINT };
   else if (strcmp(s, "bool") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_BOOL };
   else if (strcmp(s, "float") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_FLOAT };
   else if (strcmp(s, "address") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_ADDRESS };
   else if (strcmp(s, "offset") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_OFFSET };
   else if (sscanf(s, "u%d.%d", &i, &f) == 2)
      return (struct intel_type) { .kind = INTEL_TYPE_UFIXED, .i = i, .f = f };
   else if (sscanf(s, "s%d.%d", &i, &f) == 2)
      return (struct intel_type) { .kind = INTEL_TYPE_SFIXED, .i = i, .f = f };
   else if (g = intel_spec_find_struct(ctx->spec, s), g != NULL)
      return (struct intel_type) { .kind = INTEL_TYPE_STRUCT, .intel_struct = g };
   else if (e = intel_spec_find_enum(ctx->spec, s), e != NULL)
      return (struct intel_type) { .kind = INTEL_TYPE_ENUM, .intel_enum = e };
   else if (strcmp(s, "mbo") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_MBO };
   else if (strcmp(s, "mbz") == 0)
      return (struct intel_type) { .kind = INTEL_TYPE_MBZ };
   else
      fail(&ctx->loc, "invalid type: %s", s);
}

static struct intel_field *
create_field(struct parser_context *ctx, const char **atts)
{
   struct intel_field *field;

   field = rzalloc(ctx->group, struct intel_field);
   field->parent = ctx->group;

   for (int i = 0; atts[i]; i += 2) {
      char *p;

      if (strcmp(atts[i], "name") == 0) {
         field->name = ralloc_strdup(field, atts[i + 1]);
         if (strcmp(field->name, "DWord Length") == 0) {
            field->parent->dword_length_field = field;
         }
      } else if (strcmp(atts[i], "start") == 0) {
         field->start = strtoul(atts[i + 1], &p, 0);
      } else if (strcmp(atts[i], "end") == 0) {
         field->end = strtoul(atts[i + 1], &p, 0);
      } else if (strcmp(atts[i], "type") == 0) {
         field->type = string_to_type(ctx, atts[i + 1]);
      } else if (strcmp(atts[i], "default") == 0 &&
               field->start >= 16 && field->end <= 31) {
         field->has_default = true;
         field->default_value = strtoul(atts[i + 1], &p, 0);
      }
   }

   return field;
}

static struct intel_field *
create_array_field(struct parser_context *ctx, struct intel_group *array)
{
   struct intel_field *field;

   field = rzalloc(ctx->group, struct intel_field);
   field->parent = ctx->group;

   field->array = array;
   field->start = field->array->array_offset;

   return field;
}

static struct intel_value *
create_value(struct parser_context *ctx, const char **atts)
{
   struct intel_value *value = rzalloc(ctx->values, struct intel_value);

   for (int i = 0; atts[i]; i += 2) {
      if (strcmp(atts[i], "name") == 0)
         value->name = ralloc_strdup(value, atts[i + 1]);
      else if (strcmp(atts[i], "value") == 0)
         value->value = strtoul(atts[i + 1], NULL, 0);
   }

   return value;
}

static struct intel_field *
create_and_append_field(struct parser_context *ctx,
                        const char **atts,
                        struct intel_group *array)
{
   struct intel_field *field = array ?
      create_array_field(ctx, array) : create_field(ctx, atts);
   struct intel_field *prev = NULL, *list = ctx->group->fields;

   while (list && field->start > list->start) {
      prev = list;
      list = list->next;
   }

   field->next = list;
   if (prev == NULL)
      ctx->group->fields = field;
   else
      prev->next = field;

   return field;
}

static bool
start_genxml_import(struct parser_context *ctx, const char **atts)
{
   assert(ctx->import.name == NULL);
   assert(list_is_empty(&ctx->import.exclusions));
   list_inithead(&ctx->import.exclusions);

   for (int i = 0; atts[i]; i += 2) {
      if (strcmp(atts[i], "name") == 0) {
         ctx->import.name = ralloc_strdup(ctx->spec, atts[i + 1]);
      }
   }

   if (ctx->import.name == NULL)
      fail(&ctx->loc, "import without name");

   return ctx->import.name != NULL;
}

static struct genxml_import_exclusion *
add_genxml_import_exclusion(struct parser_context *ctx, const char **atts)
{
   struct genxml_import_exclusion *exclusion;

   if (ctx->import.name == NULL) {
      fail(&ctx->loc, "exclude found without a named import");
      return NULL;
   }

   exclusion = rzalloc(ctx->import.name, struct genxml_import_exclusion);

   for (int i = 0; atts[i]; i += 2) {
      if (strcmp(atts[i], "name") == 0) {
         exclusion->name = ralloc_strdup(exclusion, atts[i + 1]);
      }
   }

   if (exclusion->name != NULL) {
      list_addtail(&exclusion->link, &ctx->import.exclusions);
   } else {
      ralloc_free(exclusion);
      exclusion = NULL;
   }

   return exclusion;
}

static void
move_group_to_spec(struct intel_spec *new_spec, struct intel_spec *old_spec,
                   struct intel_group *group);

static void
move_field_to_spec(struct intel_spec *new_spec, struct intel_spec *old_spec,
                   struct intel_field *field)
{
   while (field != NULL) {
      if (field->array != NULL && field->array->spec == old_spec)
         move_group_to_spec(new_spec, old_spec, field->array);
      if (field->type.kind == INTEL_TYPE_STRUCT &&
          field->type.intel_struct->spec == old_spec)
         move_group_to_spec(new_spec, old_spec, field->type.intel_struct);
      if (field->type.kind == INTEL_TYPE_ENUM)
         ralloc_steal(new_spec, field->type.intel_enum);
      field = field->next;
   }
}

static void
move_group_to_spec(struct intel_spec *new_spec, struct intel_spec *old_spec,
                   struct intel_group *group)
{
   struct intel_group *g = group;
   while (g != NULL) {
      if (g->spec == old_spec) {
         if (ralloc_parent(g) == old_spec)
            ralloc_steal(new_spec, g);
         g->spec = new_spec;
      }
      g = g->next;
   }
   move_field_to_spec(new_spec, old_spec, group->fields);
   move_field_to_spec(new_spec, old_spec, group->dword_length_field);
}

static bool
finish_genxml_import(struct parser_context *ctx)
{
   struct intel_spec *spec = ctx->spec;
   struct genxml_import *import = &ctx->import;

   if (import->name == NULL) {
      fail(&ctx->loc, "import without name");
      return false;
   }

   struct intel_spec *imported_spec =
      intel_spec_load_filename(ctx->dirname, import->name);
   if (import->name == NULL) {
      fail(&ctx->loc, "failed to load %s for importing", import->name);
      return false;
   }

   assert(_mesa_hash_table_num_entries(imported_spec->access_cache) == 0);

   list_for_each_entry(struct genxml_import_exclusion, exclusion,
                       &import->exclusions, link) {
      struct hash_entry *entry;
      entry = _mesa_hash_table_search(imported_spec->commands,
                                      exclusion->name);
      if (entry != NULL) {
         _mesa_hash_table_remove(imported_spec->commands, entry);
      }
      entry = _mesa_hash_table_search(imported_spec->structs,
                                      exclusion->name);
      if (entry != NULL) {
         _mesa_hash_table_remove(imported_spec->structs, entry);
      }
      entry = _mesa_hash_table_search(imported_spec->registers_by_name,
                                      exclusion->name);
      if (entry != NULL) {
         struct intel_group *group = entry->data;
         _mesa_hash_table_remove(imported_spec->registers_by_name, entry);
         entry = _mesa_hash_table_search(imported_spec->registers_by_offset,
                                         (void *) (uintptr_t) group->register_offset);
         if (entry != NULL)
            _mesa_hash_table_remove(imported_spec->registers_by_offset, entry);
      }
      entry = _mesa_hash_table_search(imported_spec->enums,
                                      exclusion->name);
      if (entry != NULL) {
         _mesa_hash_table_remove(imported_spec->enums, entry);
      }
   }

   hash_table_foreach(imported_spec->commands, entry) {
      struct intel_group *group = entry->data;
      move_group_to_spec(spec, imported_spec, group);
      _mesa_hash_table_insert(spec->commands, group->name, group);
   }
   hash_table_foreach(imported_spec->structs, entry) {
      struct intel_group *group = entry->data;
      move_group_to_spec(spec, imported_spec, group);
      _mesa_hash_table_insert(spec->structs, group->name, group);
   }
   hash_table_foreach(imported_spec->registers_by_name, entry) {
      struct intel_group *group = entry->data;
      move_group_to_spec(spec, imported_spec, group);
      _mesa_hash_table_insert(spec->registers_by_name, group->name, group);
      _mesa_hash_table_insert(spec->registers_by_offset,
                              (void *) (uintptr_t) group->register_offset,
                              group);
   }
   hash_table_foreach(imported_spec->enums, entry) {
      struct intel_enum *enoom = entry->data;
      ralloc_steal(spec, enoom);
      _mesa_hash_table_insert(spec->enums, enoom->name, enoom);
   }

   intel_spec_destroy(imported_spec);
   ralloc_free(ctx->import.name); /* also frees exclusions */
   ctx->import.name = NULL;
   list_inithead(&ctx->import.exclusions);

   return true;
}

static void
start_element(void *data, const char *element_name, const char **atts)
{
   struct parser_context *ctx = data;
   const char *name = NULL;
   const char *gen = NULL;

   ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser);

   for (int i = 0; atts[i]; i += 2) {
      if (strcmp(atts[i], "name") == 0)
         name = atts[i + 1];
      else if (strcmp(atts[i], "gen") == 0)
         gen = atts[i + 1];
   }

   if (strcmp(element_name, "genxml") == 0) {
      if (name == NULL)
         fail(&ctx->loc, "no platform name given");
      if (gen == NULL)
         fail(&ctx->loc, "no gen given");

      int major, minor;
      int n = sscanf(gen, "%d.%d", &major, &minor);
      if (n == 0)
         fail(&ctx->loc, "invalid gen given: %s", gen);
      if (n == 1)
         minor = 0;

      ctx->spec->gen = intel_make_gen(major, minor);
   } else if (strcmp(element_name, "instruction") == 0) {
      ctx->group = create_group(ctx, name, atts, NULL, false);
   } else if (strcmp(element_name, "struct") == 0) {
      ctx->group = create_group(ctx, name, atts, NULL, true);
   } else if (strcmp(element_name, "register") == 0) {
      ctx->group = create_group(ctx, name, atts, NULL, true);
      get_register_offset(atts, &ctx->group->register_offset);
   } else if (strcmp(element_name, "group") == 0) {
      struct intel_group *group = create_group(ctx, "", atts, ctx->group, false);
      ctx->last_field = create_and_append_field(ctx, NULL, group);
      ctx->group = group;
   } else if (strcmp(element_name, "field") == 0) {
      ctx->last_field = create_and_append_field(ctx, atts, NULL);
   } else if (strcmp(element_name, "enum") == 0) {
      ctx->enoom = create_enum(ctx, name, atts);
   } else if (strcmp(element_name, "value") == 0) {
      if (ctx->n_values >= ctx->n_allocated_values) {
         ctx->n_allocated_values = MAX2(2, ctx->n_allocated_values * 2);
         ctx->values = reralloc_array_size(ctx->spec, ctx->values,
                                           sizeof(struct intel_value *),
                                           ctx->n_allocated_values);
      }
      assert(ctx->n_values < ctx->n_allocated_values);
      ctx->values[ctx->n_values++] = create_value(ctx, atts);
   } else if (strcmp(element_name, "import") == 0) {
      start_genxml_import(ctx, atts);
   } else if (strcmp(element_name, "exclude") == 0) {
      add_genxml_import_exclusion(ctx, atts);
   }

}

static void
end_element(void *data, const char *name)
{
   struct parser_context *ctx = data;
   struct intel_spec *spec = ctx->spec;

   if (strcmp(name, "instruction") == 0 ||
       strcmp(name, "struct") == 0 ||
       strcmp(name, "register") == 0) {
      struct intel_group *group = ctx->group;
      struct intel_field *list = group->fields;

      ctx->group = ctx->group->parent;

      if (strcmp(name, "instruction") == 0) {
         while (list && list->end <= 31) {
            if (list->start >= 16 && list->has_default) {
               group->opcode_mask |=
                  mask(list->start % 32, list->end % 32);
               group->opcode |= list->default_value << list->start;
            }
            list = list->next;
         }
      }

      if (strcmp(name, "instruction") == 0)
         _mesa_hash_table_insert(spec->commands, group->name, group);
      else if (strcmp(name, "struct") == 0)
         _mesa_hash_table_insert(spec->structs, group->name, group);
      else if (strcmp(name, "register") == 0) {
         _mesa_hash_table_insert(spec->registers_by_name, group->name, group);
         _mesa_hash_table_insert(spec->registers_by_offset,
                                 (void *) (uintptr_t) group->register_offset,
                                 group);
      }
   } else if (strcmp(name, "group") == 0) {
      ctx->group = ctx->group->parent;
   } else if (strcmp(name, "field") == 0) {
      struct intel_field *field = ctx->last_field;
      ctx->last_field = NULL;
      field->inline_enum.values = ctx->values;
      ralloc_steal(field, ctx->values);
      field->inline_enum.nvalues = ctx->n_values;
      ctx->values = ralloc_array(ctx->spec, struct intel_value*, ctx->n_allocated_values = 2);
      ctx->n_values = 0;
   } else if (strcmp(name, "enum") == 0) {
      struct intel_enum *e = ctx->enoom;
      e->values = ctx->values;
      ralloc_steal(e, ctx->values);
      e->nvalues = ctx->n_values;
      ctx->values = ralloc_array(ctx->spec, struct intel_value*, ctx->n_allocated_values = 2);
      ctx->n_values = 0;
      ctx->enoom = NULL;
      _mesa_hash_table_insert(spec->enums, e->name, e);
   } else if (strcmp(name, "import") == 0) {
      finish_genxml_import(ctx);
   }
}

static void
character_data(void *data, const XML_Char *s, int len)
{
}

static uint32_t zlib_inflate(const void *compressed_data,
                             uint32_t compressed_len,
                             void **out_ptr)
{
   struct z_stream_s zstream;
   void *out;

   memset(&zstream, 0, sizeof(zstream));

   zstream.next_in = (unsigned char *)compressed_data;
   zstream.avail_in = compressed_len;

   if (inflateInit(&zstream) != Z_OK)
      return 0;

   out = malloc(4096);
   zstream.next_out = out;
   zstream.avail_out = 4096;

   do {
      switch (inflate(&zstream, Z_SYNC_FLUSH)) {
      case Z_STREAM_END:
         goto end;
      case Z_OK:
         break;
      default:
         inflateEnd(&zstream);
         return 0;
      }

      if (zstream.avail_out)
         break;

      out = realloc(out, 2*zstream.total_out);
      if (out == NULL) {
         inflateEnd(&zstream);
         return 0;
      }

      zstream.next_out = (unsigned char *)out + zstream.total_out;
      zstream.avail_out = zstream.total_out;
   } while (1);
 end:
   inflateEnd(&zstream);
   *out_ptr = out;
   return zstream.total_out;
}

static uint32_t _hash_uint32(const void *key)
{
   return (uint32_t) (uintptr_t) key;
}

static struct intel_spec *
intel_spec_init(void)
{
   struct intel_spec *spec;
   spec = rzalloc(NULL, struct intel_spec);
   if (spec == NULL)
      return NULL;

   spec->commands =
      _mesa_hash_table_create(spec, _mesa_hash_string, _mesa_key_string_equal);
   spec->structs =
      _mesa_hash_table_create(spec, _mesa_hash_string, _mesa_key_string_equal);
   spec->registers_by_name =
      _mesa_hash_table_create(spec, _mesa_hash_string, _mesa_key_string_equal);
   spec->registers_by_offset =
      _mesa_hash_table_create(spec, _hash_uint32, _mesa_key_pointer_equal);
   spec->enums =
      _mesa_hash_table_create(spec, _mesa_hash_string, _mesa_key_string_equal);
   spec->access_cache =
      _mesa_hash_table_create(spec, _mesa_hash_string, _mesa_key_string_equal);

   return spec;
}

static bool
get_xml_data_dir(const char *dirname, const char *filename,
                 void **data, size_t *data_len)
{
   size_t fullname_len = strlen(dirname) + strlen(filename) + 2;
   char *fullname = malloc(fullname_len);

   if (fullname == NULL)
      return NULL;

   ASSERTED size_t len = snprintf(fullname, fullname_len, "%s/%s",
                                  dirname, filename);
   assert(len < fullname_len);

   *data = (void*)os_read_file(fullname, data_len);
   free(fullname);
   return *data != NULL;
}

static bool
get_embedded_xml_data(int verx10, void **data, size_t *data_len)
{
   uint8_t *text_data = NULL;
   uint32_t text_offset = 0, text_length = 0;
   ASSERTED uint32_t total_length;

   for (int i = 0; i < ARRAY_SIZE(genxml_files_table); i++) {
      if (genxml_files_table[i].ver_10 == verx10) {
         text_offset = genxml_files_table[i].offset;
         text_length = genxml_files_table[i].length;
         break;
      }
   }

   if (text_length == 0) {
      fprintf(stderr, "unable to find gen (%u) data\n", verx10);
      return false;
   }

   total_length = zlib_inflate(compress_genxmls,
                               sizeof(compress_genxmls),
                               (void **) &text_data);
   assert(text_offset + text_length <= total_length);

   *data = malloc(text_length);
   if (*data == NULL) {
      free(text_data);
      return false;
   }

   memcpy(*data, &text_data[text_offset], text_length);
   free(text_data);
   *data_len = text_length;
   return true;
}

static bool
get_embedded_xml_data_by_name(const char *filename,
                              void **data, size_t *data_len)
{
   int filename_len = strlen(filename);
   if (filename_len < 8 || filename_len > 10)
      return false;

   if (strncmp(filename, "gen", 3) != 0 ||
       strcmp(filename + filename_len - 4, ".xml") != 0)
      return false;

   char *numstr = strndup(filename + 3, filename_len - 7);
   char *endptr;
   long num = strtol(numstr, &endptr, 10);
   if (*endptr != '\0') {
      free(numstr);
      return false;
   }

   assert(num >= 40);

   free(numstr);
   return get_embedded_xml_data(num, data, data_len);
}

static bool
get_xml_data(int verx10, const char *dirname, const char *filename,
             void **data, size_t *data_len)
{
   if (dirname != NULL)
      return get_xml_data_dir(dirname, filename, data, data_len);
   else if (filename != NULL)
      return get_embedded_xml_data_by_name(filename, data, data_len);
   else
      return get_embedded_xml_data(verx10, data, data_len);
}

static struct intel_spec *
intel_spec_load_common(int verx10, const char *dirname, const char *filename)
{
   struct parser_context ctx;
   void *xmlbuf, *data;
   size_t data_len;

   if (!get_xml_data(verx10, dirname, filename, &data, &data_len))
      return NULL;

   memset(&ctx, 0, sizeof ctx);
   ctx.dirname = dirname;
   list_inithead(&ctx.import.exclusions);
   ctx.parser = XML_ParserCreate(NULL);
   XML_SetUserData(ctx.parser, &ctx);
   if (ctx.parser == NULL) {
      free(data);
      fprintf(stderr, "failed to create parser\n");
      return NULL;
   }

   XML_SetElementHandler(ctx.parser, start_element, end_element);
   XML_SetCharacterDataHandler(ctx.parser, character_data);

   ctx.spec = intel_spec_init();
   if (ctx.spec == NULL) {
      free(data);
      fprintf(stderr, "Failed to create intel_spec\n");
      return NULL;
   }

   xmlbuf = XML_GetBuffer(ctx.parser, data_len);
   memcpy(xmlbuf, data, data_len);
   free(data);
   data = NULL;

   if (XML_ParseBuffer(ctx.parser, data_len, true) == 0) {
      fprintf(stderr,
              "Error parsing XML at line %ld col %ld byte %ld/%zu: %s\n",
              XML_GetCurrentLineNumber(ctx.parser),
              XML_GetCurrentColumnNumber(ctx.parser),
              XML_GetCurrentByteIndex(ctx.parser), data_len,
              XML_ErrorString(XML_GetErrorCode(ctx.parser)));
      XML_ParserFree(ctx.parser);
      return NULL;
   }

   XML_ParserFree(ctx.parser);
   assert(ctx.import.name == NULL);

   return ctx.spec;
}

struct intel_spec *
intel_spec_load(const struct intel_device_info *devinfo)
{
   return intel_spec_load_common(devinfo->verx10, NULL, NULL);
}

struct intel_spec *
intel_spec_load_filename(const char *dir, const char *name)
{
   return intel_spec_load_common(0, dir, name);
}

struct intel_spec *
intel_spec_load_from_path(const struct intel_device_info *devinfo,
                          const char *path)
{
   char filename[20];
   int xml_file_num = devinfo->verx10 % 10 ? devinfo->verx10 : devinfo->ver;

   ASSERTED size_t len = snprintf(filename, ARRAY_SIZE(filename), "gen%i.xml",
                                  xml_file_num);
   assert(len < ARRAY_SIZE(filename));

   return intel_spec_load_common(devinfo->verx10, path, filename);
}

void intel_spec_destroy(struct intel_spec *spec)
{
   ralloc_free(spec);
}

struct intel_group *
intel_spec_find_instruction(struct intel_spec *spec,
                            enum intel_engine_class engine,
                            const uint32_t *p)
{
   hash_table_foreach(spec->commands, entry) {
      struct intel_group *command = entry->data;
      uint32_t opcode = *p & command->opcode_mask;
      if ((command->engine_mask & INTEL_ENGINE_CLASS_TO_MASK(engine)) &&
           opcode == command->opcode)
         return command;
   }

   return NULL;
}

struct intel_field *
intel_group_find_field(struct intel_group *group, const char *name)
{
   char path[256];
   snprintf(path, sizeof(path), "%s/%s", group->name, name);

   struct intel_spec *spec = group->spec;
   struct hash_entry *entry = _mesa_hash_table_search(spec->access_cache,
                                                      path);
   if (entry)
      return entry->data;

   struct intel_field *field = group->fields;
   while (field) {
      if (strcmp(field->name, name) == 0) {
         _mesa_hash_table_insert(spec->access_cache,
                                 ralloc_strdup(spec, path),
                                 field);
         return field;
      }
      field = field->next;
   }

   return NULL;
}

int
intel_group_get_length(const struct intel_group *group, const uint32_t *p)
{
   if (group) {
      if (group->fixed_length)
         return group->dw_length;
      else {
         struct intel_field *field = group->dword_length_field;
         if (field) {
            return field_value(p[0], field->start, field->end) + group->bias;
         }
      }
   }

   uint32_t h = p[0];
   uint32_t type = field_value(h, 29, 31);

   switch (type) {
   case 0: /* MI */ {
      uint32_t opcode = field_value(h, 23, 28);
      if (opcode < 16)
         return 1;
      else
         return field_value(h, 0, 7) + 2;
      break;
   }

   case 2: /* BLT */ {
      return field_value(h, 0, 7) + 2;
   }

   case 3: /* Render */ {
      uint32_t subtype = field_value(h, 27, 28);
      uint32_t opcode = field_value(h, 24, 26);
      uint16_t whole_opcode = field_value(h, 16, 31);
      switch (subtype) {
      case 0:
         if (whole_opcode == 0x6104 /* PIPELINE_SELECT_965 */)
            return 1;
         else if (opcode < 2)
            return field_value(h, 0, 7) + 2;
         else
            return -1;
      case 1:
         if (opcode < 2)
            return 1;
         else
            return -1;
      case 2: {
         if (whole_opcode == 0x73A2 /* HCP_PAK_INSERT_OBJECT */)
            return field_value(h, 0, 11) + 2;
         else if (opcode == 0)
            return field_value(h, 0, 7) + 2;
         else if (opcode < 3)
            return field_value(h, 0, 15) + 2;
         else
            return -1;
      }
      case 3:
         if (whole_opcode == 0x780b)
            return 1;
         else if (opcode < 4)
            return field_value(h, 0, 7) + 2;
         else
            return -1;
      }
   }
   }

   return -1;
}

static const char *
intel_get_enum_name(const struct intel_enum *e, uint64_t value)
{
   for (int i = 0; i < e->nvalues; i++) {
      if (e->values[i]->value == value) {
         return e->values[i]->name;
      }
   }
   return NULL;
}

static bool
iter_more_fields(const struct intel_field_iterator *iter)
{
   return iter->field != NULL && iter->field->next != NULL;
}

static uint32_t
iter_array_offset_bits(const struct intel_field_iterator *iter)
{
   if (iter->level == 0)
      return 0;

   uint32_t offset = 0;
   const struct intel_group *group = iter->groups[1];
   for (int level = 1; level <= iter->level; level++, group = iter->groups[level]) {
      uint32_t array_idx = iter->array_iter[level];
      offset += group->array_offset + array_idx * group->array_item_size;
   }

   return offset;
}

/* Checks whether we have more items in the array to iterate, or more arrays to
 * iterate through.
 */
/* descend into a non-array field */
static void
iter_push_array(struct intel_field_iterator *iter)
{
   assert(iter->level >= 0);

   iter->group = iter->field->array;
   iter->level++;
   assert(iter->level < DECODE_MAX_ARRAY_DEPTH);
   iter->groups[iter->level] = iter->group;
   iter->array_iter[iter->level] = 0;

   assert(iter->group->fields != NULL); /* an empty <group> makes no sense */
   iter->field = iter->group->fields;
   iter->fields[iter->level] = iter->field;
}

static void
iter_pop_array(struct intel_field_iterator *iter)
{
   assert(iter->level > 0);

   iter->level--;
   iter->field = iter->fields[iter->level];
   iter->group = iter->groups[iter->level];
}

static void
iter_start_field(struct intel_field_iterator *iter, struct intel_field *field)
{
   iter->field = field;
   iter->fields[iter->level] = field;

   while (iter->field->array)
      iter_push_array(iter);

   int array_member_offset = iter_array_offset_bits(iter);

   iter->start_bit = array_member_offset + iter->field->start;
   iter->end_bit = array_member_offset + iter->field->end;
   iter->struct_desc = NULL;
}

static void
iter_advance_array(struct intel_field_iterator *iter)
{
   assert(iter->level > 0);
   int lvl = iter->level;

   if (iter->group->variable)
      iter->array_iter[lvl]++;
   else {
      if ((iter->array_iter[lvl] + 1) < iter->group->array_count) {
         iter->array_iter[lvl]++;
      }
   }

   iter_start_field(iter, iter->group->fields);
}

static bool
iter_more_array_elems(const struct intel_field_iterator *iter)
{
   int lvl = iter->level;
   assert(lvl >= 0);

   if (iter->group->variable) {
      int length = intel_group_get_length(iter->group, iter->p);
      assert(length >= 0 && "error the length is unknown!");
      return iter_array_offset_bits(iter) + iter->group->array_item_size <
         (length * 32);
   } else {
      return (iter->array_iter[lvl] + 1) < iter->group->array_count;
   }
}

static bool
iter_advance_field(struct intel_field_iterator *iter)
{
   /* Keep looping while we either have more fields to look at, or we are
    * inside a <group> and can go up a level.
    */
   while (iter_more_fields(iter) || iter->level > 0) {
      if (iter_more_fields(iter)) {
         iter_start_field(iter, iter->field->next);
         return true;
      }

      assert(iter->level >= 0);

      if (iter_more_array_elems(iter)) {
         iter_advance_array(iter);
         return true;
      }

      /* At this point, we reached the end of the <group> and were on the last
       * iteration. So it's time to go back to the parent and then advance the
       * field.
       */
      iter_pop_array(iter);
   }

   return false;
}

static bool
iter_decode_field_raw(struct intel_field_iterator *iter, uint64_t *qw)
{
   *qw = 0;

   int field_start = iter->p_bit + iter->start_bit;
   int field_end = iter->p_bit + iter->end_bit;

   const uint32_t *p = iter->p + (iter->start_bit / 32);
   if (iter->p_end && p >= iter->p_end)
      return false;

   if ((field_end - field_start) > 32) {
      if (!iter->p_end || (p + 1) < iter->p_end)
         *qw = ((uint64_t) p[1]) << 32;
      *qw |= p[0];
   } else
      *qw = p[0];

   *qw = field_value(*qw, field_start, field_end);

   /* Address & offset types have to be aligned to dwords, their start bit is
    * a reminder of the alignment requirement.
    */
   if (iter->field->type.kind == INTEL_TYPE_ADDRESS ||
       iter->field->type.kind == INTEL_TYPE_OFFSET)
      *qw <<= field_start % 32;

   return true;
}

static bool
iter_decode_field(struct intel_field_iterator *iter)
{
   union {
      uint64_t qw;
      float f;
   } v;

   if (iter->field->name)
      snprintf(iter->name, sizeof(iter->name), "%s", iter->field->name);
   else
      memset(iter->name, 0, sizeof(iter->name));

   memset(&v, 0, sizeof(v));

   if (!iter_decode_field_raw(iter, &iter->raw_value))
      return false;

   const char *enum_name = NULL;

   v.qw = iter->raw_value;
   switch (iter->field->type.kind) {
   case INTEL_TYPE_UNKNOWN:
   case INTEL_TYPE_INT: {
      snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw);
      enum_name = intel_get_enum_name(&iter->field->inline_enum, v.qw);
      break;
   }
   case INTEL_TYPE_MBZ:
   case INTEL_TYPE_UINT: {
      snprintf(iter->value, sizeof(iter->value), "%"PRIu64, v.qw);
      enum_name = intel_get_enum_name(&iter->field->inline_enum, v.qw);
      break;
   }
   case INTEL_TYPE_BOOL: {
      const char *true_string =
         iter->print_colors ? "\e[0;35mtrue\e[0m" : "true";
      snprintf(iter->value, sizeof(iter->value), "%s",
               v.qw ? true_string : "false");
      break;
   }
   case INTEL_TYPE_FLOAT:
      snprintf(iter->value, sizeof(iter->value), "%f", v.f);
      break;
   case INTEL_TYPE_ADDRESS:
   case INTEL_TYPE_OFFSET:
      snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, v.qw);
      break;
   case INTEL_TYPE_STRUCT:
      snprintf(iter->value, sizeof(iter->value), "<struct %s>",
               iter->field->type.intel_struct->name);
      iter->struct_desc =
         intel_spec_find_struct(iter->group->spec,
                                iter->field->type.intel_struct->name);
      break;
   case INTEL_TYPE_UFIXED:
      snprintf(iter->value, sizeof(iter->value), "%f",
               (float) v.qw / (1 << iter->field->type.f));
      break;
   case INTEL_TYPE_SFIXED: {
      /* Sign extend before converting */
      int bits = iter->field->type.i + iter->field->type.f + 1;
      int64_t v_sign_extend = util_mask_sign_extend(v.qw, bits);
      snprintf(iter->value, sizeof(iter->value), "%f",
               (float) v_sign_extend / (1 << iter->field->type.f));
      break;
   }
   case INTEL_TYPE_MBO:
       break;
   case INTEL_TYPE_ENUM: {
      snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw);
      enum_name = intel_get_enum_name(iter->field->type.intel_enum, v.qw);
      break;
   }
   }

   if (strlen(iter->group->name) == 0) {
      int length = strlen(iter->name);
      assert(iter->level >= 0);

      int level = 1;
      char *buf = iter->name + length;
      while (level <= iter->level) {
         int printed = snprintf(buf, sizeof(iter->name) - length,
                                "[%i]", iter->array_iter[level]);
         level++;
         length += printed;
         buf += printed;
      }
   }

   if (enum_name) {
      int length = strlen(iter->value);
      snprintf(iter->value + length, sizeof(iter->value) - length,
               " (%s)", enum_name);
   } else if (strcmp(iter->name, "Surface Format") == 0 ||
              strcmp(iter->name, "Source Element Format") == 0) {
      if (isl_format_is_valid((enum isl_format)v.qw)) {
         const char *fmt_name = isl_format_get_name((enum isl_format)v.qw);
         int length = strlen(iter->value);
         snprintf(iter->value + length, sizeof(iter->value) - length,
                  " (%s)", fmt_name);
      }
   }

   return true;
}

void
intel_field_iterator_init(struct intel_field_iterator *iter,
                          const struct intel_group *group,
                          const uint32_t *p, int p_bit,
                          bool print_colors)
{
   memset(iter, 0, sizeof(*iter));

   iter->groups[iter->level] = group;
   iter->group = group;
   iter->p = p;
   iter->p_bit = p_bit;

   int length = intel_group_get_length(iter->group, iter->p);
   assert(length >= 0 && "error the length is unknown!");
   iter->p_end = length >= 0 ? &p[length] : NULL;
   iter->print_colors = print_colors;
}

bool
intel_field_iterator_next(struct intel_field_iterator *iter)
{
   /* Initial condition */
   if (!iter->field) {
      if (iter->group->fields)
         iter_start_field(iter, iter->group->fields);

      bool result = iter_decode_field(iter);
      if (!result && iter->p_end) {
         /* We're dealing with a non empty struct of length=0 (BLEND_STATE on
          * Gen 7.5)
          */
         assert(iter->group->dw_length == 0);
      }

      return result;
   }

   if (!iter_advance_field(iter))
      return false;

   if (!iter_decode_field(iter))
      return false;

   return true;
}

static void
print_dword_header(FILE *outfile,
                   struct intel_field_iterator *iter,
                   uint64_t offset, uint32_t dword,
                   const char *spacing)
{
   fprintf(outfile, "%s0x%08"PRIx64":  0x%08x : Dword %d\n",
           spacing, offset + 4 * dword, iter->p[dword], dword);
}

bool
intel_field_is_header(const struct intel_field *field)
{
   uint32_t bits;

   /* Instructions are identified by the first DWord. */
   if (field->start >= 32 ||
       field->end >= 32)
      return false;

   bits = (1ULL << (field->end - field->start + 1)) - 1;
   bits <<= field->start;

   return (field->parent->opcode_mask & bits) != 0;
}

void
intel_print_group_custom_spacing(FILE *outfile,
                                 const struct intel_group *group, uint64_t offset,
                                 const uint32_t *p, int p_bit, bool color,
                                 const char *spacing_reg, const char *spacing_dword)
{
   struct intel_field_iterator iter;
   int last_dword = -1;

   intel_field_iterator_init(&iter, group, p, p_bit, color);
   while (intel_field_iterator_next(&iter)) {
      int iter_dword = iter.end_bit / 32;
      if (last_dword != iter_dword) {
         for (int i = last_dword + 1; i <= iter_dword; i++)
            print_dword_header(outfile, &iter, offset, i, spacing_dword);
         last_dword = iter_dword;
      }
      if (!intel_field_is_header(iter.field)) {
         fprintf(outfile, "%s%s: %s\n", spacing_reg, iter.name, iter.value);
         if (iter.struct_desc) {
            int struct_dword = iter.start_bit / 32;
            uint64_t struct_offset = offset + 4 * struct_dword;
            intel_print_group(outfile, iter.struct_desc, struct_offset,
                              &p[struct_dword], iter.start_bit % 32, color);
         }
      }
   }
}

void
intel_print_group(FILE *outfile,
                  const struct intel_group *group, uint64_t offset,
                  const uint32_t *p, int p_bit, bool color)
{
   const char *spacing_reg = "    ";
   const char *spacing_dword = "";

   intel_print_group_custom_spacing(outfile, group, offset, p, p_bit, color,
                                    spacing_reg, spacing_dword);
}
