From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM04-SN1-obe.outbound.protection.outlook.com (NAM04-SN1-obe.outbound.protection.outlook.com [40.92.11.15]) by mx.groups.io with SMTP id smtpd.web11.678.1602796830181473911 for ; Thu, 15 Oct 2020 14:20:46 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@outlook.com header.s=selector1 header.b=TmPlPZYw; spf=pass (domain: outlook.com, ip: 40.92.11.15, mailfrom: michael.kubacki@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n/E1p6KLFBS6Ipjy4uQZk95wKAyy32dJofdIEvqhH/JfTuDfmHJ/oJLSos9HGog4pozO69uFpSnoOFKGt6+Ip9lPkp3sf8W3JkrwQKc6pqPdhc6uHPGj1MpOUHH8zX3HFkE7IA5uXdVtam1rOVwHb1ScRfaNlC/U9/Uo8WeT33Mg7M+2wQnIeCe21uGWwC8OSs8EmKbgVd7G+KQDwHjhS4qSZzWlw5XqHCKhL5aWzIlfW9Nk+ke/tb0gWeIg+SYbLTMh68Oq/hq5BIKtTLKehm8dLSyB6ghI55J9vzgRAk+HzkQ6PPS2UEaLBi7Go3bjtBU1O8GJ9o6Xw2VX+lGZvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6IFE7Q/h4xwzY7u5ShJRNTHqXnruFQ6xnVCyJBb3wJI=; b=DzZOPVP0mMFA1IIgFfJR5/P6VNj6kKx2a+bxc+eV67Bvus/iZHcikRhLLVekzphjUdUwQWBjPRWj0KMKWlOiRIKbwXBJF59pWJHt5lseCOUDtfvrAb4k/kwlcXyHjk+HBCK5v738Um9MaO1fXrP7mUIKeGpjT/qlvWviEKExe9Y6raQ6oAJK5/XKgG34D9T3LfbQnfUIcxHrqiWlkn6u6qzP9umcri/z+NPvLiIGK7p5n65ix4i/Hvxa4LPv+IlT3otkgpfXkqQb2pj4MiccmnlkhDW2EtKF/ON86yHj5grnUn2Y/pz2vLAvysS2857cEUFaMzEb4a61r13yq137Jg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6IFE7Q/h4xwzY7u5ShJRNTHqXnruFQ6xnVCyJBb3wJI=; b=TmPlPZYwWYAHCUjlopAxbTsirgxZq6Zi52tDzWrry8ZXH353iYnlX4uLKiN/vYZfwOEgdGf+tyd92ZwoUM4UtwstxvSBlAxllGQ+jAT51k4ywOkAiALGbS3WXUpCyPB5z5oJuq5q6axP49FhmEI/cKNHV1N8rzcbE1SPOhcEiwDLdfvu9Sb2sk79sFKCH4K5mzwYo+GW/kQ8DC5rJ9D5wtPFMnexPa0iqXhkXow0S+9NAuJEmDsgaLHYPmevxqTA+M9vAIEKiWnYgZhxyIL0aG+LUptWg45EmcwFPYno+eMxRL+zE4N2IPbCbncMYnkBzW+SwcGlNJOdZY15/psWQg== Received: from DM6NAM04FT027.eop-NAM04.prod.protection.outlook.com (2a01:111:e400:7ea3::53) by DM6NAM04HT152.eop-NAM04.prod.protection.outlook.com (2a01:111:e400:7ea3::173) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3455.27; Thu, 15 Oct 2020 21:20:25 +0000 Received: from MWHPR07MB3440.namprd07.prod.outlook.com (2a01:111:e400:7ea3::53) by DM6NAM04FT027.mail.protection.outlook.com (2a01:111:e400:7ea3::334) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3455.27 via Frontend Transport; Thu, 15 Oct 2020 21:20:25 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:E28B1BF351E0CF3E1712C39A5E541A28A39599728D8FAEAF0164DA44BFEAE265;UpperCasedChecksum:5C138B376F473FC0A876635A2F45922ACA39C55D0F8725CAE0446CA490CFA647;SizeAsReceived:9108;Count:48 Received: from MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::858f:bd50:1b65:e803]) by MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::858f:bd50:1b65:e803%7]) with mapi id 15.20.3455.031; Thu, 15 Oct 2020 21:20:25 +0000 Subject: Re: [PATCH v4 0/6] Extend Last Attempt Status Usage From: "Michael Kubacki" To: devel@edk2.groups.io CC: Liming Gao , Michael D Kinney , Guomin Jiang , Wei6 Xu , Zhiguang Liu References: Message-ID: Date: Thu, 15 Oct 2020 14:20:24 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 In-Reply-To: X-TMN: [9hK6LuhsvEtFdzJh1WkGszwVsHwnm9rxd1bQLM9MdLi6/r33fhChTIfZKxzTR75I] X-ClientProxiedBy: MWHPR14CA0013.namprd14.prod.outlook.com (2603:10b6:300:ae::23) To MWHPR07MB3440.namprd07.prod.outlook.com (2603:10b6:301:69::28) Return-Path: michael.kubacki@outlook.com X-Microsoft-Original-Message-ID: <5cbf433f-4a51-e718-ac84-6be6fafd2562@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [IPv6:2001:4898:d8:39:5148:ab8a:5f17:7fc6] (2001:4898:80e8:7:d169:ab8a:5f17:7fc6) by MWHPR14CA0013.namprd14.prod.outlook.com (2603:10b6:300:ae::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3477.21 via Frontend Transport; Thu, 15 Oct 2020 21:20:24 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 48 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 9f259140-acd8-4f05-66b3-08d8715021a5 X-MS-TrafficTypeDiagnostic: DM6NAM04HT152: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RzCyN8d3SbiceDG+kCq3Rr/aCDP1mn07B9GQAsJM2gbhE97q4E08Vt9ElChFSoS2bW01jJg5Diba0ZW1oC6RjWaApsDyNIb0YBDYyQ9f6n6UybeJWHtlem8luFwtjjtWcnWgrfY9yzToreufv80RrxtS/mVfWrs5qsBp7EG1+l2wqnjXQZoVq18ngjiiBzn5k4Ci7vRqaIM0w+eKVll4hxPZR/j7A5VMdmNYo9vXE0GMLfsFGdAEyzd2aHtRJ9SR X-MS-Exchange-AntiSpam-MessageData: vQZvGxvVotCU3L8vwXcy9kha2z+Vergi8BQN8QdqYLodFOl8ovnViZK8kLHmIxdBbDZzZzUbXjQdphV9dlQiDEG4iDIBnyLqkWCIyGxUqySzNlNKfF/vrxkPlee8pc0Ypa3x4cOrp5WRIVZ3L7x+WPxImqemv5wkRTiIcxJmuz8WqdD0nWOIuNlx+mB6YiyESchDPDqeHQ3L3JiMixVJIA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9f259140-acd8-4f05-66b3-08d8715021a5 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Oct 2020 21:20:25.1203 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: DM6NAM04FT027.eop-NAM04.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6NAM04HT152 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable Hi all, It's been about two weeks since this email and I still haven't seen any=20 feedback on v4. I made a very small update that resulted in a v5 series today: https://edk2.groups.io/g/devel/message/66287 If you could please provide timely feedback on v5 it would be appreciated. Also, there's an issue building FmpDevicePkg at the moment that you'll=20 need this patch to fix: https://edk2.groups.io/g/devel/message/66286 That patch needs review as well. Thanks, Michael On 10/2/2020 9:26 AM, Michael Kubacki wrote: > It is going on a week now and I haven't seen a response to this patch=20 > series yet. Please review it when possible. >=20 > On a somewhat related note, I made the changes that should be necessary=20 > in edk2-platforms for backward compatibility in this patch: > https://edk2.groups.io/g/devel/message/65821 >=20 > Thanks, > Michael >=20 > On 9/25/2020 7:19 PM, michael.kubacki@outlook.com wrote: >> From: Michael Kubacki >> >> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2802 >> >> This patch series adds more granularity to Last Attempt Status >> codes reported during FMP check image and set image operations >> that greatly improve precision of the status codes. >> >> The unsuccessful vendor range (0x1000 - 0x4000) was introduced >> in UEFI Specification 2.8. At a high-level, two subranges are >> defined within that range in this patch series: >> =C2=A0=C2=A0 1. The FMP Reserved range - reserved for components impleme= nted >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 in FmpDevicePkg. >> =C2=A0=C2=A0 2. The FMP Device Library Reserved range - reserved for >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpDeviceLib instance-specific usage. >> >> The ranges are described in a public header file LastAttemptStatus.h >> while the specific codes used within FmpDevicePkg implementation >> are defined in a private header file FmpLastAttemptStatus.h. >> >> FmpDeviceLib instances should use the range definition from the >> public header file to define Last Attempt Status codes local to >> their library instance. >> >> Of note, there's multiple approaches to assigning private status >> codes in the FMP Reserved range. For example, individual components >> could define their last attempt status codes locally with the >> range allocated to the component defined in a package-wide private >> header file. However, one goal of the granularity being introduced >> is to provide straightforward traceability to an error source. >> >> For that reason, it was chosen to define a constant set of codes at >> the package level in FmpLastAttemptStatus.h. For example, if a new >> FmpDependencyLib instance is added, it would not be able to reassign >> status code values in the pre-existing FMP Dependency range; it >> would reuse codes for the same error source and be able to add new >> codes onto the range for its usage. >> >> V4 changes: >> =C2=A0=C2=A0 1. Simplified range value definitions in LastAttemptStatus.= h. >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Directly assign the values in the macro d= efinition instead >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 of using calculations. >> =C2=A0=C2=A0 2. Adjusted range sizes to leave more room for future expan= sion. >> >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 OLD: >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 START=C2=A0=C2=A0=C2=A0=C2=A0 | END=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | Usage >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 -----------------------------------------= -------| >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1000=C2=A0=C2=A0=C2=A0 | 0x1FFF=C2=A0= =C2=A0=C2=A0 | FmpDevicePkg=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1000 |=C2=A0=C2=A0=C2= =A0 0x107F | FmpDxe driver=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1080 |=C2=A0=C2=A0=C2= =A0 0x109F | FMP dependency Libs=C2=A0=C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x2000=C2=A0=C2=A0=C2=A0 | 0x3FFF=C2=A0= =C2=A0=C2=A0 | FmpDeviceLib instances=C2=A0 | >> >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NEW: >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 START=C2=A0=C2=A0=C2=A0=C2=A0 | END=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | Usage >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 -----------------------------------------= -----------------------| >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1000=C2=A0=C2=A0=C2=A0 | 0x17FF=C2=A0= =C2=A0=C2=A0 | FmpDevicePkg=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1000 |=C2=A0=C2=A0=C2= =A0 0x107F | FmpDxe driver=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1080 |=C2=A0=C2=A0=C2= =A0 0x109F | FmpDependencyLib=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x10A0 |=C2=A0=C2=A0=C2= =A0 0x10BF | FmpDependencyCheckLib=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x10C0 |=C2=A0=C2=A0=C2= =A0 0x17FF | Unused. Available for future expansion. | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1800=C2=A0=C2=A0=C2=A0 | 0x1FFF=C2=A0= =C2=A0=C2=A0 | FmpDeviceLib instances implementation=C2=A0=C2=A0 | >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x2000=C2=A0=C2=A0=C2=A0 | 0x3FFF=C2=A0= =C2=A0=C2=A0 | Unused. Available for future expansion. | >> >> =C2=A0=C2=A0 3. Broke the single range in v3 for FMP Dependency librarie= s into >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 separate ranges. >> =C2=A0=C2=A0 4. Clarified LastAttemptStatus return values in each functi= on >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 description. >> =C2=A0=C2=A0 5. Returned an expected LastAttemptStatus value for some fu= nctions >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 that previously did not return a value. >> =C2=A0=C2=A0 6. Reverted changes in FmpDxe to call the new FmpDeviceLib = APIs >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for FmpDeviceCheckImage () and FmpDeviceS= etImage (). These will >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 be added in a future series after impacte= d platforms in >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 edk2-platforms are updated to use the new= APIs. >> =C2=A0=C2=A0 7. Instead of directly changing the pre-existing APIs in >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpDeviceLib to add a LastAttemptStatus p= arameter, the new >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 functions were added to the library inter= face: >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * FmpDeviceCheckImageWithStat= us () >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * FmpDeviceSetImageWithStatus= () >> >> V3 changes: >> =C2=A0=C2=A0 1. Enhanced range definitions in LastAttemptStatus.h with m= ore >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 completeness providing length, min, and m= ax values. >> =C2=A0=C2=A0 2. Moved the actual Last Attempt Status code assignments to= a >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 private header file PrivateInclude/FmpLas= tAttemptStatus.h. >> =C2=A0=C2=A0 3. Changed the value of >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VE= NDOR_RANGE_MAX >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 to 0x3FFF instead of 0x4000 even though 0= x4000 is defined in >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 the UEFI specification. The length is 0x4= 000 but the max >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 allowed value should be 0x3FFF. This chan= ge was made now to >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 prevent implementation compatibility issu= es in the future. >> =C2=A0=C2=A0 4. Included "DEVICE" in the following macro name to clearly >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 associate it with the FmpDeviceLib librar= y class: >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_ERROR_= xxx >> =C2=A0=C2=A0 5. Included a map to help the reader better visualize the r= ange >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 definitions in LastAttemptStatus.h. >> =C2=A0=C2=A0 6. Included additional documentation describing the enum in >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpLastAttemptStatus.h. An explicit state= ment stating that new >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 codes should be added onto the end of ran= ges to preserve the >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 values was added. >> =C2=A0=C2=A0 7. Simplified error handling logic in FmpDxe for FmpDeviceL= ib >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 calls that return Last Attempt Status. >> =C2=A0=C2=A0 8. V2 had a single memory allocation failure code used for >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 different memory allocations in CheckFmpD= ependency () in >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 FmpDependencyLib. Each potential allocati= on failure was >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 assigned a unique code. >> >> V2 changes: >> =C2=A0=C2=A0 1. Consolidate all previous incremental updates to >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 LastAttemptStatus.h into one patch (patch= 2) >> =C2=A0=C2=A0 2. Move LastAttemptStatus.h from Include to PrivateInclude >> =C2=A0=C2=A0 3. Correct patch 1 subject from "FmpDevicePkg" to "MdePkg" >> >> Cc: Liming Gao >> Cc: Michael D Kinney >> Cc: Guomin Jiang >> Cc: Wei6 Xu >> Cc: Zhiguang Liu >> Signed-off-by: Michael Kubacki >> >> Michael Kubacki (6): >> =C2=A0=C2=A0 MdePkg/SystemResourceTable.h: Add vendor range values >> =C2=A0=C2=A0 FmpDevicePkg: Add Last Attempt Status header files >> =C2=A0=C2=A0 FmpDevicePkg/FmpDxe: Add check image path Last Attempt Stat= us >> =C2=A0=C2=A0=C2=A0=C2=A0 capability >> =C2=A0=C2=A0 FmpDevicePkg/FmpDxe: Improve set image path Last Attempt St= atus >> =C2=A0=C2=A0=C2=A0=C2=A0 granularity >> =C2=A0=C2=A0 FmpDevicePkg: Add Last Attempt Status support to dependency= libs >> =C2=A0=C2=A0 FmpDevicePkg/FmpDeviceLib: Add Last Attempt Status to Check= /Set API >> >> =20 >> FmpDevicePkg/FmpDxe/FmpDxe.c = =20 >> | 146 +++++++++++++++++--- >> =20 >> FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.c = =20 >> |=C2=A0 39 ++++-- >> =20 >> FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull= .c =20 >> |=C2=A0 14 +- >> =20 >> FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c = =20 >> |=C2=A0 93 +++++++++++-- >> =20 >> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c = =20 >> | 132 +++++++++++++++++- >> =20 >> FmpDevicePkg/Test/UnitTest/Library/FmpDependencyLib/EvaluateDependencyUn= itTest.c=20 >> |=C2=A0=C2=A0 7 +- >> =20 >> FmpDevicePkg/FmpDxe/FmpDxe.h = =20 >> |=C2=A0=C2=A0 4 +- >> =20 >> FmpDevicePkg/Include/LastAttemptStatus.h = =20 >> |=C2=A0 81 +++++++++++ >> =20 >> FmpDevicePkg/Include/Library/FmpDependencyCheckLib.h = =20 >> |=C2=A0=C2=A0 8 +- >> =20 >> FmpDevicePkg/Include/Library/FmpDependencyLib.h = =20 >> |=C2=A0 44 ++++-- >> =20 >> FmpDevicePkg/Include/Library/FmpDeviceLib.h = =20 >> | 121 +++++++++++++++- >> =20 >> FmpDevicePkg/PrivateInclude/FmpLastAttemptStatus.h = =20 >> |=C2=A0 81 +++++++++++ >> =20 >> MdePkg/Include/Guid/SystemResourceTable.h = =20 >> |=C2=A0 13 ++ >> =C2=A0 13 files changed, 718 insertions(+), 65 deletions(-) >> =C2=A0 create mode 100644 FmpDevicePkg/Include/LastAttemptStatus.h >> =C2=A0 create mode 100644 FmpDevicePkg/PrivateInclude/FmpLastAttemptStat= us.h >>