MdeModulePkg: Add the EFI_PRINT2S_PROTOCOL
Add the EFI_PRINT2S_PROTOCOL as a safe version of the EFI_PRINT2_PROTOCOL, the EFI_PRINT2S_PROTOCOL replaces the following 2 services in EFI_PRINT2_PROTOCOL: UNICODE_VALUE_TO_STRING ASCII_VALUE_TO_STRING with: UNICODE_VALUE_TO_STRING_S ASCII_VALUE_TO_STRING_S The 2 new services perform checks to the input parameters and will return relative status to reflect the check result. Return RETURN_INVALID_PARAMETER when: 1). The input Buffer is NULL. 2). The input BufferSize is greater than (PcdMaximumUnicodeStringLength * sizeof (CHAR16) + 1) for UnicodeValueToStringS or greater than PcdMaximumAsciiStringLength for AsciiValueToStringS. 3). The input Flags is not set properly. 4). The input Width is not smaller than MAXIMUM_VALUE_CHARACTERS. Return RETURN_BUFFER_TOO_SMALL when: 1). The input BufferSize cannot hold the converted value. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
		@@ -1,7 +1,8 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
  This print protocol defines six basic print functions to 
 | 
			
		||||
  print the format unicode and ascii string.
 | 
			
		||||
  Produces EFI_PRINT2_PROTOCOL and EFI_PRINT2S_PROTOCOL.
 | 
			
		||||
  These protocols define basic print functions to  print the format unicode and
 | 
			
		||||
  ascii string.
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
This program and the accompanying materials are licensed and made available under 
 | 
			
		||||
@@ -515,4 +516,149 @@ struct _EFI_PRINT2_PROTOCOL {
 | 
			
		||||
 | 
			
		||||
extern EFI_GUID gEfiPrint2ProtocolGuid;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define EFI_PRINT2S_PROTOCOL_GUID  \
 | 
			
		||||
  { 0xcc252d2, 0xc106, 0x4661, { 0xb5, 0xbd, 0x31, 0x47, 0xa4, 0xf8, 0x1f, 0x92 } }
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Forward reference for pure ANSI compatability
 | 
			
		||||
//
 | 
			
		||||
typedef struct _EFI_PRINT2S_PROTOCOL  EFI_PRINT2S_PROTOCOL;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Converts a decimal value to a Null-terminated Unicode string.
 | 
			
		||||
 | 
			
		||||
  Converts the decimal number specified by Value to a Null-terminated Unicode
 | 
			
		||||
  string specified by Buffer containing at most Width characters. No padding of
 | 
			
		||||
  spaces is ever performed. If Width is 0 then a width of
 | 
			
		||||
  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than
 | 
			
		||||
  Width characters, then only the first Width characters are placed in Buffer.
 | 
			
		||||
  Additional conversion parameters are specified in Flags.
 | 
			
		||||
 | 
			
		||||
  The Flags bit LEFT_JUSTIFY is always ignored.
 | 
			
		||||
  All conversions are left justified in Buffer.
 | 
			
		||||
  If Width is 0, PREFIX_ZERO is ignored in Flags.
 | 
			
		||||
  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and
 | 
			
		||||
  commas are inserted every 3rd digit starting from the right.
 | 
			
		||||
  If RADIX_HEX is set in Flags, then the output buffer will be formatted in
 | 
			
		||||
  hexadecimal format.
 | 
			
		||||
  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in
 | 
			
		||||
  Buffer is a '-'.
 | 
			
		||||
  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then
 | 
			
		||||
  Buffer is padded with '0' characters so the combination of the optional '-'
 | 
			
		||||
  sign character, '0' characters, digit characters for Value, and the
 | 
			
		||||
  Null-terminator add up to Width characters.
 | 
			
		||||
 | 
			
		||||
  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
 | 
			
		||||
  If an error would be returned, then the function will also ASSERT().
 | 
			
		||||
 | 
			
		||||
  @param  Buffer      The pointer to the output buffer for the produced
 | 
			
		||||
                      Null-terminated Unicode string.
 | 
			
		||||
  @param  BufferSize  The size of Buffer in bytes, including the
 | 
			
		||||
                      Null-terminator.
 | 
			
		||||
  @param  Flags       The bitmask of flags that specify left justification,
 | 
			
		||||
                      zero pad, and commas.
 | 
			
		||||
  @param  Value       The 64-bit signed value to convert to a string.
 | 
			
		||||
  @param  Width       The maximum number of Unicode characters to place in
 | 
			
		||||
                      Buffer, not including the Null-terminator.
 | 
			
		||||
 | 
			
		||||
  @retval RETURN_SUCCESS           The decimal value is converted.
 | 
			
		||||
  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted
 | 
			
		||||
                                   value.
 | 
			
		||||
  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.
 | 
			
		||||
                                   If PcdMaximumUnicodeStringLength is not
 | 
			
		||||
                                   zero, and BufferSize is greater than
 | 
			
		||||
                                   (PcdMaximumUnicodeStringLength *
 | 
			
		||||
                                   sizeof (CHAR16) + 1).
 | 
			
		||||
                                   If unsupported bits are set in Flags.
 | 
			
		||||
                                   If both COMMA_TYPE and RADIX_HEX are set in
 | 
			
		||||
                                   Flags.
 | 
			
		||||
                                   If Width >= MAXIMUM_VALUE_CHARACTERS.
 | 
			
		||||
 | 
			
		||||
**/
 | 
			
		||||
typedef
 | 
			
		||||
RETURN_STATUS
 | 
			
		||||
(EFIAPI *UNICODE_VALUE_TO_STRING_S)(
 | 
			
		||||
  IN OUT CHAR16  *Buffer,
 | 
			
		||||
  IN UINTN       BufferSize,
 | 
			
		||||
  IN UINTN       Flags,
 | 
			
		||||
  IN INT64       Value,
 | 
			
		||||
  IN UINTN       Width
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Converts a decimal value to a Null-terminated Ascii string.
 | 
			
		||||
 | 
			
		||||
  Converts the decimal number specified by Value to a Null-terminated Ascii
 | 
			
		||||
  string specified by Buffer containing at most Width characters. No padding of
 | 
			
		||||
  spaces is ever performed. If Width is 0 then a width of
 | 
			
		||||
  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than
 | 
			
		||||
  Width characters, then only the first Width characters are placed in Buffer.
 | 
			
		||||
  Additional conversion parameters are specified in Flags.
 | 
			
		||||
 | 
			
		||||
  The Flags bit LEFT_JUSTIFY is always ignored.
 | 
			
		||||
  All conversions are left justified in Buffer.
 | 
			
		||||
  If Width is 0, PREFIX_ZERO is ignored in Flags.
 | 
			
		||||
  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and
 | 
			
		||||
  commas are inserted every 3rd digit starting from the right.
 | 
			
		||||
  If RADIX_HEX is set in Flags, then the output buffer will be formatted in
 | 
			
		||||
  hexadecimal format.
 | 
			
		||||
  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in
 | 
			
		||||
  Buffer is a '-'.
 | 
			
		||||
  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then
 | 
			
		||||
  Buffer is padded with '0' characters so the combination of the optional '-'
 | 
			
		||||
  sign character, '0' characters, digit characters for Value, and the
 | 
			
		||||
  Null-terminator add up to Width characters.
 | 
			
		||||
 | 
			
		||||
  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
 | 
			
		||||
  If an error would be returned, then the function will also ASSERT().
 | 
			
		||||
 | 
			
		||||
  @param  Buffer      The pointer to the output buffer for the produced
 | 
			
		||||
                      Null-terminated Ascii string.
 | 
			
		||||
  @param  BufferSize  The size of Buffer in bytes, including the
 | 
			
		||||
                      Null-terminator.
 | 
			
		||||
  @param  Flags       The bitmask of flags that specify left justification,
 | 
			
		||||
                      zero pad, and commas.
 | 
			
		||||
  @param  Value       The 64-bit signed value to convert to a string.
 | 
			
		||||
  @param  Width       The maximum number of Ascii characters to place in
 | 
			
		||||
                      Buffer, not including the Null-terminator.
 | 
			
		||||
 | 
			
		||||
  @retval RETURN_SUCCESS           The decimal value is converted.
 | 
			
		||||
  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted
 | 
			
		||||
                                   value.
 | 
			
		||||
  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.
 | 
			
		||||
                                   If PcdMaximumAsciiStringLength is not
 | 
			
		||||
                                   zero, and BufferSize is greater than
 | 
			
		||||
                                   PcdMaximumAsciiStringLength.
 | 
			
		||||
                                   If unsupported bits are set in Flags.
 | 
			
		||||
                                   If both COMMA_TYPE and RADIX_HEX are set in
 | 
			
		||||
                                   Flags.
 | 
			
		||||
                                   If Width >= MAXIMUM_VALUE_CHARACTERS.
 | 
			
		||||
 | 
			
		||||
**/
 | 
			
		||||
typedef
 | 
			
		||||
RETURN_STATUS
 | 
			
		||||
(EFIAPI *ASCII_VALUE_TO_STRING_S)(
 | 
			
		||||
  IN OUT CHAR8   *Buffer,
 | 
			
		||||
  IN  UINTN      BufferSize,
 | 
			
		||||
  IN  UINTN      Flags,
 | 
			
		||||
  IN  INT64      Value,
 | 
			
		||||
  IN  UINTN      Width
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
struct _EFI_PRINT2S_PROTOCOL {
 | 
			
		||||
  UNICODE_BS_PRINT                     UnicodeBSPrint;
 | 
			
		||||
  UNICODE_S_PRINT                      UnicodeSPrint;
 | 
			
		||||
  UNICODE_BS_PRINT_ASCII_FORMAT        UnicodeBSPrintAsciiFormat;
 | 
			
		||||
  UNICODE_S_PRINT_ASCII_FORMAT         UnicodeSPrintAsciiFormat;
 | 
			
		||||
  UNICODE_VALUE_TO_STRING_S            UnicodeValueToStringS;
 | 
			
		||||
  ASCII_BS_PRINT                       AsciiBSPrint;
 | 
			
		||||
  ASCII_S_PRINT                        AsciiSPrint;
 | 
			
		||||
  ASCII_BS_PRINT_UNICODE_FORMAT        AsciiBSPrintUnicodeFormat;
 | 
			
		||||
  ASCII_S_PRINT_UNICODE_FORMAT         AsciiSPrintUnicodeFormat;
 | 
			
		||||
  ASCII_VALUE_TO_STRING_S              AsciiValueToStringS;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern EFI_GUID gEfiPrint2SProtocolGuid;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -427,9 +427,10 @@
 | 
			
		||||
  #  If developer need implement such functionality, they should use BasePeCoffLib.
 | 
			
		||||
  gEfiLoadPeImageProtocolGuid    = { 0x5CB5C776, 0x60D5, 0x45EE, { 0x88, 0x3C, 0x45, 0x27, 0x08, 0xCD, 0x74, 0x3F }}
 | 
			
		||||
 | 
			
		||||
  ## Print protocol defines basic print functions to print the format unicode and ascii string.
 | 
			
		||||
  ## Print protocols define basic print functions to print the format unicode and ascii string.
 | 
			
		||||
  # Include/Protocol/Print2.h
 | 
			
		||||
  gEfiPrint2ProtocolGuid          = { 0xf05976ef, 0x83f1, 0x4f3d, { 0x86, 0x19, 0xf7, 0x59, 0x5d, 0x41, 0xe5, 0x38 } }
 | 
			
		||||
  gEfiPrint2SProtocolGuid         = { 0xcc252d2, 0xc106, 0x4661, { 0xb5, 0xbd, 0x31, 0x47, 0xa4, 0xf8, 0x1f, 0x92 } }
 | 
			
		||||
 | 
			
		||||
  ## This protocol defines the generic memory test interfaces in Dxe phase.
 | 
			
		||||
  # Include/Protocol/GenericMemoryTest.h
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
/** @file
 | 
			
		||||
  This driver produces Print2 protocol layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
  This driver produces Print2 protocols layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
Copyright (c) 2009 - 2017, 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
 | 
			
		||||
@@ -35,6 +35,19 @@ CONST EFI_PRINT2_PROTOCOL mPrint2Protocol = {
 | 
			
		||||
  AsciiValueToString
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CONST EFI_PRINT2S_PROTOCOL mPrint2SProtocol = {
 | 
			
		||||
  UnicodeBSPrint,
 | 
			
		||||
  UnicodeSPrint,
 | 
			
		||||
  UnicodeBSPrintAsciiFormat,
 | 
			
		||||
  UnicodeSPrintAsciiFormat,
 | 
			
		||||
  UnicodeValueToStringS,
 | 
			
		||||
  AsciiBSPrint,
 | 
			
		||||
  AsciiSPrint,
 | 
			
		||||
  AsciiBSPrintUnicodeFormat,
 | 
			
		||||
  AsciiSPrintUnicodeFormat,
 | 
			
		||||
  AsciiValueToStringS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  The user Entry Point for Print module.
 | 
			
		||||
 | 
			
		||||
@@ -59,6 +72,7 @@ PrintEntryPoint (
 | 
			
		||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
			
		||||
                  &mPrintThunkHandle,
 | 
			
		||||
                  &gEfiPrint2ProtocolGuid, &mPrint2Protocol,
 | 
			
		||||
                  &gEfiPrint2SProtocolGuid, &mPrint2SProtocol,
 | 
			
		||||
                  NULL
 | 
			
		||||
                  );
 | 
			
		||||
  ASSERT_EFI_ERROR (Status);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
## @file
 | 
			
		||||
#  Print DXE driver that produces Print2 Protocol.
 | 
			
		||||
#  Print DXE driver that produces Print2 Protocols.
 | 
			
		||||
#
 | 
			
		||||
#  This driver produces Print2 protocol layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
#  This driver produces Print2 protocols layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
#
 | 
			
		||||
#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
#  Copyright (c) 2009 - 2017, 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
 | 
			
		||||
@@ -44,6 +44,7 @@
 | 
			
		||||
 | 
			
		||||
[Protocols]
 | 
			
		||||
  gEfiPrint2ProtocolGuid    ## PRODUCES
 | 
			
		||||
  gEfiPrint2SProtocolGuid   ## PRODUCES
 | 
			
		||||
 | 
			
		||||
[Depex]
 | 
			
		||||
  TRUE
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
// /** @file
 | 
			
		||||
// Print DXE driver that produces Print2 Protocol.
 | 
			
		||||
// Print DXE driver that produces Print2 Protocols.
 | 
			
		||||
//
 | 
			
		||||
// This driver produces Print2 protocol layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
// This driver produces Print2 protocols layered on top of the PrintLib from the MdePkg.
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
// Copyright (c) 2009 - 2017, 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
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
// **/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#string STR_MODULE_ABSTRACT             #language en-US "Print DXE driver that produces Print2 Protocol"
 | 
			
		||||
#string STR_MODULE_ABSTRACT             #language en-US "Print DXE driver that produces Print2 Protocols"
 | 
			
		||||
 | 
			
		||||
#string STR_MODULE_DESCRIPTION          #language en-US "This driver produces Print2 protocol layered on top of the PrintLib from the MdePkg."
 | 
			
		||||
#string STR_MODULE_DESCRIPTION          #language en-US "This driver produces Print2 protocols layered on top of the PrintLib from the MdePkg."
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user