From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8C5AA1A1E24 for ; Mon, 17 Oct 2016 03:58:00 -0700 (PDT) Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17AD97DD34; Mon, 17 Oct 2016 10:58:00 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-91.phx2.redhat.com [10.3.116.91]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u9HAvw3n026018; Mon, 17 Oct 2016 06:57:58 -0400 To: Saqib Khan References: <02363E95-C78D-4137-93DB-FEB05A221A9B@gmail.com> Cc: Andrew Fish , edk2-devel@ml01.01.org From: Laszlo Ersek Message-ID: <1f4e3d66-25a4-c18c-5f49-b13d55c82597@redhat.com> Date: Mon, 17 Oct 2016 12:57:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 17 Oct 2016 10:58:00 +0000 (UTC) Subject: Re: Urgent help -UefiBootManagerLib and LegacyBootManagerLib issue X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Oct 2016 10:58:00 -0000 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 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 > 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 { > > > > > > 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 > wrote: > > > >> > >>> On Oct 5, 2016, at 2:23 PM, Saqib Khan > 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 > > > >> 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 > > > >> 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