From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 2182F21C943C4 for ; Thu, 29 Jun 2017 18:25:33 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jun 2017 18:27:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,283,1496127600"; d="scan'208";a="873272601" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by FMSMGA003.fm.intel.com with ESMTP; 29 Jun 2017 18:27:05 -0700 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 29 Jun 2017 18:27:05 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 29 Jun 2017 18:27:05 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.151]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.56]) with mapi id 14.03.0319.002; Fri, 30 Jun 2017 09:27:01 +0800 From: "Ni, Ruiyu" To: "Zeng, Star" , "edk2-devel@lists.01.org" Thread-Topic: [PATCH 3/3] MdeModulePkg/ResetSystem: Implement ResetNotification protocol Thread-Index: AQHS8ORB1+Pj/gUDC0CMibWm0HnI8KI8nc6A Date: Fri, 30 Jun 2017 01:27:00 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5B9A8773@SHSMSX104.ccr.corp.intel.com> References: <20170629083221.485184-1-ruiyu.ni@intel.com> <20170629083221.485184-4-ruiyu.ni@intel.com> <0C09AFA07DD0434D9E2A0C6AEB0483103B8F0008@shsmsx102.ccr.corp.intel.com> In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103B8F0008@shsmsx102.ccr.corp.intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMGI1YmNkZjMtM2M4Zi00ZmI5LThlM2MtZTE2MjMzNGI4N2FmIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX1BVQkxJQyJ9XX1dfSwiU3ViamVjdExhYmVscyI6W10sIlRNQ1ZlcnNpb24iOiIxNi41LjkuMyIsIlRydXN0ZWRMYWJlbEhhc2giOiJMVHNcL1NiUE42bGpIM3ZrT011dHJ6K1RxOFhIcmtWRVFYc1ZjWnA0clJHbz0ifQ== x-ctpclassification: CTP_PUBLIC dlp-product: dlpe-windows dlp-version: 10.0.102.7 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH 3/3] MdeModulePkg/ResetSystem: Implement ResetNotification protocol X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Jun 2017 01:25:33 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I fully agree. Sorry I missed that part. I will update all of them before checking the code in. Regards, Ray >-----Original Message----- >From: Zeng, Star >Sent: Thursday, June 29, 2017 10:30 PM >To: Ni, Ruiyu ; edk2-devel@lists.01.org >Cc: Zeng, Star >Subject: RE: [PATCH 3/3] MdeModulePkg/ResetSystem: Implement ResetNotifica= tion protocol > >How about to also update the description in ResetSystemRuntimeDxe.inf/Rese= tSystem.c/ResetSystemRuntimeDxe.uni? :) >For example in *.inf: ># This driver implements Reset Architectural Protocol. >-> ># This driver implements Reset Architectural and Notification Protocol. > >With that update, Reviewed-by: Star Zeng > >Thanks, >Star >-----Original Message----- >From: Ni, Ruiyu >Sent: Thursday, June 29, 2017 4:32 PM >To: edk2-devel@lists.01.org >Cc: Zeng, Star >Subject: [PATCH 3/3] MdeModulePkg/ResetSystem: Implement ResetNotification= protocol > >Contributed-under: TianoCore Contribution Agreement 1.0 >Signed-off-by: Ruiyu Ni >Cc: Star Zeng >--- > .../Universal/ResetSystemRuntimeDxe/ResetSystem.c | 137 >++++++++++++++++++++- .../Universal/ResetSystemRuntimeDxe/ResetSystem.h = | 21 +++- > .../ResetSystemRuntimeDxe.inf | 5 +- > 3 files changed, 155 insertions(+), 8 deletions(-) > >diff --git a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.c >b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.c >index 64f2da5ce9..36c3238301 100644 >--- a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.c >+++ b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.c >@@ -16,6 +16,121 @@ > #include "ResetSystem.h" > > /** >+ Register a notification function to be called when ResetSystem() is cal= led. >+ >+ The RegisterResetNotify() function registers a notification function >+ that is called when ResetSystem()is called and prior to completing the = reset of the platform. >+ The registered functions must not perform a platform reset >+ themselves. These notifications are intended only for the >+ notification of components which may need some special-purpose maintena= nce prior to the platform resetting. >+ The list of registered reset notification functions are processed if >+ ResetSystem()is called before ExitBootServices(). The list of >+ registered reset notification functions is ignored if ResetSystem()is c= alled after ExitBootServices(). >+ >+ @param[in] This A pointer to the EFI_RESET_NOTIFICATION_P= ROTOCOL instance. >+ @param[in] ResetFunction Points to the function to be called when = a ResetSystem() is executed. >+ >+ @retval EFI_SUCCESS The reset notification function was succe= ssfully registered. >+ @retval EFI_INVALID_PARAMETER ResetFunction is NULL. >+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available = to register the reset notification function. >+ @retval EFI_ALREADY_STARTED The reset notification function specified= by ResetFunction has already been >registered. >+ >+**/ >+EFI_STATUS >+EFIAPI >+RegisterResetNotify ( >+ IN EFI_RESET_NOTIFICATION_PROTOCOL *This, >+ IN EFI_RESET_SYSTEM ResetFunction >+ ) >+{ >+ RESET_NOTIFICATION_INSTANCE *Instance; >+ LIST_ENTRY *Link; >+ RESET_NOTIFY_ENTRY *Entry; >+ >+ if (ResetFunction =3D=3D NULL) { >+ return EFI_INVALID_PARAMETER; >+ } >+ >+ Instance =3D RESET_NOTIFICATION_INSTANCE_FROM_THIS (This); >+ >+ for ( Link =3D GetFirstNode (&Instance->ResetNotifies) >+ ; !IsNull (&Instance->ResetNotifies, Link) >+ ; Link =3D GetNextNode (&Instance->ResetNotifies, Link) >+ ) { >+ Entry =3D RESET_NOTIFY_ENTRY_FROM_LINK (Link); >+ if (Entry->ResetNotify =3D=3D ResetFunction) { >+ return EFI_ALREADY_STARTED; >+ } >+ } >+ >+ ASSERT (IsNull (&Instance->ResetNotifies, Link)); >+ Entry =3D AllocatePool (sizeof (*Entry)); >+ if (Entry =3D=3D NULL) { >+ return EFI_OUT_OF_RESOURCES; >+ } >+ Entry->Signature =3D RESET_NOTIFY_ENTRY_SIGNATURE; >+ Entry->ResetNotify =3D ResetFunction; >+ InsertTailList (&Instance->ResetNotifies, &Entry->Link); >+ return EFI_SUCCESS; >+} >+ >+/** >+ Unregister a notification function. >+ >+ The UnregisterResetNotify() function removes the previously >+ registered notification using RegisterResetNotify(). >+ >+ @param[in] This A pointer to the EFI_RESET_NOTIFICATION_P= ROTOCOL instance. >+ @param[in] ResetFunction The pointer to the ResetFunction being un= registered. >+ >+ @retval EFI_SUCCESS The reset notification function was unreg= istered. >+ @retval EFI_INVALID_PARAMETER ResetFunction is NULL. >+ @retval EFI_INVALID_PARAMETER The reset notification function specified= by ResetFunction was not previously >+ registered using RegisterResetNotify(). >+ >+**/ >+EFI_STATUS >+EFIAPI >+UnregisterResetNotify ( >+ IN EFI_RESET_NOTIFICATION_PROTOCOL *This, >+ IN EFI_RESET_SYSTEM ResetFunction >+ ) >+{ >+ RESET_NOTIFICATION_INSTANCE *Instance; >+ LIST_ENTRY *Link; >+ RESET_NOTIFY_ENTRY *Entry; >+ >+ if (ResetFunction =3D=3D NULL) { >+ return EFI_INVALID_PARAMETER; >+ } >+ >+ Instance =3D RESET_NOTIFICATION_INSTANCE_FROM_THIS (This); >+ >+ for ( Link =3D GetFirstNode (&Instance->ResetNotifies) >+ ; !IsNull (&Instance->ResetNotifies, Link) >+ ; Link =3D GetNextNode (&Instance->ResetNotifies, Link) >+ ) { >+ Entry =3D RESET_NOTIFY_ENTRY_FROM_LINK (Link); >+ if (Entry->ResetNotify =3D=3D ResetFunction) { >+ RemoveEntryList (&Entry->Link); >+ FreePool (Entry); >+ return EFI_SUCCESS; >+ } >+ } >+ >+ return EFI_INVALID_PARAMETER; >+} >+ >+RESET_NOTIFICATION_INSTANCE mResetNotification =3D { >+ RESET_NOTIFICATION_INSTANCE_SIGNATURE, >+ { >+ RegisterResetNotify, >+ UnregisterResetNotify >+ }, >+ INITIALIZE_LIST_HEAD_VARIABLE (mResetNotification.ResetNotifies) >+}; >+ >+/** > The driver's entry point. > > It initializes the Reset Architectural Protocol. >@@ -53,8 +168,8 @@ InitializeResetSystem ( > Handle =3D NULL; > Status =3D gBS->InstallMultipleProtocolInterfaces ( > &Handle, >- &gEfiResetArchProtocolGuid, >- NULL, >+ &gEfiResetArchProtocolGuid, NULL, >+ &gEfiResetNotificationProtocolGuid, >+ &mResetNotification.ResetNotification, > NULL > ); > ASSERT_EFI_ERROR (Status); >@@ -102,15 +217,27 @@ ResetSystem ( > IN VOID *ResetData OPTIONAL > ) > { >- EFI_STATUS Status; >- UINTN Size; >- UINTN CapsuleDataPtr; >+ EFI_STATUS Status; >+ UINTN Size; >+ UINTN CapsuleDataPtr; >+ LIST_ENTRY *Link; >+ RESET_NOTIFY_ENTRY *Entry; > > // > // Indicate reset system runtime service is called. > // > REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_EFI_RUNTIME_SERVIC= E | >EFI_SW_RS_PC_RESET_SYSTEM)); > >+ if (!EfiAtRuntime ()) { >+ for ( Link =3D GetFirstNode (&mResetNotification.ResetNotifies) >+ ; !IsNull (&mResetNotification.ResetNotifies, Link) >+ ; Link =3D GetNextNode (&mResetNotification.ResetNotifies, Link) >+ ) { >+ Entry =3D RESET_NOTIFY_ENTRY_FROM_LINK (Link); >+ Entry->ResetNotify (ResetType, ResetStatus, DataSize, ResetData); >+ } >+ } >+ > switch (ResetType) { > case EfiResetWarm: > >diff --git a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.h >b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.h >index c3a2a7f127..73e657d4e0 100644 >--- a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.h >+++ b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystem.h >@@ -1,6 +1,6 @@ > /** @file > >- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
>+ Copyright (c) 2006 - 2017, Intel Corporation. All rights >+ reserved.
> > This program and the accompanying materials > are licensed and made available under the terms and conditions of the B= SD License @@ -19,6 +19,7 @@ #include > > > #include >+#include > #include > > #include >@@ -31,6 +32,24 @@ > #include > #include > #include >+#include >+ >+typedef struct { >+ UINT32 Signature; >+ LIST_ENTRY Link; >+ EFI_RESET_SYSTEM ResetNotify; >+} RESET_NOTIFY_ENTRY; >+#define RESET_NOTIFY_ENTRY_SIGNATURE SIGNATURE_32('r', 's', 't', 'n') >+#define RESET_NOTIFY_ENTRY_FROM_LINK(a) CR (a, RESET_NOTIFY_ENTRY, >+Link, RESET_NOTIFY_ENTRY_SIGNATURE) >+ >+typedef struct { >+ UINT32 Signature; >+ EFI_RESET_NOTIFICATION_PROTOCOL ResetNotification; >+ LIST_ENTRY ResetNotifies; >+} RESET_NOTIFICATION_INSTANCE; >+#define RESET_NOTIFICATION_INSTANCE_SIGNATURE SIGNATURE_32('r', 's', '= t', 'i') >+#define RESET_NOTIFICATION_INSTANCE_FROM_THIS(a) \ >+ CR (a, RESET_NOTIFICATION_INSTANCE, ResetNotification, >+RESET_NOTIFICATION_INSTANCE_SIGNATURE) > > /** > The driver's entry point. >diff --git a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRunti= meDxe.inf >b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf >index 7ef52b3283..e63dc4467a 100644 >--- a/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.i= nf >+++ b/MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe >+++ .inf >@@ -1,7 +1,7 @@ > ## @file > # This driver implements Reset Architectural Protocol. > # >-# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
>+# Copyright (c) 2006 - 2017, Intel Corporation. All rights >+reserved.
> # > # This program and the accompanying materials are # licensed and made av= ailable under the terms and conditions of the >BSD License @@ -48,7 +48,7 @@ [LibraryClasses] > DebugLib > BaseLib > ReportStatusCodeLib >- >+ MemoryAllocationLib > > [Guids] > gEfiCapsuleVendorGuid ## SOMETIMES_CONSUMES #= # >Variable:L"CapsuleUpdateData" >@@ -56,6 +56,7 @@ [Guids] > > [Protocols] > gEfiResetArchProtocolGuid ## PRODUCES >+ gEfiResetNotificationProtocolGuid ## PRODUCES > > > [Depex] >-- >2.12.2.windows.2