From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.10968.1593093124267868068 for ; Thu, 25 Jun 2020 06:52:04 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ard.biesheuvel@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1B253C0A; Thu, 25 Jun 2020 06:52:03 -0700 (PDT) Received: from [192.168.1.69] (unknown [10.37.8.29]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DC3223F73C; Thu, 25 Jun 2020 06:52:00 -0700 (PDT) Subject: Re: [PATCH v3 08/15] MdeModulePkg: Fix constructor invocation ordering To: Sami Mujawar , devel@edk2.groups.io Cc: leif@nuviainc.com, lersek@redhat.com, jian.j.wang@intel.com, hao.a.wu@intel.com, Alexandru.Elisei@arm.com, Andre.Przywara@arm.com, Matteo.Carlini@arm.com, Laura.Moretta@arm.com, nd@arm.com References: <20200624133458.61920-1-sami.mujawar@arm.com> <20200624133458.61920-9-sami.mujawar@arm.com> From: "Ard Biesheuvel" Message-ID: <333ca5d4-2959-4ebe-54df-c0f36f60f8b0@arm.com> Date: Thu, 25 Jun 2020 15:51:59 +0200 User-Agent: Mozilla/5.0 (X11; Linux aarch64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <20200624133458.61920-9-sami.mujawar@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit On 6/24/20 3:34 PM, Sami Mujawar wrote: > The BaseSerialPortLib16550 library does not implement > a constructor. This prevents the correct constructor > invocation order for dependent libraries. > e.g. A PlatformHookLib (for the Serial Port) may have > a dependency on retrieving data from a Hob. A Hob > library implementation may configure its initial state > in the HobLib constructor. Since BaseSerialPortLib16550 > does not implement a constructor, the Basetools do not > resolve the correct order for constructor invocation. > > To fix this, add an empty constructor to the serial port > library BaseSerialPortLib16550. > > Signed-off-by: Sami Mujawar Acked-by: Ard Biesheuvel Note to maintainers: this works around a long standing BaseTools bug where constructor dependencies do not propagate through a library that lacks a constructor. For instance, in the following case LibA depends on LibB depends on LibC the constructors are *only* guaranteed to be invoked in the correct order (LibC, then LibB, then LibA) if LibB has a constructor in the first place, otherwise, the remaining constructors for LibA and LibC could be emitted in any order. > --- > MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c | 17 +++++++++++++++++ > MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf | 3 +++ > 2 files changed, 20 insertions(+) > > diff --git a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c > index 9cb50dd80d5634ab2aa6d68bf5ca7fb891463eef..0fd1382ee83c9de09d8250830bd9569056fcee2f 100644 > --- a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c > +++ b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c > @@ -4,6 +4,7 @@ > (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
> Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
> Copyright (c) 2018, AMD Incorporated. All rights reserved.
> + Copyright (c) 2020, ARM Limited. All rights reserved. > > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -1102,3 +1103,19 @@ SerialPortSetAttributes ( > return RETURN_SUCCESS; > } > > +/** Base Serial Port 16550 Library Constructor > + > + @retval RETURN_SUCCESS Success. > +*/ > +EFI_STATUS > +EFIAPI > +BaseSerialPortLib16550 ( > + VOID > + ) > +{ > + // Nothing to do here. This constructor is added to > + // enable the chain of constructor invocation for > + // dependent libraries. > + return RETURN_SUCCESS; > +} > + > diff --git a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf > index 8b4ae3f1d4ee1e2e9a8b81eab4c900541ce8cfb6..92b7a8b7896a305d2ce22589f8a9593618d37bb7 100644 > --- a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf > +++ b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf > @@ -2,6 +2,8 @@ > # SerialPortLib instance for 16550 UART. > # > # Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
> +# Copyright (c) 2020, ARM Limited. All rights reserved. > +# > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > @@ -14,6 +16,7 @@ [Defines] > MODULE_TYPE = BASE > VERSION_STRING = 1.1 > LIBRARY_CLASS = SerialPortLib > + CONSTRUCTOR = BaseSerialPortLib16550 > > [Packages] > MdePkg/MdePkg.dec >