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

Reply via email to