Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame^] | 1 | From 6807d4b30f7d4ed32d3c54dfcaf3ace63eaa4f02 Mon Sep 17 00:00:00 2001 |
| 2 | From: Emekcan Aras <emekcan.aras@arm.com> |
| 3 | Date: Thu, 26 Oct 2023 11:46:04 +0100 |
| 4 | Subject: [PATCH] platform: corstone1000: align capsule update structs |
| 5 | |
| 6 | U-boot mkefitool creates capsule image without packed and byte-aligned |
| 7 | structs. This patch aligns the capsule-update structures and avoids |
| 8 | crashes in case of unaligned pointer access. |
| 9 | |
| 10 | Signed-off-by: Emekcan Aras <emekcan.aras@arm.com> |
| 11 | Upstream-Status: Pending |
| 12 | --- |
| 13 | .../fw_update_agent/uefi_capsule_parser.c | 14 +++++++------- |
| 14 | 1 file changed, 7 insertions(+), 7 deletions(-) |
| 15 | |
| 16 | diff --git a/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_capsule_parser.c b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_capsule_parser.c |
| 17 | index c706c040ac..9f8d12ad4e 100644 |
| 18 | --- a/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_capsule_parser.c |
| 19 | +++ b/platform/ext/target/arm/corstone1000/fw_update_agent/uefi_capsule_parser.c |
| 20 | @@ -34,14 +34,14 @@ typedef struct { |
| 21 | uint32_t header_size; |
| 22 | uint32_t flags; |
| 23 | uint32_t capsule_image_size; |
| 24 | -} efi_capsule_header_t; |
| 25 | +} efi_capsule_header_t __attribute__((packed, aligned(1))); |
| 26 | |
| 27 | typedef struct { |
| 28 | uint32_t version; |
| 29 | uint16_t embedded_driver_count; |
| 30 | uint16_t payload_item_count; |
| 31 | uint64_t item_offset_list[]; |
| 32 | -} efi_firmware_management_capsule_header_t; |
| 33 | +} efi_firmware_management_capsule_header_t __attribute__((packed, aligned(1))); |
| 34 | |
| 35 | typedef struct { |
| 36 | uint32_t version; |
| 37 | @@ -52,14 +52,14 @@ typedef struct { |
| 38 | uint32_t update_vendorcode_size; |
| 39 | uint64_t update_hardware_instance; //introduced in v2 |
| 40 | uint64_t image_capsule_support; //introduced in v3 |
| 41 | -} efi_firmware_management_capsule_image_header_t; |
| 42 | +} efi_firmware_management_capsule_image_header_t __attribute__((packed, aligned(1))); |
| 43 | |
| 44 | typedef struct { |
| 45 | uint32_t signature; |
| 46 | uint32_t header_size; |
| 47 | uint32_t fw_version; |
| 48 | uint32_t lowest_supported_version; |
| 49 | -} fmp_payload_header_t; |
| 50 | +} fmp_payload_header_t __attribute__((packed, aligned(1))); |
| 51 | |
| 52 | #define ANYSIZE_ARRAY 0 |
| 53 | |
| 54 | @@ -68,18 +68,18 @@ typedef struct { |
| 55 | uint16_t wRevision; |
| 56 | uint16_t wCertificateType; |
| 57 | uint8_t bCertificate[ANYSIZE_ARRAY]; |
| 58 | -} WIN_CERTIFICATE; |
| 59 | +} WIN_CERTIFICATE __attribute__((packed, aligned(1))); |
| 60 | |
| 61 | typedef struct { |
| 62 | WIN_CERTIFICATE hdr; |
| 63 | struct efi_guid cert_type; |
| 64 | uint8_t cert_data[ANYSIZE_ARRAY]; |
| 65 | -} win_certificate_uefi_guid_t; |
| 66 | +} win_certificate_uefi_guid_t __attribute__((packed, aligned(1))); |
| 67 | |
| 68 | typedef struct { |
| 69 | uint64_t monotonic_count; |
| 70 | win_certificate_uefi_guid_t auth_info; |
| 71 | -} efi_firmware_image_authentication_t; |
| 72 | +} efi_firmware_image_authentication_t __attribute__((packed, aligned(1))); |
| 73 | |
| 74 | |
| 75 | enum uefi_capsule_error_t uefi_capsule_retrieve_images(void* capsule_ptr, |
| 76 | -- |
| 77 | 2.25.1 |
| 78 | |