Commit to EDKII at 18414. 

And EDKII 18415, I correct protocol usage description in INF. 

-----Original Message-----
From: Masamitsu MURASE [mailto:[email protected]] 
Sent: Thursday, September 03, 2015 2:09 AM
To: Gao, Liming; [email protected]
Subject: [edk2] [PATCH] MdePkg: Add UefiDebugLibDebugPortProtocol to output 
logs via EFI_DEBUGPORT_PROTOCOL.Write.

Dear Liming, MdePkg maintainers,

Thank you very much for the reply, Liming.
I modified the following points:
>> 1) Refer to BaseDebugLibSerialPort instance, DebugPortProtocolWrite() API 
>> can have two parameters: Buffer and BufferLength.
>> 2) DebugPortProtocolInit() API can be merged into DebugPortProtocolWrite(). 
>> 3) GLOBAL_REMOVE_IF_UNREFERENCED is not required to declare mDebugPort. 
>> mDebugPort is always be used. 
>> 4) mTimeOut is not required. WRITE_TIMEOUT can be directly specified into 
>> DebugPortProtocol->Write() API.

Let me try again, please.


MdePkg: Add UefiDebugLibDebugPortProtocol to output logs via 
EFI_DEBUGPORT_PROTOCOL.Write.

UefiDebugLibDebugPortProtocol is an implementation of DebugLib.
It calls EFI_DEBUGPORT_PROTOCOL.Write in DebugPrint and DebugAssert.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Masamitsu MURASE <[email protected]>
---
 .../UefiDebugLibDebugPortProtocol/DebugLib.c       | 329 +++++++++++++++++++++
 .../UefiDebugLibDebugPortProtocol.inf              |  57 ++++
 .../UefiDebugLibDebugPortProtocol.uni              | Bin 0 -> 1812 bytes
 MdePkg/MdePkg.dsc                                  |   1 +
 4 files changed, 387 insertions(+)
 create mode 100644 MdePkg/Library/UefiDebugLibDebugPortProtocol/DebugLib.c
 create mode 100644 
MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.inf
 create mode 100644 
MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.uni

diff --git a/MdePkg/Library/UefiDebugLibDebugPortProtocol/DebugLib.c 
b/MdePkg/Library/UefiDebugLibDebugPortProtocol/DebugLib.c
new file mode 100644
index 0000000..fdad2f5
--- /dev/null
+++ b/MdePkg/Library/UefiDebugLibDebugPortProtocol/DebugLib.c
@@ -0,0 +1,329 @@
+/** @file
+  UEFI Debug Library that sends messages to EFI_DEBUGPORT_PROTOCOL.Write.
+
+  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD 
License         
+  which accompanies this distribution.  The full text of the license may be 
found at        
+  http://opensource.org/licenses/bsd-license.php.                              
              
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,        
             
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.             
+
+**/
+
+#include <Uefi.h>
+
+#include <Library/DebugLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/PrintLib.h>
+#include <Library/PcdLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugPrintErrorLevelLib.h>
+
+#include <Protocol/DebugPort.h>
+
+//
+// Define the maximum debug and assert message length that this library 
+supports // #define MAX_DEBUG_MESSAGE_LENGTH  0x100
+
+//
+// Define the timeout for EFI_DEBUGPORT_PROTOCOL.Write // #define 
+WRITE_TIMEOUT 1000
+
+
+EFI_DEBUGPORT_PROTOCOL *mDebugPort = NULL;
+
+/**
+  Send message to DebugPort Protocol.
+
+  If mDebugPort is NULL, i.e. EFI_DEBUGPORT_PROTOCOL is not located,  
+ EFI_DEBUGPORT_PROTOCOL is located first.
+  Then, Buffer is sent via EFI_DEBUGPORT_PROTOCOL.Write.
+
+  @param  Buffer         The message to be sent.
+  @param  BufferLength   The byte length of Buffer.
+**/
+VOID
+UefiDebugLibDebugPortProtocolWrite (
+  IN  CONST CHAR8  *Buffer,
+  IN        UINTN  BufferLength
+  )
+{
+  UINTN      Length;
+  EFI_STATUS Status;
+
+  //
+  // If mDebugPort is NULL, initialize first.
+  //
+  if (mDebugPort == NULL) {
+      Status = gBS->LocateProtocol (&gEfiDebugPortProtocolGuid, NULL, (VOID 
**)&mDebugPort);
+      if (EFI_ERROR (Status)) {
+          return;
+      }
+
+      mDebugPort->Reset (mDebugPort);
+  }
+
+  //
+  // EFI_DEBUGPORT_PROTOCOL.Write is called until all message is sent.
+  //
+  while (BufferLength > 0) {
+    Length = BufferLength;
+
+    Status = mDebugPort->Write (mDebugPort, WRITE_TIMEOUT, &Length, (VOID *) 
Buffer);
+    if (EFI_ERROR (Status) || BufferLength < Length) {
+      break;
+    }
+
+    Buffer += Length;
+    BufferLength -= Length;
+  }
+}
+
+/**
+  Prints a debug message to the debug output device if the specified error 
level is enabled.
+
+  If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib 
+ function  GetDebugPrintErrorLevel (), then print the message specified 
+ by Format and the  associated variable argument list to the debug output 
device.
+
+  If Format is NULL, then ASSERT().
+
+  @param  ErrorLevel  The error level of the debug message.
+  @param  Format      Format string for the debug message to print.
+  @param  ...         A variable argument list whose contents are accessed 
+                      based on the format string specified by Format.
+
+**/
+VOID
+EFIAPI
+DebugPrint (
+  IN  UINTN        ErrorLevel,
+  IN  CONST CHAR8  *Format,
+  ...
+  )
+{
+  CHAR8      Buffer[MAX_DEBUG_MESSAGE_LENGTH];
+  VA_LIST    Marker;
+
+  //
+  // If Format is NULL, then ASSERT().
+  //
+  ASSERT (Format != NULL);
+
+  //
+  // Check driver debug mask value and global mask  //  if ((ErrorLevel 
+ & GetDebugPrintErrorLevel ()) == 0) {
+    return;
+  }
+
+  //
+  // Convert the DEBUG() message to an ASCII String  //  VA_START 
+ (Marker, Format);  AsciiVSPrint (Buffer, sizeof (Buffer), Format, 
+ Marker);  VA_END (Marker);
+
+  //
+  // Send the print string to EFI_DEBUGPORT_PROTOCOL.Write.
+  //
+  UefiDebugLibDebugPortProtocolWrite (Buffer, AsciiStrLen (Buffer)); }
+
+
+/**
+  Prints an assert message containing a filename, line number, and 
description.  
+  This may be followed by a breakpoint or a dead loop.
+
+  Print a message of the form "ASSERT <FileName>(<LineNumber>): 
<Description>\n"
+  to the debug output device.  If 
+ DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of  PcdDebugProperyMask 
+ is set then CpuBreakpoint() is called. Otherwise, if  
+ DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is 
+ set then
+  CpuDeadLoop() is called.  If neither of these bits are set, then this 
+ function  returns immediately after the message is printed to the debug 
output device.
+  DebugAssert() must actively prevent recursion.  If DebugAssert() is 
+ called while  processing another DebugAssert(), then DebugAssert() must 
return immediately.
+
+  If FileName is NULL, then a <FileName> string of "(NULL) Filename" is 
printed.
+  If Description is NULL, then a <Description> string of "(NULL) Description" 
is printed.
+
+  @param  FileName     The pointer to the name of the source file that 
generated 
+                       the assert condition.
+  @param  LineNumber   The line number in the source file that generated the 
+                       assert condition  @param  Description  The 
+ pointer to the description of the assert condition.
+
+**/
+VOID
+EFIAPI
+DebugAssert (
+  IN CONST CHAR8  *FileName,
+  IN UINTN        LineNumber,
+  IN CONST CHAR8  *Description
+  )
+{
+  CHAR8  Buffer[MAX_DEBUG_MESSAGE_LENGTH];
+
+  //
+  // Generate the ASSERT() message in ASCII format  //  AsciiSPrint (
+    Buffer, 
+    sizeof (Buffer), 
+    "ASSERT %a(%d): %a\n", 
+    FileName, 
+    LineNumber, 
+    Description
+    );
+
+  //
+  // Send the print string to EFI_DEBUGPORT_PROTOCOL.Write.
+  //
+  UefiDebugLibDebugPortProtocolWrite (Buffer, AsciiStrLen (Buffer));
+
+  //
+  // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings
+  //
+  if ((PcdGet8(PcdDebugPropertyMask) & 
DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
+    CpuBreakpoint ();
+  } else if ((PcdGet8(PcdDebugPropertyMask) & 
DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
+    CpuDeadLoop ();
+  }
+}
+
+
+/**
+  Fills a target buffer with PcdDebugClearMemoryValue, and returns the target 
buffer.
+
+  This function fills Length bytes of Buffer with the value specified 
+ by  PcdDebugClearMemoryValue, and returns Buffer.
+
+  If Buffer is NULL, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 
+
+  @param   Buffer  The pointer to the target buffer to be filled with 
PcdDebugClearMemoryValue.
+  @param   Length  The number of bytes in Buffer to fill with zeros 
PcdDebugClearMemoryValue. 
+
+  @return  Buffer  The pointer to the target buffer filled with 
PcdDebugClearMemoryValue.
+
+**/
+VOID *
+EFIAPI
+DebugClearMemory (
+  OUT VOID  *Buffer,
+  IN UINTN  Length
+  )
+{
+  //
+  // If Buffer is NULL, then ASSERT().
+  //
+  ASSERT (Buffer != NULL);
+
+  //
+  // SetMem() checks for the the ASSERT() condition on Length and 
+returns Buffer
+  //
+  return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue));
+}
+
+
+/**
+  Returns TRUE if ASSERT() macros are enabled.
+
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED 
+ bit of  PcdDebugProperyMask is set.  Otherwise FALSE is returned.
+
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of 
PcdDebugProperyMask is set.
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of 
PcdDebugProperyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+DebugAssertEnabled (
+  VOID
+  )
+{
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & 
+DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0); }
+
+
+/**
+  Returns TRUE if DEBUG() macros are enabled.
+
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED 
+ bit of  PcdDebugProperyMask is set.  Otherwise FALSE is returned.
+
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of 
PcdDebugProperyMask is set.
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of 
PcdDebugProperyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+DebugPrintEnabled (
+  VOID
+  )
+{
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & 
+DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0); }
+
+
+/**
+  Returns TRUE if DEBUG_CODE() macros are enabled.
+
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED 
+ bit of  PcdDebugProperyMask is set.  Otherwise FALSE is returned.
+
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of 
PcdDebugProperyMask is set.
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of 
PcdDebugProperyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+DebugCodeEnabled (
+  VOID
+  )
+{
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & 
+DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0); }
+
+
+/**
+  Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.
+
+  This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED 
+ bit of  PcdDebugProperyMask is set.  Otherwise FALSE is returned.
+
+  @retval  TRUE    The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of 
PcdDebugProperyMask is set.
+  @retval  FALSE   The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of 
PcdDebugProperyMask is clear.
+
+**/
+BOOLEAN
+EFIAPI
+DebugClearMemoryEnabled (
+  VOID
+  )
+{
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & 
+DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0); }
+
+/**
+  Returns TRUE if any one of the bit is set both in ErrorLevel and 
PcdFixedDebugPrintErrorLevel.
+
+  This function compares the bit mask of ErrorLevel and 
PcdFixedDebugPrintErrorLevel.
+
+  @retval  TRUE    Current ErrorLevel is supported.
+  @retval  FALSE   Current ErrorLevel is not supported.
+
+**/
+BOOLEAN
+EFIAPI
+DebugPrintLevelEnabled (
+  IN  CONST UINTN        ErrorLevel
+  )
+{
+  return (BOOLEAN) ((ErrorLevel & 
+PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0); }
diff --git 
a/MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.inf
 
b/MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.inf
new file mode 100644
index 0000000..11c7e81
--- /dev/null
+++ b/MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPort
+++ Protocol.inf
@@ -0,0 +1,57 @@
+## @file
+#  Instance of Debug Library using EFI_DEBUGPORT_PROTOCOL.
+#
+#  Debug Lib that sends messages to EFI_DEBUGPORT_PROTOCOL.Write.
+#
+#  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> # #  
+This program and the accompanying materials #  are licensed and made 
+available under the terms and conditions of the BSD License #  which 
+accompanies this distribution. The full text of the license may be 
+found at #  http://opensource.org/licenses/bsd-license.php.
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" 
+BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = UefiDebugLibDebugPortProtocol
+  MODULE_UNI_FILE                = UefiDebugLibDebugPortProtocol.uni
+  FILE_GUID                      = 102287b4-6b12-4D41-91e1-ebee1f3aa614
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = DebugLib|DXE_CORE DXE_DRIVER 
DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER 
+
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+
+[Sources]
+  DebugLib.c
+
+
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+
+[LibraryClasses]
+  BaseMemoryLib
+  BaseLib
+  PcdLib
+  PrintLib
+  UefiBootServicesTableLib
+  DebugPrintErrorLevelLib
+
+[Protocols]
+  gEfiDebugPortProtocolGuid                     ## UNDEFINED
+
+[Pcd]
+  gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue        ## 
SOMETIMES_CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask            ## CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdFixedDebugPrintErrorLevel    ## CONSUMES
+
diff --git 
a/MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.uni
 
b/MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProtocol.uni
new file mode 100644
index 
0000000000000000000000000000000000000000..83051cace477ca2941bd5523c2ea7ed35ab472ef
GIT binary patch
literal 1812
zcmc(fPj3@35XI+=#CNdL3!pXuBrXUcl6G5GwB0D#C~&Gaf10k;B-JJ@^vf51&rWtj
z8U$QGE3e1)_|2Q~v%fzytYMD!g3s9pyR_V{ZER2N3A0*@ZDtEwT1G!)#n~J$XGhor
zyR`}SDZ2(%;8WN=<6Cy*_-ie)V=yl8kE~@qJF&JU*0GeiHhqGX*dguI>Sf$2{^K|f
zHdn-2g1&&o%trLirq~O<jJUGoH~(t}eR9azIo`?U5X2jDl+Oef;_!^RJg0wcFYT4R
zv3+b+O&HhM+EcJgf3eQ7W}rK3vM!GbO{@#geoTLdHNx{9mFw919o0$Uko#P3@Snp;
zF{YsCyhik@l};^#<q(f4Otf~-zHmZQ#^Nd#8GIIH9PJVt$87FTUs@2S3SYZNs|a`4
z(ocpOq#`LnEQDP#39+W0^_r!a$y1dN^-(2)($*QYtc!|*+N8w5rBcdQUyC9C$Jyri
z2Su#wrC8FnvX+k5adj@Ls@PvLA5KV|zu~jZ>F2sggPFepgVp}|ssduP+^DORv*aY+
z`dcPVg?!{+_)6EwzTi9?TeV*>Gl2QX4z^b6pj^?aTck`ra_`*grk$Xorkyd4sip3)
z`jpw&-^~<XRk&y8{=Rmw*9cYhV-y|X(e=m)mXxf2jb6Ayt<ksqSfl-o-21ExH6c!l
zS0AsAXLimw22~h(BOERA+%>0|DZcVi)ZlfDm!f~6|HO)z>jp-vD3QmB>~o1zp~uvs
z&AX$RM;mpkG^Ka3;kj#0ZLd^KxILkM7a%2I^gxSv*_z}YR+>~xS^nzV;}mrZCY*eD
rxt!O+0a#*MgWbP-foo;1f0n0S^)4AoLGAKncIEo}JpboQU*-J+Kfe{x

literal 0
HcmV?d00001

diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 89fc630..00c46d4 100644
--- a/MdePkg/MdePkg.dsc
+++ b/MdePkg/MdePkg.dsc
@@ -114,6 +114,7 @@
   MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
   MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
   MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf
+  
+ MdePkg/Library/UefiDebugLibDebugPortProtocol/UefiDebugLibDebugPortProt
+ ocol.inf
   MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf
   MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
   
MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
-- 1.9.4.msysgit.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to