But that is the line Leif wants to remove... the library from the components 
section.  Looks just like MdePkg to me... what is different?

-Jaben

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Andrew Fish
> Sent: Wednesday, September 05, 2018 11:33 AM
> To: Carsey, Jaben <jaben.car...@intel.com>
> Cc: Ni, Ruiyu <ruiyu...@intel.com>; Heinrich Schuchardt
> <xypron.g...@gmx.de>; edk2-devel@lists.01.org; Alexander Graf
> <ag...@suse.de>; AKASHI Takahiro <takahiro.aka...@linaro.org>; Kinney,
> Michael D <michael.d.kin...@intel.com>; Laszlo Ersek
> <ler...@redhat.com>
> Subject: Re: [edk2] portability of ShellPkg
> Importance: High
> 
> Jaben,
> 
> Sorry to test compile a library just list the library in the [Components] 
> section
> of the DSC file. MdePkg/MdePkg.dsc is an example of this.
> 
> Thanks,
> 
> Andrew Fish
> 
> > On Sep 5, 2018, at 11:23 AM, Carsey, Jaben <jaben.car...@intel.com>
> wrote:
> >
> > Aha. So that is very different from a non NULL library when listed in the
> components section.  The goal is to test compile the library but not use I
> think.  Is there any way to do that?
> >
> > Jaben
> >
> > On Sep 5, 2018, at 11:21 AM, Andrew Fish <af...@apple.com
> <mailto:af...@apple.com>> wrote:
> >
> >>
> >>
> >>> On Sep 5, 2018, at 11:05 AM, Carsey, Jaben <jaben.car...@intel.com
> <mailto:jaben.car...@intel.com>> wrote:
> >>>
> >>> But a NULL lib listed in components section shouldn’t be linked in to
> anything...
> >>>
> >>
> >> Jaben,
> >>
> >> A NULL library class means force it to be linked in.
> >>
> >> ShellPkg/ShellPkg.dsc:70:  # [LibraryClasses.ARM] and NULL mean link this
> library into all ARM images.
> >> ShellPkg/ShellPkg.dsc:72:
> NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> >> ShellPkg/ShellPkg.dsc:75:
> NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
> >> ShellPkg/ShellPkg.dsc:78:
> NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> >> ShellPkg/ShellPkg.dsc:110:
> NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2Comma
> ndsLib.inf
> >> ShellPkg/ShellPkg.dsc:111:
> NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1Comma
> ndsLib.inf
> >> ShellPkg/ShellPkg.dsc:112:
> NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3Comma
> ndsLib.inf
> >> ShellPkg/ShellPkg.dsc:114:
> NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1Com
> mandsLib.inf
> >> ShellPkg/ShellPkg.dsc:115:
> NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1Com
> mandsLib.inf
> >> ShellPkg/ShellPkg.dsc:116:
> NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Com
> mandsLib.inf
> >> ShellPkg/ShellPkg.dsc:117:
> NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1
> CommandsLib.inf
> >> ShellPkg/ShellPkg.dsc:118:
> NULL|ShellPkg/Library/UefiShellNetwork2CommandsLib/UefiShellNetwork2
> CommandsLib.inf
> >>
> >> Libraries can get pulled in via other libraries. The only way to tell for 
> >> sure is
> to look at the build report.
> >>
> >> $ build -p ShellPkg/ShellPkg.dec -a X64 -t XCODE5 --report-file=report.txt
> >> $ cat report.txt | grep HobLib
> >> /Volumes/Case/UDK2018/MdePkg/Library/DxeHobLib/DxeHobLib.inf
> >> {HobLib:  C = HobLibConstructor Time = 19ms}
> >>
> >> You can comment out the HobLib reference in the ShellPkg.dsc file and
> figure out who is using it "####
> ffHobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf"
> >> $ build -p ShellPkg/ShellPkg.dec -a X64 -t XCODE5 --report-file=report.txt
> >> ...
> >> build.py...
> >> /Volumes/Case/UDK2018/ShellPkg/ShellPkg.dsc(...): error 4000: Instance
> of library class [HobLib] is not found
> >> in
> [/Volumes/Case/UDK2018/MdeModulePkg/Library/UefiBootManagerLib/Ue
> fiBootManagerLib.inf] [X64]
> >> consumed by module
> [/Volumes/Case/UDK2018/ShellPkg/Application/Shell/Shell.inf]
> >>
> >> Thanks,
> >>
> >> Andrew Fish
> >>
> >>> Unless is listed below with the shell INF also, it just test compiles 
> >>> it...
> >>>
> >>> Or so I thought.
> >>>
> >>> On Sep 5, 2018, at 11:04 AM, Andrew Fish <af...@apple.com
> <mailto:af...@apple.com>> wrote:
> >>>
> >>>>
> >>>>
> >>>>> On Sep 5, 2018, at 10:30 AM, Carsey, Jaben <jaben.car...@intel.com
> <mailto:jaben.car...@intel.com>> wrote:
> >>>>>
> >>>>> How does removing a lib from the components section affect the shell
> binary output?
> >>>>>
> >>>>> Is the asset at compile time?
> >>>>
> >>>> Jaben,
> >>>>
> >>>> The issue is likely with the HOB lib constructor in the Shell iASSERTing.
> Leif's example platform supports UEFI, but not PI so it is not expected that
> HOBs exist.
> >>>>
> >>>> The library has an explicit assumption that HOBs exist, and that is not
> the case in Leif's platform.
> >>>>
> >>>>
> https://github.com/tianocore/edk2/blob/master/MdePkg/Library/DxeHobLi
> b/HobLib.c#L54
> <https://github.com/tianocore/edk2/blob/master/MdePkg/Library/DxeHob
> Lib/HobLib.c#L54>
> >>>>
> >>>>
> >>>> VOID *mHobList =
> >>>> NULL;
> >>>>
> >>>>
> >>>> /**
> >>>>
> >>>> Returns the pointer to the HOB list.
> >>>>
> >>>>
> >>>> This function returns the pointer to first HOB in the list.
> >>>>
> >>>> For PEI phase, the PEI service GetHobList() can be used to retrieve the
> pointer
> >>>>
> >>>> to the HOB list. For the DXE phase, the HOB list pointer can be retrieved
> through
> >>>>
> >>>> the EFI System Table by looking up theHOB list GUID in the System
> Configuration Table.
> >>>>
> >>>> Since the System Configuration Table does not exist that the time the
> DXE Core is
> >>>>
> >>>> launched, the DXE Core uses a global variable from the DXE Core Entry
> Point Library
> >>>>
> >>>> to manage the pointer to the HOB list.
> >>>>
> >>>>
> >>>> If the pointer to the HOB list is NULL, then ASSERT().
> >>>>
> >>>>
> >>>> This function also caches the pointer to the HOB list retrieved.
> >>>>
> >>>>
> >>>> @return The pointer to the HOB list.
> >>>>
> >>>>
> >>>> **/
> >>>>
> >>>> VOID *
> >>>>
> >>>> EFIAPI
> >>>>
> >>>> GetHobList (
> >>>>
> >>>> VOID
> >>>>
> >>>> )
> >>>>
> >>>> {
> >>>>
> >>>> EFI_STATUS Status;
> >>>>
> >>>>
> >>>> if (mHobList ==
> >>>> NULL) {
> >>>>
> >>>> Status =
> >>>> EfiGetSystemConfigurationTable (&gEfiHobListGuid, &mHobList);
> >>>>
> >>>> ASSERT_EFI_ERROR (Status);
> >>>>
> >>>> ASSERT (mHobList !=
> >>>> NULL);
> >>>>
> >>>> }
> >>>>
> >>>> return mHobList;
> >>>>
> >>>> }
> >>>>
> >>>>
> >>>> /**
> >>>>
> >>>> The constructor function caches the pointer to HOB list by calling
> GetHobList()
> >>>>
> >>>> and will always return EFI_SUCCESS.
> >>>>
> >>>>
> >>>> @param ImageHandle The firmware allocated handle for the EFI image.
> >>>>
> >>>> @param SystemTable A pointer to the EFI System Table.
> >>>>
> >>>>
> >>>> @retval EFI_SUCCESS The constructor successfully gets HobList.
> >>>>
> >>>>
> >>>> **/
> >>>>
> >>>> EFI_STATUS
> >>>>
> >>>> EFIAPI
> >>>>
> >>>> HobLibConstructor (
> >>>>
> >>>> IN EFI_HANDLE ImageHandle,
> >>>>
> >>>> IN EFI_SYSTEM_TABLE *SystemTable
> >>>>
> >>>> )
> >>>>
> >>>> {
> >>>>
> >>>> GetHobList ();
> >>>>
> >>>>
> >>>> return EFI_SUCCESS;
> >>>>
> >>>> }
> >>>>
> >>>>
> >>>>
> >>>> /**
> >>>>
> >>>> Returns the next instance of a HOB type from the starting HOB.
> >>>>
> >>>>
> >>>> This function searches the first instance of a HOB type from the starting
> HOB pointer.
> >>>>
> >>>> If there does not exist such HOB type from the starting HOB pointer, it
> will return NULL.
> >>>>
> >>>> In contrast with macro GET_NEXT_HOB(), this function does not skip
> the starting HOB pointer
> >>>>
> >>>> unconditionally: it returns HobStart back if HobStart itself meets the
> requirement;
> >>>>
> >>>> caller is required to use GET_NEXT_HOB() if it wishes to skip current
> HobStart.
> >>>>
> >>>>
> >>>> If HobStart is NULL, then ASSERT().
> >>>>
> >>>>
> >>>> @param Type The HOB type to return.
> >>>>
> >>>> @param HobStart The starting HOB pointer to search from.
> >>>>
> >>>>
> >>>> @return The next instance of a HOB type from the starting HOB.
> >>>>
> >>>>
> >>>> **/
> >>>>
> >>>> VOID *
> >>>>
> >>>> EFIAPI
> >>>>
> >>>> GetNextHob (
> >>>>
> >>>> IN UINT16 Type,
> >>>>
> >>>> IN CONST VOID *HobStart
> >>>>
> >>>> )
> >>>>
> >>>> {
> >>>>
> >>>> EFI_PEI_HOB_POINTERS Hob;
> >>>>
> >>>>
> >>>> ASSERT (HobStart !=
> >>>> NULL);
> >>>>
> >>>>
> >>>> Hob.Raw = (UINT8 *) HobStart;
> >>>>
> >>>> //
> >>>>
> >>>> // Parse the HOB list until end of list or matching type is found.
> >>>>
> >>>> //
> >>>>
> >>>> while (!END_OF_HOB_LIST (Hob)) {
> >>>>
> >>>> if (Hob.Header->HobType == Type) {
> >>>>
> >>>> return Hob.Raw;
> >>>>
> >>>> }
> >>>>
> >>>> Hob.Raw =
> >>>> GET_NEXT_HOB (Hob);
> >>>>
> >>>> }
> >>>>
> >>>> return
> >>>> NULL;
> >>>>
> >>>> }
> >>>>
> >>>> Thanks,
> >>>>
> >>>> Andrew Fish
> >>>>
> >>>>>
> >>>>> Jaben
> >>>>>
> >>>>>> On Sep 5, 2018, at 10:26 AM, Leif Lindholm <leif.lindh...@linaro.org
> <mailto:leif.lindh...@linaro.org>> wrote:
> >>>>>>
> >>>>>> Hi all,
> >>>>>>
> >>>>>> (This is partly a summary of discussions that have been held on IRC
> >>>>>> and offline, with Alex Graf and Mike Kinney.)
> >>>>>>
> >>>>>> The UEFI Shell, as produced by the contents of ShellPkg, is needed
> for
> >>>>>> running the UEFI SCT. This has never been problematic before - but
> now
> >>>>>> we are starting to run SCT on the U-Boot implementation of the UEFI
> >>>>>> interfaces, certain implicit assumptions may need to be made
> explicit,
> >>>>>> and perhaps reevaluated.
> >>>>>>
> >>>>>> My feeling is the following:
> >>>>>> - The MinUefiShell variant should be sufficient to run SCT.
> >>>>>> - The UEFI Shell as provided by ShellPkg (any flavour) should run on
> >>>>>> any valid UEFI implementation. Where underlying functionality is
> >>>>>> missing for certain commands, those commands should be
> >>>>>> degraded/disabled to let remaining commands function.
> >>>>>>
> >>>>>> Ideally, I would like to see a Readme.md in ShellPkg, basically
> >>>>>> providing a mission statement. I could write one, but I expect the
> >>>>>> people who actually maintain it would be better suited :)
> >>>>>>
> >>>>>> We currently have an issue with running the shell on U-Boot because
> >>>>>> even MinUefiShell pulls in UefiShellDebug1CommandsLib.inf. This
> >>>>>> appears to be inadvertent, since it is also included a few lines
> >>>>>> further down inside an !ifndef $(NO_SHELL_PROFILES) guard.
> >>>>>> So I would propose the following patch (and can send it out properly
> >>>>>> if the maintainers agree):
> >>>>>>
> >>>>>> diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc
> >>>>>> index 59dd07e0ae..c852abd3f7 100644
> >>>>>> --- a/ShellPkg/ShellPkg.dsc
> >>>>>> +++ b/ShellPkg/ShellPkg.dsc
> >>>>>> @@ -101,7 +101,6 @@ [Components]
> >>>>>>
> ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib
> .inf
> >>>>>>
> ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsL
> ib.inf
> >>>>>>
> ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLi
> b.inf
> >>>>>> -
> ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1Commands
> Lib.inf
> >>>>>>
> ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1Comm
> andsLib.inf
> >>>>>>
> ShellPkg/Library/UefiShellNetwork2CommandsLib/UefiShellNetwork2Comm
> andsLib.inf
> >>>>>>
> >>>>>> The reason this causes a problem is because this module has a
> >>>>>> dependency on HobLib, which ASSERTS if it does not find any HOBs
> lying
> >>>>>> around. Since HOBs are a PI concept rather than a UEFI concept,
> >>>>>> ideally we would not terminate the shell if they are missing.
> However,
> >>>>>> since the HobLib is generic to EDK2, we also shouldn't just go
> >>>>>> stripping ASSERTs out of it. The above patch gives us a way of
> >>>>>> unblocking the SCT on U-Boot UEFI while we consider what to do
> about
> >>>>>> the bigger question.
> >>>>>>
> >>>>>> Thoughts?
> >>>>>>
> >>>>>> /
> >>>>>>   Leif
> >>>>
> >>
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to