From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4001:c0b::22f; helo=mail-it0-x22f.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-it0-x22f.google.com (mail-it0-x22f.google.com [IPv6:2607:f8b0:4001:c0b::22f]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 99D88226FAA9E for ; Fri, 6 Apr 2018 06:55:28 -0700 (PDT) Received: by mail-it0-x22f.google.com with SMTP id f6-v6so2044908ita.2 for ; Fri, 06 Apr 2018 06:55:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=5H/+p1TvdrpFh+5kdmxFNtiYFYOy7yVNLJ8t9F6BT8o=; b=eFIOYw6Y9gpJ0iaEWdQIGPBTgotjxvES7HnKLgWsaT/b7Pqx+7Yw20mnnt5Lloq8v6 45fumfmT6iW4qDCXPZU050IU57fDsObHili3ZO7UaGwIYOfBkwS7ThN56M+hA7XS8adE /GbPtpFmruugl4g7EX+lkFH/xR961tyiWpvS4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=5H/+p1TvdrpFh+5kdmxFNtiYFYOy7yVNLJ8t9F6BT8o=; b=IQMnXkLya3aRot88uwARQu0jfzwU4xjUBm9iNQ5YlKvDhbZYv+6uoH3X3DR0AN8lJq nkuDMKgBh6YjI1Wt65SuMLZp/UGleiP6ZRPp3z2CWIHUs5y6/Jzdu6ehGzdiPI3vNx+R oW3YVpYs/h7ItTn7XhTGvpB5m8omHgy0IZhCjbeYuJmyXKN0SWo2otvuh8dNjONTS6D4 1RGlaEl1cMgyI9IEVKww80hmubVNpCSAGM0UE8+eFpoOYMLrQlQyUIz4vaPhhnD4QCv0 zkvzlEIaxozcZP4nu+yxA7hpF2unT8NTeEmB1OqVKRFj9z5ywTEw4GAh6byj7Bk3hA9W FP/Q== X-Gm-Message-State: ALQs6tAqkVPY9iClAwK2rcgvMdsfp1bKfCmlO9v26qGP6egwxfvmmA3j bP9w/HFnbYsKOD86snwyrt6cFDSNcldb9oxm4Aya/g== X-Google-Smtp-Source: AIpwx4/Np8FY6jkvjPWql+rHYDzyOrKH3vBcqZfcCU2olMWME+hN3aB2jD1MZmMq1B7pBK9twgi8UHqNruHfUHEUbA4= X-Received: by 2002:a24:2b0b:: with SMTP id h11-v6mr18110848ita.68.1523022926957; Fri, 06 Apr 2018 06:55:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.187.67 with HTTP; Fri, 6 Apr 2018 06:55:26 -0700 (PDT) In-Reply-To: <20180404202554.9568-10-michael.d.kinney@intel.com> References: <20180404202554.9568-1-michael.d.kinney@intel.com> <20180404202554.9568-10-michael.d.kinney@intel.com> From: Ard Biesheuvel Date: Fri, 6 Apr 2018 15:55:26 +0200 Message-ID: To: Michael D Kinney Cc: "edk2-devel@lists.01.org" , Jiewen Yao Subject: Re: [Patch 9/9] SignedCapsulePkg/SystemFirmwareUpdateDxe: Use progress API X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Apr 2018 13:55:28 -0000 Content-Type: text/plain; charset="UTF-8" On 4 April 2018 at 22:25, Michael D Kinney wrote: > From: "Kinney, Michael D" > > https://bugzilla.tianocore.org/show_bug.cgi?id=801 > > Use PlatformFlashWriteWithProgress() instead of PlatformFLashWrite() > so the user can be informed of the progress as a capsule is used > to update a firmware image in a firmware device. > > Cc: Jiewen Yao > Signed-off-by: Michael D Kinney > Contributed-under: TianoCore Contribution Agreement 1.1 Doesn't this break existing platforms that do not implement this in their PlatformFlashAccessLib? > --- > .../SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c | 92 ++++++++++++++++------ > 1 file changed, 68 insertions(+), 24 deletions(-) > > diff --git a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c > index fd6641eb3e..8d2e0df81c 100644 > --- a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c > +++ b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c > @@ -8,7 +8,7 @@ > > FmpSetImage() will receive untrusted input and do basic validation. > > - Copyright (c) 2016, Intel Corporation. All rights reserved.
> + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD License > which accompanies this distribution. The full text of the license may be found at > @@ -65,11 +65,14 @@ ParseUpdateDataFile ( > **/ > EFI_STATUS > PerformUpdate ( > - IN VOID *SystemFirmwareImage, > - IN UINTN SystemFirmwareImageSize, > - IN UPDATE_CONFIG_DATA *ConfigData, > - OUT UINT32 *LastAttemptVersion, > - OUT UINT32 *LastAttemptStatus > + IN VOID *SystemFirmwareImage, > + IN UINTN SystemFirmwareImageSize, > + IN UPDATE_CONFIG_DATA *ConfigData, > + OUT UINT32 *LastAttemptVersion, > + OUT UINT32 *LastAttemptStatus, > + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, > + IN UINTN StartPercentage, > + IN UINTN EndPercentage > ) > { > EFI_STATUS Status; > @@ -78,12 +81,15 @@ PerformUpdate ( > DEBUG((DEBUG_INFO, " BaseAddress - 0x%lx,", ConfigData->BaseAddress)); > DEBUG((DEBUG_INFO, " ImageOffset - 0x%x,", ConfigData->ImageOffset)); > DEBUG((DEBUG_INFO, " Legnth - 0x%x\n", ConfigData->Length)); > - Status = PerformFlashWrite ( > + Status = PerformFlashWriteWithProgress ( > ConfigData->FirmwareType, > ConfigData->BaseAddress, > ConfigData->AddressType, > (VOID *)((UINTN)SystemFirmwareImage + (UINTN)ConfigData->ImageOffset), > - ConfigData->Length > + ConfigData->Length, > + Progress, > + StartPercentage, > + EndPercentage > ); > if (!EFI_ERROR(Status)) { > *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; > @@ -111,12 +117,13 @@ PerformUpdate ( > **/ > EFI_STATUS > UpdateImage ( > - IN VOID *SystemFirmwareImage, > - IN UINTN SystemFirmwareImageSize, > - IN VOID *ConfigImage, > - IN UINTN ConfigImageSize, > - OUT UINT32 *LastAttemptVersion, > - OUT UINT32 *LastAttemptStatus > + IN VOID *SystemFirmwareImage, > + IN UINTN SystemFirmwareImageSize, > + IN VOID *ConfigImage, > + IN UINTN ConfigImageSize, > + OUT UINT32 *LastAttemptVersion, > + OUT UINT32 *LastAttemptStatus, > + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress > ) > { > EFI_STATUS Status; > @@ -124,19 +131,34 @@ UpdateImage ( > UPDATE_CONFIG_DATA *UpdateConfigData; > CONFIG_HEADER ConfigHeader; > UINTN Index; > + UINTN TotalSize; > + UINTN BytesWritten; > + UINTN StartPercentage; > + UINTN EndPercentage; > > if (ConfigImage == NULL) { > DEBUG((DEBUG_INFO, "PlatformUpdate (NoConfig):")); > DEBUG((DEBUG_INFO, " BaseAddress - 0x%x,", 0)); > DEBUG((DEBUG_INFO, " Length - 0x%x\n", SystemFirmwareImageSize)); > // ASSUME the whole System Firmware include NVRAM region. > - Status = PerformFlashWrite ( > + StartPercentage = 0; > + EndPercentage = 100; > + if (Progress != NULL) { > + Progress (StartPercentage); > + } > + Status = PerformFlashWriteWithProgress ( > PlatformFirmwareTypeNvRam, > 0, > FlashAddressTypeRelativeAddress, > SystemFirmwareImage, > - SystemFirmwareImageSize > + SystemFirmwareImageSize, > + Progress, > + StartPercentage, > + EndPercentage > ); > + if (Progress != NULL) { > + Progress (EndPercentage); > + } > if (!EFI_ERROR(Status)) { > *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; > mNvRamUpdated = TRUE; > @@ -163,18 +185,37 @@ UpdateImage ( > DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates)); > DEBUG((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))); > > + TotalSize = 0; > + for (Index = 0; Index < ConfigHeader.NumOfUpdates; Index++) { > + if (CompareGuid(&ConfigData[Index].FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { > + TotalSize = TotalSize + ConfigData[Index].Length; > + } > + } > + > + BytesWritten = 0; > Index = 0; > UpdateConfigData = ConfigData; > while (Index < ConfigHeader.NumOfUpdates) { > if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { > DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid)); > + StartPercentage = (BytesWritten * 100) / TotalSize; > + EndPercentage = ((BytesWritten + UpdateConfigData->Length) * 100) / TotalSize; > + if (Progress != NULL) { > + Progress (StartPercentage); > + } > Status = PerformUpdate ( > SystemFirmwareImage, > SystemFirmwareImageSize, > UpdateConfigData, > LastAttemptVersion, > - LastAttemptStatus > + LastAttemptStatus, > + Progress, > + StartPercentage, > + EndPercentage > ); > + if (Progress != NULL) { > + Progress (EndPercentage); > + } > // > // Shall updates be serialized so that if an update is not successfully completed, > // the remaining updates won't be performed. > @@ -186,6 +227,8 @@ UpdateImage ( > DEBUG((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->FileGuid)); > } > > + BytesWritten += UpdateConfigData->Length; > + > Index++; > UpdateConfigData++; > } > @@ -209,10 +252,11 @@ UpdateImage ( > **/ > EFI_STATUS > SystemFirmwareAuthenticatedUpdate ( > - IN VOID *Image, > - IN UINTN ImageSize, > - OUT UINT32 *LastAttemptVersion, > - OUT UINT32 *LastAttemptStatus > + IN VOID *Image, > + IN UINTN ImageSize, > + OUT UINT32 *LastAttemptVersion, > + OUT UINT32 *LastAttemptStatus, > + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress > ) > { > EFI_STATUS Status; > @@ -240,7 +284,7 @@ SystemFirmwareAuthenticatedUpdate ( > ExtractConfigImage(AuthenticatedImage, AuthenticatedImageSize, &ConfigImage, &ConfigImageSize); > > DEBUG((DEBUG_INFO, "UpdateImage ...\n")); > - Status = UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus); > + Status = UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus, Progress); > if (EFI_ERROR(Status)) { > DEBUG((DEBUG_INFO, "UpdateImage - %r\n", Status)); > return Status; > @@ -442,8 +486,8 @@ FmpSetImage ( > return EFI_INVALID_PARAMETER; > } > > - Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus); > - DEBUG((DEBUG_INFO, "SetImage - LastAttemp Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus)); > + Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus, Progress); > + DEBUG((DEBUG_INFO, "SetImage - LastAttempt Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus)); > > // > // If NVRAM is updated, we should no longer touch variable services, because > -- > 2.14.2.windows.3 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel