[Mesa-dev] [PATCH 1/4] intel/decoder: add gen_spec_init method

Lionel Landwerlin lionel.g.landwerlin at intel.com
Wed Sep 5 17:29:03 UTC 2018


On 05/09/2018 18:19, Sagar Ghuge wrote:
> Initialize gen_spec instance properly when loading hardware xml
> description from specifc directory to avoid segmentation fault.
>
> Signed-off-by: Sagar Ghuge <sagar.ghuge at intel.com>
> ---
>   src/intel/common/gen_decoder.c | 51 +++++++++++++++++++++++-----------
>   1 file changed, 35 insertions(+), 16 deletions(-)
>
> diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c
> index c6c213fcd1..dbd060d53c 100644
> --- a/src/intel/common/gen_decoder.c
> +++ b/src/intel/common/gen_decoder.c
> @@ -526,6 +526,30 @@ static uint32_t _hash_uint32(const void *key)
>      return (uint32_t) (uintptr_t) key;
>   }
>   
> +static struct gen_spec *
> +gen_spec_init()


I think in C, you would write : gen_spec_init(void)


With that fixed :


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>


> +{
> +   struct gen_spec *spec;
> +   spec = rzalloc(NULL, struct gen_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;
> +}
> +
>   struct gen_spec *
>   gen_spec_load(const struct gen_device_info *devinfo)
>   {
> @@ -560,21 +584,11 @@ gen_spec_load(const struct gen_device_info *devinfo)
>      XML_SetElementHandler(ctx.parser, start_element, end_element);
>      XML_SetCharacterDataHandler(ctx.parser, character_data);
>   
> -   ctx.spec = rzalloc(NULL, struct gen_spec);
> -
> -   ctx.spec->commands =
> -      _mesa_hash_table_create(ctx.spec, _mesa_hash_string, _mesa_key_string_equal);
> -   ctx.spec->structs =
> -      _mesa_hash_table_create(ctx.spec, _mesa_hash_string, _mesa_key_string_equal);
> -   ctx.spec->registers_by_name =
> -      _mesa_hash_table_create(ctx.spec, _mesa_hash_string, _mesa_key_string_equal);
> -   ctx.spec->registers_by_offset =
> -      _mesa_hash_table_create(ctx.spec, _hash_uint32, _mesa_key_pointer_equal);
> -   ctx.spec->enums =
> -      _mesa_hash_table_create(ctx.spec, _mesa_hash_string, _mesa_key_string_equal);
> -
> -   ctx.spec->access_cache =
> -      _mesa_hash_table_create(ctx.spec, _mesa_hash_string, _mesa_key_string_equal);
> +   ctx.spec = gen_spec_init();
> +   if (ctx.spec == NULL) {
> +      fprintf(stderr, "Failed to create gen_spec\n");
> +      return NULL;
> +   }
>   
>      total_length = zlib_inflate(compress_genxmls,
>                                  sizeof(compress_genxmls),
> @@ -636,7 +650,12 @@ gen_spec_load_from_path(const struct gen_device_info *devinfo,
>      XML_SetElementHandler(ctx.parser, start_element, end_element);
>      XML_SetCharacterDataHandler(ctx.parser, character_data);
>      ctx.loc.filename = filename;
> -   ctx.spec = rzalloc(NULL, struct gen_spec);
> +
> +   ctx.spec = gen_spec_init();
> +   if (ctx.spec == NULL) {
> +      fprintf(stderr, "Failed to create gen_spec\n");
> +      return NULL;
> +   }
>   
>      do {
>         buf = XML_GetBuffer(ctx.parser, XML_BUFFER_SIZE);




More information about the mesa-dev mailing list