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?
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;



On Thu, Oct 6, 2016 at 1:41 PM, Laszlo Ersek <ler...@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
>
> 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
> >>
> >>
> >
> >
>
>


-- 
Regards
Saqib Ahmed Khanzada
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to