public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "David A. Van Arnem" <dvanarnem@cmlab.biz>
To: Laszlo Ersek <lersek@redhat.com>,
	"edk2-devel@ml01.01.org" <edk2-devel@ml01.01.org>
Subject: Re: Print from DXE_DRIVER
Date: Wed, 8 Feb 2017 17:41:19 -0700	[thread overview]
Message-ID: <990d42be-7d48-7993-e655-0f1718af0dc1@cmlab.biz> (raw)
In-Reply-To: <09c11a95-99e2-eb82-304b-c294b4785841@redhat.com>



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?

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



  reply	other threads:[~2017-02-09  0:41 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 [this message]
2017-02-09  0:49     ` Andrew Fish
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=990d42be-7d48-7993-e655-0f1718af0dc1@cmlab.biz \
    --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