mirror of https://github.com/acidanthera/audk.git
DynamicTablesPkg: add validation for PcdNonBsaCompliant16550SerialHid
According to ACPI 6.4, 6.1.5 _HID states: - A valid PNP ID must be of the form "AAA####" where A is an uppercase letter and # is a hex digit. - A valid ACPI ID must be of the form "NNNN####" where N is an uppercase letter or a digit ('0'-'9') and # is a hex digit. Signed-off-by: Joey Gouly <joey.gouly@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
parent
54211ab10f
commit
16136f218d
|
@ -1,6 +1,6 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.<BR>
|
||||
Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
|
||||
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
|
@ -12,6 +12,18 @@
|
|||
#ifndef TABLE_HELPER_LIB_H_
|
||||
#define TABLE_HELPER_LIB_H_
|
||||
|
||||
/** Is a character upper case
|
||||
*/
|
||||
#define IS_UPPER_CHAR(x) ((x >= 'A') && (x <= 'Z'))
|
||||
|
||||
/** Is a character a decimal digit
|
||||
*/
|
||||
#define IS_DIGIT(x) ((x >= '0') && (x <= '9'))
|
||||
|
||||
/** Is a character an upper case hexadecimal digit
|
||||
*/
|
||||
#define IS_UPPER_HEX(x) (((x >= 'A') && (x <= 'F')) || IS_DIGIT (x))
|
||||
|
||||
/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO
|
||||
object from the Configuration Manager.
|
||||
|
||||
|
@ -120,4 +132,28 @@ AsciiFromHex (
|
|||
IN UINT8 x
|
||||
);
|
||||
|
||||
/** Check if a HID is a valid PNP ID.
|
||||
|
||||
@param [in] Hid The Hid to validate.
|
||||
|
||||
@retval TRUE The Hid is a valid PNP ID.
|
||||
@retval FALSE The Hid is not a valid PNP ID.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidPnpId (
|
||||
IN CONST CHAR8 * Hid
|
||||
);
|
||||
|
||||
/** Check if a HID is a valid ACPI ID.
|
||||
|
||||
@param [in] Hid The Hid to validate.
|
||||
|
||||
@retval TRUE The Hid is a valid ACPI ID.
|
||||
@retval FALSE The Hid is not a valid ACPI ID.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidAcpiId (
|
||||
IN CONST CHAR8 * Hid
|
||||
);
|
||||
|
||||
#endif // TABLE_HELPER_LIB_H_
|
||||
|
|
|
@ -148,6 +148,10 @@ FixupIds (
|
|||
// If there is a non-BSA compliant HID, use that.
|
||||
NonBsaHid = (CONST CHAR8*)PcdGetPtr (PcdNonBsaCompliant16550SerialHid);
|
||||
if ((NonBsaHid != NULL) && (AsciiStrLen (NonBsaHid) != 0)) {
|
||||
if (!(IsValidPnpId (NonBsaHid) || IsValidAcpiId (NonBsaHid))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
HidString = NonBsaHid;
|
||||
CidString = "";
|
||||
} else {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Table Helper
|
||||
|
||||
Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.<BR>
|
||||
Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
|
||||
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
@ -270,3 +270,74 @@ AsciiFromHex (
|
|||
ASSERT (FALSE);
|
||||
return (UINT8)0;
|
||||
}
|
||||
|
||||
/** Check if a HID is a valid PNP ID.
|
||||
|
||||
@param [in] Hid The Hid to validate.
|
||||
|
||||
@retval TRUE The Hid is a valid PNP ID.
|
||||
@retval FALSE The Hid is not a valid PNP ID.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidPnpId (
|
||||
IN CONST CHAR8 * Hid
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
if (AsciiStrLen (Hid) != 7) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// A valid PNP ID must be of the form "AAA####"
|
||||
// where A is an uppercase letter and # is a hex digit.
|
||||
for (Index = 0; Index < 3; Index++) {
|
||||
if (!IS_UPPER_CHAR (Hid[Index])) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
for (Index = 3; Index < 7; Index++) {
|
||||
if (!IS_UPPER_HEX (Hid[Index])) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/** Check if a HID is a valid ACPI ID.
|
||||
|
||||
@param [in] Hid The Hid to validate.
|
||||
|
||||
@retval TRUE The Hid is a valid ACPI ID.
|
||||
@retval FALSE The Hid is not a valid ACPI ID.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidAcpiId (
|
||||
IN CONST CHAR8 * Hid
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
if (AsciiStrLen (Hid) != 8) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// A valid ACPI ID must be of the form "NNNN####"
|
||||
// where N is an uppercase letter or a digit ('0'-'9')
|
||||
// and # is a hex digit.
|
||||
for (Index = 0; Index < 4; Index++) {
|
||||
if (!(IS_UPPER_CHAR (Hid[Index]) || IS_DIGIT (Hid[Index]))) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
for (Index = 4; Index < 8; Index++) {
|
||||
if (!IS_UPPER_HEX (Hid[Index])) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue