From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.93; helo=mga11.intel.com; envelope-from=liming.gao@intel.com; receiver=edk2-devel@lists.01.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 2597D211D9155 for ; Wed, 27 Mar 2019 19:07:55 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Mar 2019 19:07:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,278,1549958400"; d="scan'208";a="155883316" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga002.fm.intel.com with ESMTP; 27 Mar 2019 19:07:54 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 27 Mar 2019 19:07:55 -0700 Received: from shsmsx105.ccr.corp.intel.com (10.239.4.158) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 27 Mar 2019 19:07:54 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.74]) by SHSMSX105.ccr.corp.intel.com ([169.254.11.113]) with mapi id 14.03.0415.000; Thu, 28 Mar 2019 10:07:52 +0800 From: "Gao, Liming" To: "Gao, Zhichao" , "edk2-devel@lists.01.org" CC: Sean Brogan , Michael Turner , Bret Barkelew Thread-Topic: [PATCH V4 12/17] IntelFramworkModulePkg/PeiDxeDebugLibReportStatusCode: Add new APIs Thread-Index: AQHU3+8x9yigPRka0k+kDGOMrlXiaaYgVg9A Date: Thu, 28 Mar 2019 02:07:52 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E40CDAD@SHSMSX104.ccr.corp.intel.com> References: <20190321140459.18304-1-zhichao.gao@intel.com> <20190321140459.18304-13-zhichao.gao@intel.com> In-Reply-To: <20190321140459.18304-13-zhichao.gao@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH V4 12/17] IntelFramworkModulePkg/PeiDxeDebugLibReportStatusCode: Add new APIs X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Mar 2019 02:07:56 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Liming Gao >-----Original Message----- >From: Gao, Zhichao >Sent: Thursday, March 21, 2019 10:05 PM >To: edk2-devel@lists.01.org >Cc: Gao, Liming ; Sean Brogan >; Michael Turner >; Bret Barkelew > >Subject: [PATCH V4 12/17] >IntelFramworkModulePkg/PeiDxeDebugLibReportStatusCode: Add new APIs > >REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1395 > >Add new APIs' implementation (DebugVPrint, DebugBPrint) >in the DebugLib instance. These APIs would expose print >routines with VaList parameter and BaseList parameter. > >Contributed-under: TianoCore Contribution Agreement 1.1 >Signed-off-by: Zhichao Gao >Cc: Liming Gao >Cc: Sean Brogan >Cc: Michael Turner >Cc: Bret Barkelew >--- > .../PeiDxeDebugLibReportStatusCode/DebugLib.c | 173 >+++++++++++++++++---- > 1 file changed, 145 insertions(+), 28 deletions(-) > >diff --git >a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/De >bugLib.c >b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/De >bugLib.c >index b0445115a9..7ae4edb40d 100644 >--- >a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/De >bugLib.c >+++ >b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/De >bugLib.c >@@ -4,7 +4,7 @@ > Note that if the debug message length is larger than the maximum allowa= ble > record length, then the debug message will be ignored directly. > >- Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
>+ Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the B= SD >License > which accompanies this distribution. The full text of the license may = be >found at >@@ -27,6 +27,12 @@ > #include > #include > >+// >+// VA_LIST can not initialize to NULL for all compiler, so we use this to >+// indicate a null VA_LIST >+// >+VA_LIST mVaListNull; >+ > /** > Prints a debug message to the debug output device if the specified erro= r >level is enabled. > >@@ -52,13 +58,49 @@ DebugPrint ( > IN CONST CHAR8 *Format, > ... > ) >+{ >+ VA_LIST Marker; >+ >+ VA_START (Marker, Format); >+ DebugVPrint (ErrorLevel, Format, Marker); >+ VA_END (Marker); >+} >+ >+/** >+ Prints a debug message to the debug output device if the specified >+ error level is enabled base on Null-terminated format string and a >+ VA_LIST argument list or a BASE_LIST argument list. >+ >+ If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib functio= n >+ GetDebugPrintErrorLevel (), then print the message specified by Format >and >+ the associated variable argument list to the debug output device. >+ >+ Only one list type is used. >+ If BaseListMarker =3D=3D NULL, then use VaListMarker. >+ Otherwise use BaseListMarker and the VaListMarker should be initilized = as >+ mVaListNull. >+ >+ 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 VaListMarker VA_LIST marker for the variable argument list. >+ @param BaseListMarker BASE_LIST marker for the variable argument list= . >+ >+**/ >+VOID >+DebugPrintMarker ( >+ IN UINTN ErrorLevel, >+ IN CONST CHAR8 *Format, >+ IN VA_LIST VaListMarker, >+ IN BASE_LIST BaseListMarker >+ ) > { > UINT64 Buffer[(EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)= ) >+ 1]; > EFI_DEBUG_INFO *DebugInfo; > UINTN TotalSize; > UINTN DestBufferSize; >- VA_LIST VaListMarker; >- BASE_LIST BaseListMarker; >+ BASE_LIST BaseListMarkerPointer; > CHAR8 *FormatString; > BOOLEAN Long; > >@@ -79,25 +121,25 @@ DebugPrint ( > // Note that the passing-in format string and variable parameters will = be >constructed to > // the following layout: > // >- // Buffer->|------------------------| >- // | Padding | 4 bytes >- // DebugInfo->|------------------------| >- // | EFI_DEBUG_INFO | sizeof(EFI_DEBUG_INFO) >- // BaseListMarker->|------------------------| >- // | ... | >- // | variable arguments | 12 * sizeof (UINT64) >- // | ... | >- // |------------------------| >- // | Format String | >- // |------------------------|<- (UINT8 *)Buffer + sizeo= f(Buffer) >+ // Buffer->|------------------------| >+ // | Padding | 4 bytes >+ // DebugInfo->|------------------------| >+ // | EFI_DEBUG_INFO | sizeof(EFI_DEBUG_I= NFO) >+ // BaseListMarkerPointer->|------------------------| >+ // | ... | >+ // | variable arguments | 12 * sizeof (UINT6= 4) >+ // | ... | >+ // |------------------------| >+ // | Format String | >+ // |------------------------|<- (UINT8 *)Buffer = + sizeof(Buffer) > // > TotalSize =3D 4 + sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + Asci= iStrSize >(Format); > > // >- // If the TotalSize is larger than the maximum record size, then return >+ // If the TotalSize is larger than the maximum record size, then trunca= te it. > // > if (TotalSize > sizeof (Buffer)) { >- return; >+ TotalSize =3D sizeof (Buffer); > } > > // >@@ -110,7 +152,7 @@ DebugPrint ( > // > DebugInfo =3D (EFI_DEBUG_INFO *)(Buffer) + 1; > DebugInfo->ErrorLevel =3D (UINT32)ErrorLevel; >- BaseListMarker =3D (BASE_LIST)(DebugInfo + 1); >+ BaseListMarkerPointer =3D (BASE_LIST)(DebugInfo + 1); > FormatString =3D (CHAR8 *)((UINT64 *)(DebugInfo + 1) + 12); > > // >@@ -129,7 +171,6 @@ DebugPrint ( > // of format in DEBUG string, which is followed by the DEBUG format str= ing. > // Here we will process the variable arguments and pack them in this ar= ea. > // >- VA_START (VaListMarker, Format); > for (; *Format !=3D '\0'; Format++) { > // > // Only format with prefix % is processed. >@@ -166,7 +207,11 @@ DebugPrint ( > // '*' in format field means the precision of the field is specif= ied by > // a UINTN argument in the argument list. > // >- BASE_ARG (BaseListMarker, UINTN) =3D VA_ARG (VaListMarker, UINTN)= ; >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, UINTN) =3D VA_ARG (VaListMarke= r, >UINTN); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, UINTN) =3D BASE_ARG >(BaseListMarker, UINTN); >+ } > continue; > } > if (*Format =3D=3D '\0') { >@@ -191,16 +236,36 @@ DebugPrint ( > } > if (*Format =3D=3D 'p' || *Format =3D=3D 'X' || *Format =3D=3D 'x' ||= *Format =3D=3D 'd' || >*Format =3D=3D 'u') { > if (Long) { >- BASE_ARG (BaseListMarker, INT64) =3D VA_ARG (VaListMarker, INT64)= ; >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, INT64) =3D VA_ARG (VaListMarke= r, >INT64); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, INT64) =3D BASE_ARG >(BaseListMarker, INT64); >+ } > } else { >- BASE_ARG (BaseListMarker, int) =3D VA_ARG (VaListMarker, int); >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, int) =3D VA_ARG (VaListMarker,= int); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, int) =3D BASE_ARG (BaseListMar= ker, >int); >+ } > } > } else if (*Format =3D=3D 's' || *Format =3D=3D 'S' || *Format =3D=3D= 'a' || *Format =3D=3D 'g' >|| *Format =3D=3D 't') { >- BASE_ARG (BaseListMarker, VOID *) =3D VA_ARG (VaListMarker, VOID *)= ; >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, VOID *) =3D VA_ARG (VaListMarker= , >VOID *); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, VOID *) =3D BASE_ARG >(BaseListMarker, VOID *); >+ } > } else if (*Format =3D=3D 'c') { >- BASE_ARG (BaseListMarker, UINTN) =3D VA_ARG (VaListMarker, UINTN); >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, UINTN) =3D VA_ARG (VaListMarker, >UINTN); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, UINTN) =3D BASE_ARG >(BaseListMarker, UINTN); >+ } > } else if (*Format =3D=3D 'r') { >- BASE_ARG (BaseListMarker, RETURN_STATUS) =3D VA_ARG (VaListMarker, >RETURN_STATUS); >+ if (BaseListMarker =3D=3D NULL) { >+ BASE_ARG (BaseListMarkerPointer, RETURN_STATUS) =3D VA_ARG >(VaListMarker, RETURN_STATUS); >+ } else { >+ BASE_ARG (BaseListMarkerPointer, RETURN_STATUS) =3D BASE_ARG >(BaseListMarker, RETURN_STATUS); >+ } > } > > // >@@ -208,17 +273,15 @@ DebugPrint ( > // This indicates that the DEBUG() macro is passing in more argument = than >can be handled by > // the EFI_DEBUG_INFO record > // >- ASSERT ((CHAR8 *)BaseListMarker <=3D FormatString); >+ ASSERT ((CHAR8 *)BaseListMarkerPointer <=3D FormatString); > > // > // If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) >allocated bytes, then return > // >- if ((CHAR8 *)BaseListMarker > FormatString) { >- VA_END (VaListMarker); >+ if ((CHAR8 *)BaseListMarkerPointer > FormatString) { > return; > } > } >- VA_END (VaListMarker); > > // > // Send the DebugInfo record >@@ -234,6 +297,60 @@ DebugPrint ( > ); > } > >+/** >+ 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 functio= n >+ 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 VaListMarker VA_LIST marker for the variable argument list. >+ >+**/ >+VOID >+EFIAPI >+DebugVPrint ( >+ IN UINTN ErrorLevel, >+ IN CONST CHAR8 *Format, >+ IN VA_LIST VaListMarker >+ ) >+{ >+ DebugPrintMarker (ErrorLevel, Format, VaListMarker, NULL); >+} >+ >+/** >+ Prints a debug message to the debug output device if the specified >+ error level is enabled. >+ This function use BASE_LIST which would provide a more compatible >+ service than VA_LIST. >+ >+ If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib functio= n >+ 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 BaseListMarker BASE_LIST marker for the variable argument list= . >+ >+**/ >+VOID >+EFIAPI >+DebugBPrint ( >+ IN UINTN ErrorLevel, >+ IN CONST CHAR8 *Format, >+ IN BASE_LIST BaseListMarker >+ ) >+{ >+ DebugPrintMarker (ErrorLevel, Format, mVaListNull, BaseListMarker); >+} >+ > /** > Prints an assert message containing a filename, line number, and descri= ption. > This may be followed by a breakpoint or a dead loop. >-- >2.16.2.windows.1