On Jan 4, 2013, at 4:30 AM, 雅虎邮箱 <[email protected]> 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

The value of the bits are defined int 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Include/Library/DebugLib.h
//
// 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
>  
> 发件人: Andrew Fish
> 发送时间: 2013-01-04 02:30
> 收件人: linyao_71; edk2-devel
> 主题: Re: [edk2] Where are the realize source code of Protocol in UDK2010
> 
> On Jan 3, 2013, at 8:13 AM, 雅虎邮箱 <[email protected]> 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
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
> 

------------------------------------------------------------------------------
Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and
much more. Get web development skills now with LearnDevNow -
350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122812
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to