Re: [edk2] Where are the realize source code of Protocol in UDK2010

Subject: Re: [edk2] Where are the realize source code of Protocol in UDK2010

From: Andrew Fish <afish@apple.com>

To: linyao_71 <linyao_71@yahoo.cn>

Date: 2013-01-04 14:29:53


On Jan 4, 2013, at 4:30 AM, <linyao_71@yahoo.cn> wrote:

Hi Andrew,
 
Thank you for your reply!
 
I have noticed that only driver can produce protocol,

Not strictly true as the shell, an application produces protocols too. In EFI the only difference between an application and a driver is the applications memory is freed after it returns. So an application can only publish a protocol for the length of time that it is running. This works in the case of the shell, but not in general. 

but how to locate the dirver (DXE Driver.etc) by protocol GUID?
If the drivers follow the EFI driver model (produces a Driver Binding Protocol) you can look up which driver produced the protocol and there are shell commands that help with this.  But I don't think this is your case. 
 
What's more, we all know that APs are produced by Initial DXE Driver, do you have some clear ubderstand about APs?
 

The APs (Architectural Protocols) are the set of platform specific services that are required to produce the EFI Boot and Runtime Services. 

If you are trying to figure out what is happening on a give boot the best thing to do is turn on DEBUG_INFO DEBUG prints in the DXE Core. This will cause a debug print every time a protocol is registered, see https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdeModulePkg/Core/Dxe/Hand/Handle.c

DEBUG_INFO is set in the DSC file (this is an example from the EmulatorPkg):

gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000040

//
// Declare bits for PcdDebugPrintErrorLevel and the ErrorLevel parameter of DebugPrint()
//
#define DEBUG_INIT      0x00000001  // Initialization
#define DEBUG_WARN      0x00000002  // Warnings
#define DEBUG_LOAD      0x00000004  // Load events
#define DEBUG_FS        0x00000008  // EFI File system
#define DEBUG_POOL      0x00000010  // Alloc & Free's
#define DEBUG_PAGE      0x00000020  // Alloc & Free's
#define DEBUG_INFO      0x00000040  // Informational debug messages
#define DEBUG_DISPATCH  0x00000080  // PEI/DXE/SMM Dispatchers
#define DEBUG_VARIABLE  0x00000100  // Variable
#define DEBUG_BM        0x00000400  // Boot Manager
#define DEBUG_BLKIO     0x00001000  // BlkIo Driver
#define DEBUG_NET       0x00004000  // SNI Driver
#define DEBUG_UNDI      0x00010000  // UNDI Driver
#define DEBUG_LOADFILE  0x00020000  // UNDI Driver
#define DEBUG_EVENT     0x00080000  // Event messages
#define DEBUG_GCD       0x00100000  // Global Coherency Database changes
#define DEBUG_CACHE     0x00200000  // Memory range cachability changes
#define DEBUG_VERBOSE   0x00400000  // Detailed debug messages that may significantly impact boot performance
#define DEBUG_ERROR     0x80000000  // Error

So you can see the EmulatorPkg has DEBUG_INFO and DEBUG_ERROR DEBUG prints turned on, and other DEBUG prints turned off. To be clear these match the DEBUG() macros in the code. 

Thanks!
 
Justin Lin
 
 2013-01-04 02:30
 Re: [edk2] Where are the realize source code of Protocol in UDK2010

On Jan 3, 2013, at 8:13 AM, <linyao_71@yahoo.cn> wrote:

Hi All,
I got a trouble during learing UEFI that when I tried to retrive more information about protocols defined in the path of MdePkg\Include\Protocol, I only see the header files but not find the corresponding file of *.c

Think of the protocol .h file as the public class definition.  The EFI_GUID global extern in the .h file is the name that is set to the #define *_PROTOCOL_GUID value. 

So for example if you look at https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Include/Protocol/BlockIo.h you can search the code base for gEfiBlockIoProtocolGuid to see the producers and consumers of Block IO protocol.

The modules that produce or consume the Block IO protocol will include gEfiBlockIoProtocolGuid in the [Protocols] section of their INF file and this will cause the build generated AutoGen.c file to contain:
EFI_GUID gEfiBlockIoProtocolGuid = EFI_BLOCK_IO_PROTOCOL_GUID

Producers will use gBS->InstallProtocolInterface() or gBS->InstallMultipleProtocolInterfaces() to register the protocol instance(s) that they produce. 
Consumers will use gBS->OpenProtocol(), gBS->HandleProtocol(), or gBS->LocolProtocol() to discover the protocol instance. 

In both the consumers and producers you will see &gEfiBlockIoProtocolGuid passed as an argument.

Thanks,

Andrew Fish

 
Could you offer me some information about this question?!
I am looking forward to your reply!
 
Thanks & Best Regards!
 
Justin Lin
From TJ China
------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122712_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel