public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Andrew Fish <afish@apple.com>
To: "David A. Van Arnem" <dvanarnem@cmlab.biz>
Cc: Laszlo Ersek <lersek@redhat.com>,
	"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>
Subject: Re: Print from DXE_DRIVER
Date: Wed, 08 Feb 2017 16:49:43 -0800	[thread overview]
Message-ID: <AA5949B8-3F79-464F-BDED-A96F721FF1D0@apple.com> (raw)
In-Reply-To: <990d42be-7d48-7993-e655-0f1718af0dc1@cmlab.biz>


> On Feb 8, 2017, at 4:41 PM, David A. Van Arnem <dvanarnem@cmlab.biz> wrote:
> 
> 
> 
> On 02/08/2017 05:15 PM, Laszlo Ersek wrote:
>> On 02/08/17 23:10, David A. Van Arnem wrote:
>>> Hello,
>>> 
>>> I am working on a DXE_DRIVER for a custom device.  I like to use Print()
>>> statements to trace code execution during development.  Thus I have put
>>> a print statement in each of my Supported(), Start(), and Stop()
>>> functions for the driver binding protocol.  Currently I am building the
>>> driver as part of the UefiCpuPkg, with no changes to the current
>>> UefiCpuPkg.dsc except for adding my driver under [Components].  I have
>>> also added the PrintLib and UefiLib to the [LibraryClasses] section in
>>> my driver's INF file, and included the necessary headers.
>>> 
>>> When I load the driver from the shell (load <drivername>.efi), I get a
>>> message indicating it loaded successfully, but no output from the
>>> Print() messages.  The documentation for the shell says load should test
>>> both the Supported() and Start() functions, so I would expect to see the
>>> output, but I am not sure I am using the correct library instances to
>>> accomplish this.  Is it possible to use Print() from a DXE_DRIVER, and
>>> which library instance should I use in the UefiCpuPkg.dsc file?  If not,
>>> would changing it to a UEFI_DRIVER help?  Any other recommendations?
>>> 
>>> If there is an example in edk2 that does this that you could point me
>>> to, that would be sufficient as well.  Thanks!
>>> 
>> 
>> I never tried to use Print() from drivers, only applications
>> (UEFI_APPLICATION modules). In drivers I always use DEBUG, which, based
>> on the DebugLib instance in use, can be routed to some debug port,
>> serial port, etc.
>> 
>> But, I think Print() can be made work too. The only Print() function
>> that should matter is in "MdePkg/Library/UefiLib/UefiLibPrint.c". It uses
>> 
>>  gST->ConOut
>> 
>> as output console. Since this comes from the UEFI system table, it's
>> clear that you shouldn't be writing a DXE_DRIVER, since those can run
>> much earlier than the UEFI architectural protocols become available.
>> DXE_DRIVER modules are practically platform drivers; they are not
>> governed by the UEFI spec by the PI spec, but the system table is
>> defined in the UEFI spec. (The above sounds a bit hand-wavy, but it
>> should work for this discussion.)
>> 
>> Another sign that you should be writing on a UEFI_DRIVER module is that
>> the Start(), Stop(), and Supported() member functions belong to the
>> driver binding protocol, which exists for UEFI drivers that conform to
>> the UEFI driver model. IOW, you're not only working on a UEFI_DRIVER
>> already, but one that falls into a specific class of UEFI_DRIVERs.
>> 
>> The third sign that your module type should be UEFI_DRIVER is the intro
>> text in "MdePkg/Library/UefiLib/UefiLib.inf", to which library Print()
>> belongs. Rewrapped here for readability:
>> 
>> #  The UEFI Library provides functions and macros that simplify the
>> #  development of UEFI Drivers and UEFI Applications.  These functions
>> #  and macros help manage EFI events, build simple locks utilizing EFI
>> #  Task Priority Levels (TPLs), install EFI Driver Model related
>> #  protocols, manage Unicode string tables for UEFI Drivers, and print
>> #  messages on the console output and standard error devices.
>> 
>> I recommend always reading the INF file comments, they are very-very
>> useful most of the time.
>> 
>> Finally, just loading a UEFI_DRIVER into memory and running it will do
>> nothing for binding devices (as long as the driver conforms to the UEFI
>> driver model, which I assume your driver does, based on the above). Such
>> drivers only install their driver binding protocol instance(s) in their
>> entry points, and then exit. Those Supported(), Start(), and Stop()
>> functions have to be called by something. They are called by the
>> gBS->ConnectController() boot service, which in turn is exposed in the
>> shell with the CONNECT command. Please see the documentation / help text
>> on it.
>> 
>> So I recommend:
>> - flip your module type to UEFI_DRIVER,
>> - once the driver is loaded, try a recursive CONNECT from the shell.
>> 
>> Hope this helps,
> 
> Definitely!  I appreciate your detailed explanation, that should be
> plenty to get me in the right direction.  UEFI_DRIVER is definitely the
> module type I should be using based on your info.
> 
> One follow-up question: the LOAD command in the UEFI Shell 2.2 spec says
> LOAD without -nc tries to connect the driver to a proper device; is this
> different from ConnectController() that the CONNECT command uses?
> 

David,

Yes everything is calling gBS->ConnectConroller() under the hood. 

Thanks,

Andrew Fish

> Regards,
> David
> 
>> Laszlo
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
>> https://lists.01.org/mailman/listinfo/edk2-devel
>> 
> 
> -- 
> Regards,
> David Van Arnem
> Development Engineer IV
> Computer Measurement Laboratory, LLC
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel



  reply	other threads:[~2017-02-09  0:49 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-08 22:10 Print from DXE_DRIVER David A. Van Arnem
2017-02-09  0:15 ` Laszlo Ersek
2017-02-09  0:41   ` David A. Van Arnem
2017-02-09  0:49     ` Andrew Fish [this message]
2017-02-09  0:43 ` Andrew Fish
2017-02-09  0:49   ` David A. Van Arnem
2017-02-09  1:04     ` Andrew Fish
2017-02-09  2:16       ` Gao, Liming
2017-02-09  2:55   ` Rebecca Cran
2017-02-09  2:59     ` Tim Lewis
2017-02-09 20:38       ` David A. Van Arnem

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=AA5949B8-3F79-464F-BDED-A96F721FF1D0@apple.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