Ming, Sorry for previous comment. Although build supports it, the spec doesn't allow such usage. Please revert to v4. Please keep R-B for v4.
Regards, Jian > -----Original Message----- > From: Kinney, Michael D <michael.d.kin...@intel.com> > Sent: Thursday, June 18, 2020 9:47 AM > To: Wang, Jian J <jian.j.w...@intel.com>; devel@edk2.groups.io; Tan, Ming > <ming....@intel.com>; Kinney, Michael D <michael.d.kin...@intel.com> > Cc: Wu, Hao A <hao.a...@intel.com> > Subject: RE: [edk2-devel] [PATCH v5 1/1] MdeModulePkg.dec: Change PCDs for > status code. > > Jian, > > There are few rules listed in the EDK II DEC File Format > Specification that apply here: > > https://edk2-docs.gitbook.io/edk-ii-dec- > specification/3_edk_ii_dec_file_format/310_pcd_sections > > * PCD entries may be put into any or all PCD section types > except PcdsFeatureFlag sections. > > * PCDs listed in PcdsFeatureFlag sections must only be listed > in PcdsFeatureFlag sections. > > * The PcdsFeatureFlag PcdType may not be mixed with any > other PcdType elements in the section header. The following > example is NOT VALID: > > [PcdsFeatureFlag.IA32, PcdsFixedAtBuild.IA32] > > Best regards, > > Mike > > > -----Original Message----- > > From: Wang, Jian J <jian.j.w...@intel.com> > > Sent: Wednesday, June 17, 2020 5:58 PM > > To: Kinney, Michael D <michael.d.kin...@intel.com>; > > devel@edk2.groups.io; Tan, Ming <ming....@intel.com> > > Cc: Wu, Hao A <hao.a...@intel.com> > > Subject: RE: [edk2-devel] [PATCH v5 1/1] > > MdeModulePkg.dec: Change PCDs for status code. > > > > Mike, > > > > I tried to build it. There's no warnings. And it's free > > to change type to any of them. > > Why's there such limitation? FeatureFlag looks the same > > as FixedAtBuild to me. > > > > Regards, > > Jian > > > > > -----Original Message----- > > > From: Kinney, Michael D <michael.d.kin...@intel.com> > > > Sent: Thursday, June 18, 2020 12:47 AM > > > To: devel@edk2.groups.io; Wang, Jian J > > <jian.j.w...@intel.com>; Tan, Ming > > > <ming....@intel.com>; Kinney, Michael D > > <michael.d.kin...@intel.com> > > > Cc: Wu, Hao A <hao.a...@intel.com> > > > Subject: RE: [edk2-devel] [PATCH v5 1/1] > > MdeModulePkg.dec: Change PCDs for > > > status code. > > > > > > Ming, > > > > > > With this change, are the same PCDs listed as both > > > a Feature Flag PCD and a non-Feature Flag PCD? > > > > > > That should not be allowed, and if that passes the > > > build, then the build tools should flag that as an > > > error condition. > > > > > > Mike > > > > > > > -----Original Message----- > > > > From: devel@edk2.groups.io <devel@edk2.groups.io> On > > > > Behalf Of Wang, Jian J > > > > Sent: Wednesday, June 17, 2020 7:43 AM > > > > To: Tan, Ming <ming....@intel.com>; > > devel@edk2.groups.io > > > > Cc: Wu, Hao A <hao.a...@intel.com> > > > > Subject: Re: [edk2-devel] [PATCH v5 1/1] > > > > MdeModulePkg.dec: Change PCDs for status code. > > > > > > > > Reviewed-by: Jian J Wang <jian.j.w...@intel.com> > > > > > > > > Regards, > > > > Jian > > > > > > > > > -----Original Message----- > > > > > From: Tan, Ming <ming....@intel.com> > > > > > Sent: Wednesday, June 17, 2020 3:36 PM > > > > > To: devel@edk2.groups.io > > > > > Cc: Wang, Jian J <jian.j.w...@intel.com>; Wu, Hao > > A > > > > <hao.a...@intel.com> > > > > > Subject: [PATCH v5 1/1] MdeModulePkg.dec: Change > > PCDs > > > > for status code. > > > > > > > > > > REF: > > > > https://bugzilla.tianocore.org/show_bug.cgi?id=2786 > > > > > > > > > > In order to support enable/disable report status > > code > > > > through memory > > > > > or serial dynamic, change the following PCDs from > > > > [PcdsFeatureFlag] to > > > > > [PcdsFixedAtBuild, PcdsPatchableInModule, > > PcdsDynamic, > > > > PcdsDynamicEx]: > > > > > PcdStatusCodeUseSerial > > > > > PcdStatusCodeUseMemory > > > > > The original plaforms can use PcdsFixedAtBuild in > > .dsc > > > > files to save size. > > > > > Currently do not remove the old pcd type to keep > > > > compatible. > > > > > > > > > > Cc: Jian J Wang <jian.j.w...@intel.com> > > > > > Cc: Hao A Wu <hao.a...@intel.com> > > > > > Signed-off-by: Ming Tan <ming....@intel.com> > > > > > --- > > > > > V5: Do not remove th old pcd type to keep > > compatible, > > > > and change to > > > > > standalone patch. > > > > > V4: No change for this 1/4 patch, just modify the > > 2- > > > > 4/4 patchs. > > > > > V3: Split one patch to several patchs, each Pkg > > has > > > > one patch. > > > > > V2: Change the new type from [PcdsDynamic] to > > > > [PcdsFixedAtBuild, > > > > > PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] > > > > > And set to PcdsFixedAtBuild in the original > > > > platform .dsc files. > > > > > > > > > > MdeModulePkg/MdeModulePkg.dec > > | 13 > > > > +++++++++++++ > > > > > .../StatusCodeHandler/Pei/StatusCodeHandlerPei.c > > | 6 > > > > +++--- > > > > > .../Pei/StatusCodeHandlerPei.inf > > | 6 > > > > ++---- > > > > > .../RuntimeDxe/StatusCodeHandlerRuntimeDxe.c > > | 16 > > > > ++++++++-------- > > > > > .../RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf > > | 6 > > > > ++---- > > > > > .../StatusCodeHandler/Smm/StatusCodeHandlerSmm.c > > | 10 > > > > +++++----- > > > > > .../Smm/StatusCodeHandlerSmm.inf > > | 6 > > > > ++---- > > > > > 7 files changed, 35 insertions(+), 28 deletions(- > > ) > > > > > > > > > > diff --git a/MdeModulePkg/MdeModulePkg.dec > > > > > b/MdeModulePkg/MdeModulePkg.dec > > > > > index 4f44af694862..bd369d1f230e 100644 > > > > > --- a/MdeModulePkg/MdeModulePkg.dec > > > > > +++ b/MdeModulePkg/MdeModulePkg.dec > > > > > @@ -2001,6 +2001,19 @@ [PcdsFixedAtBuild, > > > > PcdsPatchableInModule, > > > > > PcdsDynamic, PcdsDynamicEx] > > > > > # @Prompt TCG Platform Firmware Profile > > revision. > > > > > > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdTcgPfpMeasurementRevis > > > > ion|0|UINT3 > > > > > 2|0x00010077 > > > > > > > > > > + ## Indicates if StatusCode is reported via > > Serial > > > > port.<BR><BR> > > > > > + # TRUE - Reports StatusCode via Serial > > port.<BR> > > > > > + # FALSE - Does not report StatusCode via > > Serial > > > > port.<BR> > > > > > + # @Prompt Enable StatusCode via Serial port. > > > > > + > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|TR > > > > UE|BOOLEAN| > > > > > 0x00010022 > > > > > + > > > > > + ## Indicates if StatusCode is stored in memory. > > > > > + # The memory is boot time memory in PEI Phase > > and > > > > is runtime memory in > > > > > DXE Phase.<BR><BR> > > > > > + # TRUE - Stores StatusCode in memory.<BR> > > > > > + # FALSE - Does not store StatusCode in > > > > memory.<BR> > > > > > + # @Prompt Enable StatusCode via memory. > > > > > + > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FA > > > > LSE|BOOLEA > > > > > N|0x00010023 > > > > > + > > > > > [PcdsPatchableInModule] > > > > > ## Specify memory size with page number for PEI > > > > code when > > > > > # Loading Module at Fixed Address feature is > > > > enabled. > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.c > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.c > > > > > index 1b07f92f3ce8..9b2ea4ee84d9 100644 > > > > > --- > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.c > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.c > > > > > @@ -2,7 +2,7 @@ > > > > > Report Status Code Handler PEIM which produces > > > > general handlers and hook > > > > > them > > > > > onto the PEI status code router. > > > > > > > > > > - Copyright (c) 2009 - 2018, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > + Copyright (c) 2009 - 2020, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > **/ > > > > > @@ -45,13 +45,13 @@ StatusCodeHandlerPeiEntry ( > > > > > // If enable UseSerial, then initialize serial > > > > port. > > > > > // if enable UseMemory, then initialize memory > > > > status code worker. > > > > > // > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > Status = SerialPortInitialize(); > > > > > ASSERT_EFI_ERROR (Status); > > > > > Status = RscHandlerPpi->Register > > > > (SerialStatusCodeReportWorker); > > > > > ASSERT_EFI_ERROR (Status); > > > > > } > > > > > - if (FeaturePcdGet (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) { > > > > > Status = MemoryStatusCodeInitializeWorker (); > > > > > ASSERT_EFI_ERROR (Status); > > > > > Status = RscHandlerPpi->Register > > > > (MemoryStatusCodeReportWorker); > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.inf > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.inf > > > > > index 8aef9af34a05..64380ddfaccc 100644 > > > > > --- > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.inf > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCod > > > > eHandlerPei.inf > > > > > @@ -53,11 +53,9 @@ [Guids] > > > > > [Ppis] > > > > > gEfiPeiRscHandlerPpiGuid > > ## > > > > CONSUMES > > > > > > > > > > -[FeaturePcd] > > > > > - > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > - > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial ## > > > > CONSUMES > > > > > - > > > > > [Pcd] > > > > > + > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial ## > > > > CONSUMES > > > > > + > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|1 > > > > |gEfiMdeMod > > > > > ulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > SOMETIMES_CONSUMES > > > > > > > > > > [Depex] > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.c > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.c > > > > > index 79cc48fa55a4..a8c0fe5b7149 100644 > > > > > --- > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.c > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.c > > > > > @@ -2,7 +2,7 @@ > > > > > Status Code Handler Driver which produces > > general > > > > handlers and hook them > > > > > onto the DXE status code router. > > > > > > > > > > - Copyright (c) 2006 - 2019, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > + Copyright (c) 2006 - 2020, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > **/ > > > > > @@ -29,7 +29,7 @@ UnregisterBootTimeHandlers ( > > > > > IN VOID *Context > > > > > ) > > > > > { > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > mRscHandlerProtocol->Unregister > > > > (SerialStatusCodeReportWorker); > > > > > } > > > > > } > > > > > @@ -80,14 +80,14 @@ InitializationDispatcherWorker > > ( > > > > > // If enable UseSerial, then initialize serial > > > > port. > > > > > // if enable UseRuntimeMemory, then initialize > > > > runtime memory status code > > > > > worker. > > > > > // > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > // > > > > > // Call Serial Port Lib API to initialize > > serial > > > > port. > > > > > // > > > > > Status = SerialPortInitialize (); > > > > > ASSERT_EFI_ERROR (Status); > > > > > } > > > > > - if (FeaturePcdGet (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) { > > > > > Status = RtMemoryStatusCodeInitializeWorker > > (); > > > > > ASSERT_EFI_ERROR (Status); > > > > > } > > > > > @@ -115,7 +115,7 @@ InitializationDispatcherWorker > > ( > > > > > // > > > > > // Dispatch records to devices based on > > > > feature flag. > > > > > // > > > > > - if (FeaturePcdGet > > (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) > > { > > > > > SerialStatusCodeReportWorker ( > > > > > Record[Index].CodeType, > > > > > Record[Index].Value, > > > > > @@ -124,7 +124,7 @@ InitializationDispatcherWorker > > ( > > > > > NULL > > > > > ); > > > > > } > > > > > - if (FeaturePcdGet > > (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) > > { > > > > > RtMemoryStatusCodeReportWorker ( > > > > > Record[Index].CodeType, > > > > > Record[Index].Value, > > > > > @@ -171,10 +171,10 @@ > > StatusCodeHandlerRuntimeDxeEntry > > > > ( > > > > > // > > > > > InitializationDispatcherWorker (); > > > > > > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > mRscHandlerProtocol->Register > > > > (SerialStatusCodeReportWorker, > > > > > TPL_HIGH_LEVEL); > > > > > } > > > > > - if (FeaturePcdGet (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) { > > > > > mRscHandlerProtocol->Register > > > > (RtMemoryStatusCodeReportWorker, > > > > > TPL_HIGH_LEVEL); > > > > > } > > > > > > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.inf > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.inf > > > > > index d74c2a55dcaf..faadfd9578fe 100644 > > > > > --- > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.inf > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/St > > > > atusCodeHandl > > > > > erRuntimeDxe.inf > > > > > @@ -58,12 +58,10 @@ [Guids] > > > > > [Protocols] > > > > > gEfiRscHandlerProtocolGuid > > ## > > > > CONSUMES > > > > > > > > > > -[FeaturePcd] > > > > > +[Pcd] > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeReplayIn > > ## > > > > CONSUMES > > > > > - > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial ## > > > > CONSUMES > > > > > - > > > > > -[Pcd] > > > > > + > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize > > > > |128| > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory > > > > ## > > > > > SOMETIMES_CONSUMES > > > > > > > > > > [Depex] > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm. > > > > > c > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm. > > > > > c > > > > > index f54991ed3f67..20271571ded4 100644 > > > > > --- > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm. > > > > > c > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm. > > > > > c > > > > > @@ -2,7 +2,7 @@ > > > > > Status Code Handler Driver which produces > > general > > > > handlers and hook them > > > > > onto the SMM status code router. > > > > > > > > > > - Copyright (c) 2009 - 2018, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > + Copyright (c) 2009 - 2020, Intel Corporation. > > All > > > > rights reserved.<BR> > > > > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > > > > > > > **/ > > > > > @@ -28,14 +28,14 @@ InitializationDispatcherWorker > > ( > > > > > // If enable UseSerial, then initialize serial > > > > port. > > > > > // if enable UseRuntimeMemory, then initialize > > > > runtime memory status code > > > > > worker. > > > > > // > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > // > > > > > // Call Serial Port Lib API to initialize > > serial > > > > port. > > > > > // > > > > > Status = SerialPortInitialize (); > > > > > ASSERT_EFI_ERROR (Status); > > > > > } > > > > > - if (FeaturePcdGet (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) { > > > > > Status = MemoryStatusCodeInitializeWorker (); > > > > > ASSERT_EFI_ERROR (Status); > > > > > } > > > > > @@ -73,10 +73,10 @@ StatusCodeHandlerSmmEntry ( > > > > > // > > > > > InitializationDispatcherWorker (); > > > > > > > > > > - if (FeaturePcdGet (PcdStatusCodeUseSerial)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseSerial)) { > > > > > mRscHandlerProtocol->Register > > > > (SerialStatusCodeReportWorker); > > > > > } > > > > > - if (FeaturePcdGet (PcdStatusCodeUseMemory)) { > > > > > + if (PcdGetBool (PcdStatusCodeUseMemory)) { > > > > > mRscHandlerProtocol->Register > > > > (MemoryStatusCodeReportWorker); > > > > > } > > > > > > > > > > diff --git > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm.i > > > > > nf > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm.i > > > > > nf > > > > > index 47d0545f9591..4e24d87e55d1 100644 > > > > > --- > > > > > > > > > > > a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm.i > > > > > nf > > > > > +++ > > > > > > > > > > > b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCod > > > > eHandlerSmm.i > > > > > nf > > > > > @@ -53,11 +53,9 @@ [Guids] > > > > > [Protocols] > > > > > gEfiSmmRscHandlerProtocolGuid > > ## > > > > CONSUMES > > > > > > > > > > -[FeaturePcd] > > > > > - > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > - > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial ## > > > > CONSUMES > > > > > - > > > > > [Pcd] > > > > > + > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial ## > > > > CONSUMES > > > > > + > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory ## > > > > > CONSUMES > > > > > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize > > > > |128| > > > > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory > > > > ## > > > > > SOMETIMES_CONSUMES > > > > > > > > > > [Depex] > > > > > -- > > > > > 2.24.0.windows.2 > > > > > > > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#61459): https://edk2.groups.io/g/devel/message/61459 Mute This Topic: https://groups.io/mt/74933183/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-