public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: Saqib Khan <saqib.khan2011@gmail.com>
Cc: Andrew Fish <afish@apple.com>, edk2-devel@ml01.01.org
Subject: Re: Urgent help -UefiBootManagerLib and LegacyBootManagerLib issue
Date: Mon, 17 Oct 2016 12:57:57 +0200	[thread overview]
Message-ID: <1f4e3d66-25a4-c18c-5f49-b13d55c82597@redhat.com> (raw)
In-Reply-To: <CAF=YJJ_Gho23zWd7kOzPQpX=zB5neo_dTLf-R5A7cbks0jFajA@mail.gmail.com>

On 10/17/16 11:46, Saqib Khan wrote:
> hi,Thank Laszlo and Andrew, here are my findings
> 
> Below loop in  LegacyBM.c iterate 16 times out which 2 times it return
> success and 14 times it return error code 3
> 
>     *for (Index = 0; Index < HandleCount; Index++) {
>       //
>       // Start the thunk driver so that the legacy option rom gets
> dispatched.
>       // Note: We don't directly call InstallPciRom because some thunk
> drivers
>       // (e.g. BlockIo thunk driver) depend on the immediate result
> after dispatching
>       //
>         // Print(L"LegacyBmRefreshAllBootOption....:  %d\n",Index);
>       Status = LegacyBios->CheckPciRom (
>                              LegacyBios,
>                              HandleBuffer[Index],
>                              NULL,
>                              NULL,
>                              &Flags
>                              );
>       if (!EFI_ERROR (Status)) {
>           Print(L"PCI Successfull   [%X]\n",Status);
>         gBS->ConnectController (HandleBuffer[Index], NULL, NULL, FALSE);
>       }
>       else
>       {
>             Print(L"PCI fail  [%X]\n",Status);
>       }
>     }*
> 
> should *LegacyBios->CheckPciRom *return always Successful in above loop?

Value 3 is EFI_UNSUPPORTED, and it means that a legacy PCI ROM does not
exist for the device. (See EFI_LEGACY_BIOS_CHECK_ROM in
"IntelFrameworkPkg/Include/Protocol/LegacyBios.h".)

> After this LegacyBmUpdateDevOrder () is called and inside this method
> system hang in loop below
> 
> Ptr             = DevOrder;
>   NewPtr          = NewDevOrder;
>   NewPtr->BbsType = Ptr->BbsType;
>   NewPtr->Length  = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));
>   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
>     if (!LegacyBmValidBbsEntry (&LocalBbsTable[Ptr->Data[Index] & 0xFF]) ||
>         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY
>         ) {
>         //   *Print(L"Continure %d\n",Index); it keeps in this loop some
> time in loop below*
>              continue;
>     }
>     Print(L" \n");
>     NewPtr->Data[FDIndex] = Ptr->Data[Index];
>     FDIndex++;
>   }
>   NewFDPtr = NewPtr->Data;

Well, where exactly does it hang in the loop? What are the relevant
variable values etc?

Thanks
Laszlo

> 
> 
> 
> On Thu, Oct 6, 2016 at 1:41 PM, Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>> wrote:
> 
>     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
>     <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 <afish@apple.com
>     <mailto:afish@apple.com>> wrote:
>     >
>     >>
>     >>> On Oct 5, 2016, at 2:23 PM, Saqib Khan <saqib.khan2011@gmail.com
>     <mailto:saqib.khan2011@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.khan2011@gmail.com <mailto:saqib.khan2011@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.khan2011@gmail.com <mailto:saqib.khan2011@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 <mailto:edk2-devel@lists.01.org>
>     >>> https://lists.01.org/mailman/listinfo/edk2-devel
>     <https://lists.01.org/mailman/listinfo/edk2-devel>
>     >>
>     >>
>     >
>     >
> 
> 
> 
> 
> -- 
> Regards
> Saqib Ahmed Khanzada



      reply	other threads:[~2016-10-17 10:58 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-05 12:51 UefiBootManagerLib and LegacyBootManagerLib issue Saqib Khan
2016-10-05 16:05 ` Saqib Khan
2016-10-05 21:23   ` Urgent help -UefiBootManagerLib " Saqib Khan
2016-10-05 21:37     ` Andrew Fish
2016-10-06  7:28       ` Saqib Khan
2016-10-06  8:41         ` Laszlo Ersek
2016-10-17  9:46           ` Saqib Khan
2016-10-17 10:57             ` Laszlo Ersek [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1f4e3d66-25a4-c18c-5f49-b13d55c82597@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox