public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Zhichao" <zhichao.gao@intel.com>
To: Tomas Pilar <Tomas.Pilar@arm.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Sami.Mujawar@arm.com" <Sami.Mujawar@arm.com>,
	"nd@arm.com" <nd@arm.com>, "Ni, Ray" <ray.ni@intel.com>
Subject: Re: [PATCH 4/8] ShellPkg/AcpiView: Create a logging facility
Date: Fri, 10 Jul 2020 06:26:49 +0000	[thread overview]
Message-ID: <DM6PR11MB44257CE7F683611B3C8BDAFFF6650@DM6PR11MB4425.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20200629152008.685-5-Tomas.Pilar@arm.com>

See below.

> -----Original Message-----
> From: Tomas Pilar <Tomas.Pilar@arm.com>
> Sent: Monday, June 29, 2020 11:20 PM
> To: devel@edk2.groups.io
> Cc: Sami.Mujawar@arm.com; nd@arm.com; Ni, Ray <ray.ni@intel.com>; Gao,
> Zhichao <zhichao.gao@intel.com>
> Subject: [PATCH 4/8] ShellPkg/AcpiView: Create a logging facility
> 
> Extract error and warning logging into separate methods. Fold highlighting and
> other output properties into the logging methods.
> 
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Zhichao Gao <zhichao.gao@intel.com>
> Signed-off-by: Tomas Pilar <tomas.pilar@arm.com>
> ---
>  .../UefiShellAcpiViewCommandLib/AcpiParser.c  |   5 +-
>  .../UefiShellAcpiViewCommandLib/AcpiViewLog.c | 230
> +++++++++++++++++  .../UefiShellAcpiViewCommandLib/AcpiViewLog.h | 233
> ++++++++++++++++++
>  .../UefiShellAcpiViewCommandLib.inf           |   2 +
>  4 files changed, 466 insertions(+), 4 deletions(-)  create mode 100644
> ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.c
>  create mode 100644
> ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.h
> 
> diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> index 7017fa93efae..b88594cf3865 100644
> --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c
> @@ -11,13 +11,10 @@
>  #include "AcpiParser.h"
>  #include "AcpiView.h"
>  #include "AcpiViewConfig.h"
> +#include "AcpiViewLog.h"
> 
>  STATIC UINT32   gIndent;
> 
> -// Publicly accessible error and warning counters.
> -UINT32   mTableErrorCount;
> -UINT32   mTableWarningCount;
> -
>  STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo;
> 
>  /**
> diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.c
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.c
> new file mode 100644
> index 000000000000..9b9aaa855fdc
> --- /dev/null
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.c
> @@ -0,0 +1,230 @@
> +/** @file
> +  'acpiview' logging and output facility
> +
> +  Copyright (c) 2020, ARM Limited. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent **/
> +
> +#include "AcpiViewLog.h"
> +#include "AcpiViewConfig.h"
> +#include "AcpiParser.h"
> +#include <Library/UefiBootServicesTableLib.h>
> +
> +static CHAR16 mOutputBuffer [MAX_OUTPUT_SIZE] = { 0 };
> +
> +// String descriptions of error types
> +static const CHAR16* mErrorTypeDesc [ACPI_ERROR_MAX] = {
> +  L"Not an error",        ///< ACPI_ERROR_NONE
> +  L"Generic",             ///< ACPI_ERROR_GENERIC
> +  L"Checksum",            ///< ACPI_ERROR_CSUM
> +  L"Parsing",             ///< ACPI_ERROR_PARSE
> +  L"Length",              ///< ACPI_ERROR_LENGTH
> +  L"Value",               ///< ACPI_ERROR_VALUE
> +  L"Cross-check",         ///< ACPI_ERROR_CROSS
> +};
> +
> +// Publicly accessible error and warning counters.
> +UINT32   mTableErrorCount;
> +UINT32   mTableWarningCount;
> +
> +/**
> +  Change the attributes of the standard output console
> +  to change the colour of the text according to the given
> +  severity of a log message.
> +
> +  @param[in] Severity          The severity of the log message that is being
> +                               annotated with changed colour text.
> +  @param[in] OriginalAttribute The current attributes of ConOut that will be
> modified.
> +**/
> +static
> +VOID
> +EFIAPI
> +ApplyColor (
> +  IN ACPI_LOG_SEVERITY Severity,
> +  IN UINTN             OriginalAttribute
> +  )
> +{
> +  if (!mConfig.ColourHighlighting) {
> +    return;
> +  }
> +
> +  // Strip the foreground colour
> +  UINTN NewAttribute = OriginalAttribute & 0xF0;
> +
> +  // Add specific foreground colour based on severity  switch
> + (Severity) {  case ACPI_DEBUG:
> +    NewAttribute |= EFI_DARKGRAY;
> +    break;
> +  case ACPI_HIGHLIGHT:
> +    NewAttribute |= EFI_LIGHTBLUE;
> +    break;
> +  case ACPI_GOOD:
> +    NewAttribute |= EFI_GREEN;
> +    break;
> +  case ACPI_ITEM:
> +  case ACPI_WARN:
> +    NewAttribute |= EFI_YELLOW;
> +    break;
> +  case ACPI_BAD:
> +  case ACPI_ERROR:
> +  case ACPI_FATAL:
> +    NewAttribute |= EFI_RED;
> +    break;
> +  case ACPI_INFO:
> +  default:
> +    NewAttribute |= OriginalAttribute;
> +    break;
> +  }
> +
> +  gST->ConOut->SetAttribute (gST->ConOut, NewAttribute); }
> +
> +/**
> +  Restore ConOut text attributes.
> +
> +  @param[in] OriginalAttribute The attribute set that will be restored.
> +**/
> +static
> +VOID
> +EFIAPI
> +RestoreColor(
> +  IN UINTN OriginalAttribute
> +  )
> +{
> +  gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute); }
> +
> +/**
> +  Formats and prints an ascii string to screen.
> +
> +  @param[in] Format String that will be formatted and printed.
> +  @param[in] Marker The marker for variable parameters to be formatted.
> +**/
> +static
> +VOID
> +EFIAPI
> +AcpiViewVSOutput (
> +  IN const CHAR16  *Format,
> +  IN VA_LIST Marker
> +  )
> +{
> +  UnicodeVSPrint (mOutputBuffer, sizeof(mOutputBuffer), Format,
> +Marker);
> +  gST->ConOut->OutputString(gST->ConOut, mOutputBuffer); }
> +
> +/**
> +  Formats and prints and ascii string to screen.
> +
> +  @param[in] Format String that will be formatted and printed.
> +  @param[in] ...    A variable number of parameters that will be formatted.
> +**/
> +VOID
> +EFIAPI
> +AcpiViewOutput (
> +  IN const CHAR16 *Format,
> +  IN ...
> +)

Please align the ')'.

> +{
> +  VA_LIST Marker;
> +  VA_START (Marker, Format);
> +
> +  AcpiViewVSOutput (Format, Marker);
> +
> +  VA_END (Marker);
> +}
> +
> +
> +/**
> +  Prints the base file name given a full file path.
> +
> +  @param[in] FullName Fully qualified file path **/ VOID EFIAPI
> +PrintFileName (
> +  IN const CHAR8* FullName
> +  )
> +{
> +  const CHAR8* Cursor;
> +  UINTN Size;
> +
> +  Cursor = FullName;
> +  Size = 0;
> +
> +  // Find the end point of the string.
> +  while (*Cursor && Cursor < FullName + MAX_OUTPUT_SIZE)
> +    Cursor++;
> +
> +  // Find the rightmost path separator.
> +  while (*Cursor != '\\' && *Cursor != '/' && Cursor > FullName) {
> +    Cursor--;
> +    Size++;
> +  }
> +
> +  // Print base file name.
> +  AcpiViewOutput (L"%.*a", Size - 1, Cursor + 1); }
> +
> +/**
> +  AcpiView output and logging function. Will log the event to
> +  configured output (currently screen) and annotate with colour
> +  and extra metadata.
> +
> +  @param[in] FileName      The full filename of the source file where this
> +                           event occured.
> +  @param[in] FunctionName  The name of the function where this event occured.
> +  @param[in] LineNumber    The line number in the source code where this event
> +                           occured.
> +  @param[in] Severity      The severity of the event that occured.
> +  @param[in] Format        The format of the string describing the event.
> +  @param[in] ...           The variable number of parameters that will format the
> +                           string supplied in Format.
> +**/
> +VOID
> +EFIAPI
> +AcpiViewLog (
> +  IN const CHAR8       *FileName,
> +  IN const CHAR8       *FunctionName,
> +  IN UINTN             LineNumber,
> +  IN ACPI_ERROR_TYPE   Error,
> +  IN ACPI_LOG_SEVERITY Severity,
> +  IN const CHAR16      *Format,
> +  ...)

Align the ')' in the next line.

> +{
> +  VA_LIST         Marker;
> +  UINTN           OriginalAttribute;
> +
> +  OriginalAttribute = gST->ConOut->Mode->Attribute;  ApplyColor
> + (Severity, OriginalAttribute);  VA_START (Marker, Format);
> +
> +  switch (Severity) {
> +  case ACPI_FATAL:
> +    AcpiViewOutput (L"FATAL ");
> +    break;
> +  case ACPI_ERROR:
> +    AcpiViewOutput (L"ERROR[%s] ", mErrorTypeDesc[Error]);
> +    mTableErrorCount++;
> +    break;
> +  case ACPI_WARN:
> +    AcpiViewOutput (L"WARN ");
> +    mTableWarningCount++;
> +    break;
> +  default:
> +    break;
> +  }
> +
> +  if (Severity >= ACPI_WARN) {
> +    AcpiViewOutput (L"(");
> +    PrintFileName (FileName);
> +    AcpiViewOutput (L":%d) ", LineNumber);  }
> +
> +  AcpiViewVSOutput (Format, Marker);
> +  AcpiViewOutput (L"\n");
> +
> +  VA_END (Marker);
> +  RestoreColor (OriginalAttribute);
> +}
> +
> diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.h
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.h
> new file mode 100644
> index 000000000000..77049cd8eec2
> --- /dev/null
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiViewLog.h
> @@ -0,0 +1,233 @@
> +/** @file
> +  Header file for 'acpiview' logging and output facility
> +
> +  Copyright (c) 2020, ARM Limited. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent **/
> +
> +#ifndef ACPI_VIEW_LOG_H_
> +#define ACPI_VIEW_LOG_H_
> +
> +#include <Library/PrintLib.h>
> +
> +/*
> +  Categories of errors that can be logged by AcpiView.
> +*/
> +typedef enum {
> +  ACPI_ERROR_NONE,        ///< Not an error
> +  ACPI_ERROR_GENERIC,     ///< An unspecified error
> +  ACPI_ERROR_CSUM,        ///< A checksum was invalid
> +  ACPI_ERROR_PARSE,       ///< Failed to parse item
> +  ACPI_ERROR_LENGTH,      ///< Size of a thing is incorrect
> +  ACPI_ERROR_VALUE,       ///< The value of a field was incorrect
> +  ACPI_ERROR_CROSS,       ///< A constraint on multiple items was violated
> +  ACPI_ERROR_MAX
> +} ACPI_ERROR_TYPE;
> +
> +/*
> +  Different severities of events that can be logged.
> +*/
> +typedef enum {
> +  ACPI_DEBUG,       ///< Will not be shown unless specified on command line
> +  ACPI_INFO,        ///< Standard output
> +  ACPI_GOOD,        ///< Unspecified good outcome, green colour
> +  ACPI_BAD,         ///< Unspecified bad outcome, red colour
> +  ACPI_ITEM,        ///< Used when describing multiple items
> +  ACPI_HIGHLIGHT,   ///< A new context or section has been entered
> +  ACPI_WARN,        ///< An unusual event happened
> +  ACPI_ERROR,       ///< Acpi table is not conformant
> +  ACPI_FATAL        ///< This will abort program execution.
> +} ACPI_LOG_SEVERITY;
> +
> +// Publicly accessible error and warning counters.
> +extern UINT32   mTableErrorCount;
> +extern UINT32   mTableWarningCount;
> +
> +/**
> +  AcpiView output and logging function. Will log the event to
> +  configured output (currently screen) and annotate with colour
> +  and extra metadata.
> +
> +  @param[in] FileName      The full filename of the source file where this
> +                           event occured.
> +  @param[in] FunctionName  The name of the function where this event occured.
> +  @param[in] LineNumber    The line number in the source code where this event
> +                           occured.
> +  @param[in] Severity      The severity of the event that occured.
> +  @param[in] Error         The type of the erorr reported. May be
> ACPI_ERROR_NONE if the event
> +                           is not an error.
> +  @param[in] Format        The format of the string describing the event.
> +  @param[in] ...           The variable number of parameters that will format the
> +                           string supplied in Format.
> +**/
> +VOID
> +EFIAPI
> +AcpiViewLog (
> +  IN const CHAR8       *FileName,
> +  IN const CHAR8       *FunctionName,
> +  IN UINTN             LineNumber,
> +  IN ACPI_ERROR_TYPE   Error,
> +  IN ACPI_LOG_SEVERITY Severity,
> +  IN const CHAR16            *Format,
> +  ...
> +  );

Align the parameter Format with other parameters.

> +
> +/**
> +  Formats and prints and ascii string to screen.
> +
> +  @param[in] Format String that will be formatted and printed.
> +  @param[in] ...    A variable number of parameters that will be formatted.
> +**/
> +VOID
> +EFIAPI
> +AcpiViewOutput (
> +  IN const CHAR16 *Format,
> +  IN ...
> +  );
> +
> +/**
> +  Check that a buffer has not been overrun by a member. Can be invoked
> +  using the BufferOverrun macro that fills in local source metadata
> +  (first three parameters) for logging purposes.
> +
> +  @param[in] FileName        Source file where this invocation is made
> +  @param[in] FunctionName    Name of the local symbol
> +  @param[in] LineNumber      Source line number of the local call
> +  @param[in] ItemDescription User friendly name for the member being
> checked
> +  @param[in] Position        Memory address of the member
> +  @param[in] Length          Length of the member
> +  @param[in] Buffer          Memory address of the buffer where member resides
> +  @param[in] BufferSize      Size of the buffer where member resides
> +
> +  @retval TRUE               Buffer was overrun
> +  @retval FALSE              Buffer is safe
> +**/
> +static
> +inline
> +BOOLEAN
> +EFIAPI
> +MemberIntegrityInternal (
> +  IN const CHAR8  *FileName,
> +  IN const CHAR8  *FunctionName,
> +  IN UINTN        LineNumber,
> +  IN const CHAR8 *ItemDescription,
> +  IN UINTN        Offset,
> +  IN UINTN        Length,
> +  IN VOID         *Buffer,
> +  IN UINTN        BufferSize)
> +{
> +  if (Length == 0) {
> +    AcpiViewLog (
> +      FileName,
> +      FunctionName,
> +      LineNumber,
> +      ACPI_ERROR_LENGTH,
> +      ACPI_ERROR,
> +      L"%a at %p in buffer %p+%x has zero size!",
> +      ItemDescription,
> +      (UINT8 *)Buffer + Offset,
> +      Buffer,
> +      BufferSize);
> +    return TRUE;
> +  }
> +
> +  if (Offset + Length > BufferSize) {
> +    AcpiViewLog (
> +      FileName,
> +      FunctionName,
> +      LineNumber,
> +      ACPI_ERROR_LENGTH,
> +      ACPI_ERROR,
> +      L"%a %p+%x overruns buffer %p+%x",
> +      ItemDescription,
> +      (UINT8 *) Buffer + Offset,
> +      Length,
> +      Buffer,
> +      BufferSize);
> +  }
> +
> +  return (Offset + Length > BufferSize); }
> +
> +// Determine if a member located at Offset into a Buffer lies entirely
> +// within the BufferSize given the member size is Length // Evaluates
> +to TRUE and logs error if buffer is overrun or if Length is zero
> +#define AssertMemberIntegrity(Offset, Length, Buffer, BufferSize) \
> +  MemberIntegrityInternal (__FILE__, __func__, __LINE__, #Length,
> +Offset, Length, Buffer, BufferSize)
> +
> +
> +/**
> +  Checks that a boolean constraint evaluates correctly. Can be invoked
> +  using the CheckConstraint macro that fills in the source code metadata.
> +
> +  @param[in] FileName        Source file where this invocation is made
> +  @param[in] FunctionName    Name of the local symbol
> +  @param[in] LineNumber      Source line number of the local call
> +  @param[in] ConstraintText  The Source code of the constraint
> +  @param[in] Specification   The specification that imposes the constraint
> +  @param[in] Constraint      The actual constraint
> +  @
> +
> +  @retval TRUE               Constraint is violated
> +  @retval FALSE              Constraint is not violated
> +**/
> +static
> +inline
> +BOOLEAN
> +EFIAPI
> +CheckConstraintInternal (
> +  IN const CHAR8       *FileName,
> +  IN const CHAR8       *FunctionName,
> +  IN UINTN             LineNumber,
> +  IN const CHAR8       *ConstraintText,
> +  IN const CHAR16      *Specification,
> +  IN BOOLEAN           Constraint,
> +  IN ACPI_LOG_SEVERITY Severity
> +)
> +{
> +  if (!Constraint) {
> +    AcpiViewLog (
> +      FileName,
> +      FunctionName,
> +      LineNumber,
> +      Severity == ACPI_ERROR ? ACPI_ERROR_VALUE : ACPI_ERROR_NONE,
> +      Severity,
> +      L"(%a) Constraint was violated: %a",
> +      Specification,
> +      ConstraintText);
> +  }
> +
> +  // Return TRUE if constraint was violated
> +  return !Constraint;
> +}

For this two inline functions:
Refer to CCS_2_1 Section 5.1.9: Do not use the in-line assembler.
Refer to CCS_2_1 Section 5.3.7: include file shall not generate the code or define data variables.

Thanks,
Zhichao

> +
> +// Evaluates to TRUE and logs error if a constraint is violated //
> +Constraint internally cast to BOOLEAN using !!(Constraint) #define
> +AssertConstraint(Specification, Constraint) \
> +  CheckConstraintInternal (                           \
> +    __FILE__, __func__, __LINE__, #Constraint, Specification,
> +!!(Constraint), ACPI_ERROR)
> +
> +// Evaluates to TRUE and logs error if a constraint is violated #define
> +WarnConstraint(Specification, Constraint) \
> +  CheckConstraintInternal (                           \
> +    __FILE__, __func__, __LINE__, #Constraint, Specification,
> +Constraint, ACPI_WARN)
> +
> +
> +// Maximum string size that can be printed #define MAX_OUTPUT_SIZE 256
> +
> +#define _AcpiLog(...) AcpiViewLog(__FILE__, __func__, __LINE__,
> +__VA_ARGS__)
> +
> +// Generic Loging macro, needs severity and formatted string #define
> +AcpiLog(Severity, ...) _AcpiLog(ACPI_ERROR_NONE, Severity, __VA_ARGS__)
> +
> +// Log undecorated text, needs formatted string #define AcpiInfo(...)
> +_AcpiLog(ACPI_ERROR_NONE, ACPI_INFO, __VA_ARGS__)
> +
> +// Log error and increment counter, needs error type and formatted
> +string #define AcpiError(Error, ...) _AcpiLog(Error, ACPI_ERROR,
> +__VA_ARGS__)
> +
> +// Log a FATAL error, needs formatted string #define AcpiFatal(...)
> +_AcpiLog(ACPI_ERROR_GENERIC, ACPI_FATAL, __VA_ARGS__)
> +
> +#endif // ACPI_VIEW_LOG_H_
> diff --git
> a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi
> b.inf
> b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi
> b.inf
> index 91459f9ec632..e0586cbccec2 100644
> ---
> a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi
> b.inf
> +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm
> +++ andLib.inf
> @@ -27,6 +27,8 @@ [Sources.common]
>    AcpiView.h
>    AcpiViewConfig.c
>    AcpiViewConfig.h
> +  AcpiViewLog.h
> +  AcpiViewLog.c
>    Parsers/Bgrt/BgrtParser.c
>    Parsers/Dbg2/Dbg2Parser.c
>    Parsers/Dsdt/DsdtParser.c
> --
> 2.24.1.windows.2
> 


  reply	other threads:[~2020-07-10  6:26 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-29 15:20 [PATCH 0/8] ShellPkg/AcpiView: Refactor Error Logging Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 1/8] ShellPkg/AcpiView: Extract configuration struct Tomas Pilar (tpilar)
2020-07-10  6:15   ` Gao, Zhichao
2020-06-29 15:20 ` [PATCH 2/8] ShellPkg/AcpiView: Declutter error counters Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 3/8] ShellPkg/AcpiView: Modify error message Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 4/8] ShellPkg/AcpiView: Create a logging facility Tomas Pilar (tpilar)
2020-07-10  6:26   ` Gao, Zhichao [this message]
2020-06-29 15:20 ` [PATCH 5/8] ShellPkg/AcpiView: Refactor PrintFieldName Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 6/8] ShellPkg/AcpiView: Refactor dump helpers Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 7/8] ShellPkg/AcpiView: Refactor AcpiView Tomas Pilar (tpilar)
2020-06-29 15:20 ` [PATCH 8/8] ShellPkg/AcpiView: Refactor table parsers Tomas Pilar (tpilar)
2020-07-10  6:42   ` [edk2-devel] " Gao, Zhichao

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=DM6PR11MB44257CE7F683611B3C8BDAFFF6650@DM6PR11MB4425.namprd11.prod.outlook.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