Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4161117pxb; Mon, 27 Sep 2021 10:38:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyNI96p279o/Ho0EC+/1+iLT61k5kICFjhae/6uMENqtNvGBBDnfNfL9kv2Iz2pDG4yCOOJ X-Received: by 2002:aa7:9718:0:b0:43e:ee6:fd94 with SMTP id a24-20020aa79718000000b0043e0ee6fd94mr1069173pfg.73.1632764281665; Mon, 27 Sep 2021 10:38:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632764281; cv=none; d=google.com; s=arc-20160816; b=FMO3kGUhz7j6IVz5OHPPXut9VNb/+WT9++EuJUTw8KzN6mT2FFEQThGEFcWT3U7glK Xogso3lIr53zhOIxQ7pyOLXW+Au0sf6TfNPcmiz4XiBu86OlUib3dy0srvYuUSofMK5V CZOSNTgMC+eprnkNxGvxL37P3Ybd65QBg7JMM9q22YrOzwZDcFehP+g7Q/BxVoMwnpBP sqAfh4C4lXNNB22LRioodGcspRV9jEkXTQtC+QRfTVw80vk61MuqOOMJW5Pa3Z7SGKXu qjtI/2ofX6oayJXSHL7kDuMJKz97YRsmxI4zvtzt6/4hFW5KQjNkJ+lkjO4VjQeS0Ugv vhtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version; bh=DTl4v4xRY/QeaUhXMVUUEMkzsjdM8aQdj906WW5kU7s=; b=CLktwDpJTfz7zp0zKUeZHsYmax8gQ32QvNMra5CKQESJzWyBlR8FSOAXi1OIk/lM+F v1GPHzsdILl7l+BkCENGc2Q9I8KJnR+CEuYjewZeWJd+YUUqDjxHuy8LDNOqMxXypJh8 W47jNmIZgclhtcZrOf6jorDNTFcxPE0P0ddb4r4pZLh3R0i1vuIVBWwRJ3wuEYQJFzB1 Y4IlddSMCKnX6vvmqRfjMGn8e2bBZfJGuAsYFKxTTZJCjBWhtCuu6MwQ/BoSWBX/3l0y 5QS65rAo5Fea6eeEqiXvm9AM20jB30JQ1tUsruNvAQQcihdractghf2QU9sYfnvgYN6W yjrg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m12si270101pjg.36.2021.09.27.10.37.46; Mon, 27 Sep 2021 10:38:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238272AbhI0RhH (ORCPT + 99 others); Mon, 27 Sep 2021 13:37:07 -0400 Received: from mail-oi1-f177.google.com ([209.85.167.177]:45034 "EHLO mail-oi1-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239220AbhI0RfE (ORCPT ); Mon, 27 Sep 2021 13:35:04 -0400 Received: by mail-oi1-f177.google.com with SMTP id e24so16651028oig.11; Mon, 27 Sep 2021 10:33:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=DTl4v4xRY/QeaUhXMVUUEMkzsjdM8aQdj906WW5kU7s=; b=RDw4x1Hkfgbhac/lpGI3CErQ7yqRljL+iA7I4aZEggmv0nKNjvttl/W1fhfZceZhnX 2OVIuA0SpmNQnv9n3OKDvoKYohK7bfOIXwlQ0tY4r8Lbhgd04ILN060sIlT2Tqg+4+mj 4BWlKbdVM0wdN5T5yX5aHsywXbUYfAoWC0D0iLJTtbYvQJvJX22r4eks2dVWthS4sYKL I8MrwTA0n/C2mWwmKOR9rF+aEaemvjkY2Up1y96El9yd8C9RLfHHNWHYb9hiVmUpQxFR xKrcGhpcTQN3sb5folcttdsJIplQodmADmkILXnrvpnTiIJX1SwZ4GBtE8kUU3/43Ty1 /6cw== X-Gm-Message-State: AOAM533QG/GEKdjgeCnLpOQqxHTA9jCI/XDUZc6NVWh4QeAMQJBdCv0u 7dVLkGNcE3JgLkt55zCoDxtGUEuO7buZZSZgDo7l+5Zr3qs= X-Received: by 2002:a05:6808:1816:: with SMTP id bh22mr190669oib.69.1632764006375; Mon, 27 Sep 2021 10:33:26 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: "Rafael J. Wysocki" Date: Mon, 27 Sep 2021 19:33:15 +0200 Message-ID: Subject: Re: [PATCH v3 2/5] efi: Introduce EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER and corresponding structures To: Chen Yu Cc: ACPI Devel Maling List , Linux Kernel Mailing List , "Rafael J. Wysocki" , Len Brown , Dan Williams , Andy Shevchenko , Aubrey Li , Ashok Raj , Mike Rapoport , Ard Biesheuvel , linux-efi Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Sep 16, 2021 at 5:54 PM Chen Yu wrote: > > Platform Firmware Runtime Update image starts with UEFI headers, and the > headers are defined in UEFI specification, but some of them have not been > defined in the kernel yet. > > For example, the header layout of a capsule file looks like this: > > EFI_CAPSULE_HEADER > EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER > EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER > EFI_FIRMWARE_IMAGE_AUTHENTICATION > > These structures would be used by the Platform Firmware Runtime Update > driver to parse the format of capsule file to verify if the corresponding > version number is valid. The EFI_CAPSULE_HEADER has been defined in the > kernel, however the rest are not, thus introduce corresponding UEFI > structures accordingly. > > The reason why efi_manage_capsule_header_t and > efi_manage_capsule_image_header_t are packedi might be that: > According to the uefi spec, > [Figure 23-6 Firmware Management and Firmware Image Management headers] > EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER is located at the lowest offset > within the body of the capsule. And this structure is designed to be > unaligned to save space, because in this way the adjacent drivers and > binary payload elements could start on byte boundary with no padding. > And the EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER is at the head of > each payload, so packing this structure also makes room for more data. IMO it would be sufficient to say that both EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER and EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER need not be aligned and so the corresponding data types should be packed. > > Signed-off-by: Chen Yu > --- > include/linux/efi.h | 50 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 50 insertions(+) > > diff --git a/include/linux/efi.h b/include/linux/efi.h > index 6b5d36babfcc..19ff834e1388 100644 > --- a/include/linux/efi.h > +++ b/include/linux/efi.h > @@ -148,6 +148,56 @@ typedef struct { > u32 imagesize; > } efi_capsule_header_t; > > +#pragma pack(1) > + > +/* EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER */ > +typedef struct { > + u32 ver; > + u16 emb_drv_cnt; > + u16 payload_cnt; > + /* > + * Variable array indicated by number of > + * (emb_drv_cnt + payload_cnt) > + */ > + u64 offset_list[]; > +} efi_manage_capsule_header_t; > + > +/* EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER */ > +typedef struct { > + u32 ver; > + guid_t image_type_id; > + u8 image_index; > + u8 reserved_bytes[3]; > + u32 image_size; > + u32 vendor_code_size; > + /* ver = 2. */ > + u64 hw_ins; > + /* ver = v3. */ > + u64 capsule_support; > +} efi_manage_capsule_image_header_t; > + > +#pragma pack() > + > +/* WIN_CERTIFICATE */ > +typedef struct { > + u32 len; > + u16 rev; > + u16 cert_type; > +} win_cert_t; > + > +/* WIN_CERTIFICATE_UEFI_GUID */ > +typedef struct { > + win_cert_t hdr; > + guid_t cert_type; > + u8 cert_data[]; > +} win_cert_uefi_guid_t; > + > +/* EFI_FIRMWARE_IMAGE_AUTHENTICATIO */ > +typedef struct { > + u64 mon_count; > + win_cert_uefi_guid_t auth_info; > +} efi_image_auth_t; > + > /* > * EFI capsule flags > */ > -- > 2.25.1 >