On 10/06/16 09:28, Saqib Khan wrote: > Hi Andrew, > > I think I did not address my problem well in my previous email.Please take > a minute again to understand my problem. > > here is my scenario > > have following lib added to my *.inf file > [LibraryClasses] > HiiLib > DebugLib > UefiLib > MemoryAllocationLib > UefiBootServicesTableLib > UefiApplicationEntryPoint > > *UefiBootManagerLib LegacyBootManagerLib* > UefiShellLib > > And here is piece of code I am trying to compile > > EfiBootManagerConnectAll (); > EfiBootManagerRefreshAllBootOption (); > > BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, > LoadOptionTypeBoot); > > Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) > &LegacyBios); > > it Compiles successfully but EFI hangs at > > *EfiBootManagerRefreshAllBootOption () * > When I remove * LegacyBootManagerLib* Libraries it does not hang > > I think I missing something in it may be i need to add CSM libraries in my > EFI? > > I also tried NULL library resolution in DuetPkgx64.dsc like this > > MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf { > <LibraryClasses> > > NULL|IntelFrameworkModulePkg/Library/LegacyBootManagerLib/LegacyBootManagerLib.inf > > } > > > If you still think that is a CSM issue then i will be go for another system > as i am doing my development on physical system. > > > *Thank you*
Andrew understood your problem just fine, and gave the correct answer. (1) As I explained to you in one of my previous emails (or, well, I at least alluded to it), namely in https://lists.01.org/pipermail/edk2-devel/2016-September/001799.html LegacyBootManagerLib is a *plugin* for UefiBootManagerLib. That is, a library to be used with NULL library class resolution in whatever driver or application that you already use UefiBootManagerLib in. (If you know that your module will always need LegacyBootManagerLib, then you can explicitly specify it in your INF file too.) (2) If you do not add LegacyBootManagerLib to your application like explained above, then the following will happen: - UefiBootManagerLib's EfiBootManagerRegisterLegacyBootSupport() function will never be called, - therefore UefiBootManagerLib's mBmRefreshLegacyBootOption global variable will remain NULL, - therefore EfiBootManagerRefreshAllBootOption() will never call (*mBmRefreshLegacyBootOption)(). (3) In comprison, if you *do* add LegacyBootManagerLib to your application, then the following will happen: - LegacyBootManagerLib's constructor function, namely LegacyBootManagerLibConstructor(), will call EfiBootManagerRegisterLegacyBootSupport(), with the following two function pointers: - LegacyBmRefreshAllBootOption - LegacyBmBoot - In turn, UefiBootManagerLib's mBmRefreshLegacyBootOption will be set to LegacyBmRefreshAllBootOption - In turn, EfiBootManagerRefreshAllBootOption() will call LegacyBmRefreshAllBootOption(), through the mBmRefreshLegacyBootOption function pointer. This is exactly what's happening in your case; it's just that LegacyBmRefreshAllBootOption() -- in file "IntelFrameworkModulePkg/Library/LegacyBootManagerLib/LegacyBm.c" -- does not return. (4) Why not? You can find out simply by adding DEBUG statements to the function, and see how far it proceeds. But, as Andrew already said, the only real suspect in that function is Status = LegacyBios->CheckPciRom ( LegacyBios, HandleBuffer[Index], NULL, NULL, &Flags ); which calls into your CSM. So, if that's the function call that doesn't return -- and it likely is --, then the CSM you use has the bug. (5) For the future: please don't give up tracking down bugs so easily. This time you stopped as early as > mBmRefreshLegacyBootOption (); //this method does not return - Well, did you try to see what mBmRefreshLegacyBootOption was? Is there a function declared with this name, somewhere in the tree? Well, no. - Is mBmRefreshLegacyBootOption a function pointer? Yes. - Okay, where is the function pointer set then? In EfiBootManagerRegisterLegacyBootSupport(). - So what calls EfiBootManagerRegisterLegacyBootSupport()? The LegacyBootManagerLibConstructor() function, in file "IntelFrameworkModulePkg/Library/LegacyBootManagerLib/LegacyBm.c". - What arguments does LegacyBootManagerLibConstructor() pass? In particular, it passes the address of the function LegacyBmRefreshAllBootOption(). - And now you know what the function call > mBmRefreshLegacyBootOption (); //this method does not return *actually* does, you can add DEBUG statements to it, and track it to the LegacyBios->CheckPciRom() call that invokes your CSM. Laszlo > > On Thu, Oct 6, 2016 at 2:37 AM, Andrew Fish <af...@apple.com> wrote: > >> >>> On Oct 5, 2016, at 2:23 PM, Saqib Khan <saqib.khan2...@gmail.com> wrote: >>> >>> >>> >>> Hi all,i need urgent help regarding this issue. >>> >> >> >> Saqib, >> >> You likely have a bug in your CSM. So that is your >> gEfiLegacyBiosProtocolGuid implementation and all the 16-bit legacy BIOS >> code. >> >> So you should contact the people you got your CSM from. >> >> Thanks, >> >> Andrew Fish >> >>>> On 05-Oct-2016, at 9:05 PM, Saqib Khan <saqib.khan2...@gmail.com> >> wrote: >>>> >>>> >>>> I have found that it just dont return from mBmRefreshLegacyBootOption >> (); . >>>> >>>> have a look at code. let me know the possible cause of it ... >>>> I need urgent help >>>> >>>> EfiBootManagerRefreshAllBootOption ( >>>> VOID >>>> ) >>>> { >>>> EFI_STATUS Status; >>>> EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions; >>>> UINTN NvBootOptionCount; >>>> EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; >>>> UINTN BootOptionCount; >>>> UINTN Index; >>>> Print(L"indside refresh\n"); >>>> // >>>> // Optionally refresh the legacy boot option >>>> // >>>> if (mBmRefreshLegacyBootOption != NULL) { >>>> Print(L"Before legacy refresh \n"); >>>> mBmRefreshLegacyBootOption (); //this method does not return >>>> Print(L"legacy refresh complete\n"); >>>> } >>>> >>>>> On Wed, Oct 5, 2016 at 5:51 PM, Saqib Khan <saqib.khan2...@gmail.com> >> wrote: >>>>> Hi, >>>>> >>>>> when i import both lib in my project my EFI hangs at >> EfiRefreshAllBootOptions, i removed LegacyBootManager and it worked fine .i >> need both lib as i need to boot legacy from EFI, how this issue can be >> resolved? >>>>> >>>>> >>>>> here is piece of inf file >>>>> >>>>> [Packages] >>>>> MdePkg/MdePkg.dec >>>>> MdeModulePkg/MdeModulePkg.dec >>>>> IntelFrameworkPkg/ >>>>> IntelFrameworkPkg.dec >>>>> IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec >>>>> ShellPkg/ShellPkg.dec >>>>> >>>>> [LibraryClasses] >>>>> HiiLib >>>>> DebugLib >>>>> UefiLib >>>>> MemoryAllocationLib >>>>> UefiBootServicesTableLib >>>>> UefiApplicationEntryPoint >>>>> UefiBootManagerLib >>>>> LegacyBootManagerLib >>>>> >>>>> >>>>> -- >>>>> Regards >>>>> Saqib Ahmed Khanzada >>>> >>>> >>>> >>>> -- >>>> Regards >>>> Saqib Ahmed Khanzada >>> _______________________________________________ >>> 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