efi: hii: add guid package support
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Mon, 21 Jan 2019 03:12:58 +0000 (12:12 +0900)
committerAlexander Graf <agraf@suse.de>
Wed, 13 Feb 2019 08:40:06 +0000 (09:40 +0100)
Allow for handling GUID package in HII database protocol.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
include/efi_api.h
lib/efi_loader/efi_hii.c

index 347c7333c5e27ef2755b40b1e9d6bdcbd07d128f..6728f9a32704795fa4f64125cfca4e3944cb5970 100644 (file)
@@ -744,6 +744,15 @@ struct efi_hii_package_header {
 #define EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN 0xE0
 #define EFI_HII_PACKAGE_TYPE_SYSTEM_END   0xFF
 
+/*
+ * HII GUID package
+ */
+struct efi_hii_guid_package {
+       struct efi_hii_package_header header;
+       efi_guid_t guid;
+       char data[];
+} __packed;
+
 /*
  * HII string package
  */
index d6dba5719cdb8827822db90ae701bc46ac860445..d7cd0c4f0fc655fc48ac4a67ccebc2cfbfe23798 100644 (file)
@@ -23,6 +23,7 @@ struct efi_hii_packagelist {
        efi_handle_t driver_handle;
        u32 max_string_id;
        struct list_head string_tables;     /* list of efi_string_table */
+       struct list_head guid_list;
 
        /* we could also track fonts, images, etc */
 };
@@ -80,6 +81,11 @@ struct efi_string_table {
        struct efi_string_info *strings;
 };
 
+struct efi_guid_data {
+       struct list_head link;
+       struct efi_hii_guid_package package;
+};
+
 static void free_strings_table(struct efi_string_table *stbl)
 {
        int i;
@@ -218,6 +224,35 @@ error:
        return ret;
 }
 
+static void remove_guid_package(struct efi_hii_packagelist *hii)
+{
+       struct efi_guid_data *data;
+
+       while (!list_empty(&hii->guid_list)) {
+               data = list_first_entry(&hii->guid_list,
+                                       struct efi_guid_data, link);
+               list_del(&data->link);
+               free(data);
+       }
+}
+
+static efi_status_t
+add_guid_package(struct efi_hii_packagelist *hii,
+                struct efi_hii_guid_package *package)
+{
+       struct efi_guid_data *data;
+
+       data = calloc(sizeof(*data), 1);
+       if (!data)
+               return EFI_OUT_OF_RESOURCES;
+
+       /* TODO: we don't know any about data field */
+       memcpy(&data->package, package, sizeof(*package));
+       list_add_tail(&data->link, &hii->guid_list);
+
+       return EFI_SUCCESS;
+}
+
 static struct efi_hii_packagelist *new_packagelist(void)
 {
        struct efi_hii_packagelist *hii;
@@ -225,6 +260,7 @@ static struct efi_hii_packagelist *new_packagelist(void)
        hii = malloc(sizeof(*hii));
        hii->max_string_id = 0;
        INIT_LIST_HEAD(&hii->string_tables);
+       INIT_LIST_HEAD(&hii->guid_list);
 
        return hii;
 }
@@ -232,6 +268,7 @@ static struct efi_hii_packagelist *new_packagelist(void)
 static void free_packagelist(struct efi_hii_packagelist *hii)
 {
        remove_strings_package(hii);
+       remove_guid_package(hii);
 
        list_del(&hii->link);
        free(hii);
@@ -259,8 +296,8 @@ add_packages(struct efi_hii_packagelist *hii,
 
                switch (efi_hii_package_type(package)) {
                case EFI_HII_PACKAGE_TYPE_GUID:
-                       printf("\tGuid package not supported\n");
-                       ret = EFI_INVALID_PARAMETER;
+                       ret = add_guid_package(hii,
+                               (struct efi_hii_guid_package *)package);
                        break;
                case EFI_HII_PACKAGE_FORMS:
                        printf("\tForm package not supported\n");
@@ -395,8 +432,7 @@ update_package_list(const struct efi_hii_database_protocol *this,
 
                switch (efi_hii_package_type(package)) {
                case EFI_HII_PACKAGE_TYPE_GUID:
-                       printf("\tGuid package not supported\n");
-                       ret = EFI_INVALID_PARAMETER;
+                       remove_guid_package(hii);
                        break;
                case EFI_HII_PACKAGE_FORMS:
                        printf("\tForm package not supported\n");
@@ -482,8 +518,8 @@ list_package_lists(const struct efi_hii_database_protocol *this,
                case EFI_HII_PACKAGE_TYPE_ALL:
                        break;
                case EFI_HII_PACKAGE_TYPE_GUID:
-                       printf("\tGuid package not supported\n");
-                       ret = EFI_INVALID_PARAMETER;
+                       if (!list_empty(&hii->guid_list))
+                               break;
                        continue;
                case EFI_HII_PACKAGE_FORMS:
                        printf("\tForm package not supported\n");