summaryrefslogtreecommitdiff
path: root/DynamicTablesPkg
diff options
context:
space:
mode:
authorVarshit Pandya <varshit.pandya@arm.com>2026-08-06 13:46:53 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2026-08-27 15:14:44 +0000
commit125e8f8622b31a773e6aa9bba6ddb69fe2519e0e (patch)
treec4262600a92b060d810697757bfe972829073136 /DynamicTablesPkg
parentf24679c855400cb306f543bf353f102b9120ba7a (diff)
downloadedk2-125e8f8622b31a773e6aa9bba6ddb69fe2519e0e.tar.gz
edk2-125e8f8622b31a773e6aa9bba6ddb69fe2519e0e.zip
DynamicTablesPkg/AcpiEinjLib: Fix undefined shift for 64-bit masks
The EINJ generator validates that an instruction mask fits within the register region width by shifting the 64-bit mask by RegisterBitWidth. When RegisterBitWidth is 64, this shifts a UINT64 value by its full width, which is undefined behavior in C. A 64-bit mask always fits within a 64-bit register and does not require this check. Only perform the shift when RegisterBitWidth is less than 64, and reject widths greater than 64 because the EINJ Mask field is 64 bits. Signed-off-by: Varshit Pandya <Varshit.Pandya@arm.com>
Diffstat (limited to 'DynamicTablesPkg')
-rw-r--r--DynamicTablesPkg/Library/Acpi/Common/AcpiEinjLib/EinjGenerator.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiEinjLib/EinjGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiEinjLib/EinjGenerator.c
index 60ff78eaeb..b81f3f643f 100644
--- a/DynamicTablesPkg/Library/Acpi/Common/AcpiEinjLib/EinjGenerator.c
+++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiEinjLib/EinjGenerator.c
@@ -101,7 +101,11 @@ PopulateEinjTable (
return EFI_INVALID_PARAMETER;
}
- if ((Instructions->Mask >> Instructions->RegisterRegion.RegisterBitWidth) != 0) {
+ if ((Instructions->RegisterRegion.RegisterBitWidth > 64) ||
+ ((Instructions->RegisterRegion.RegisterBitWidth < 64) &&
+ ((Instructions->Mask >>
+ Instructions->RegisterRegion.RegisterBitWidth) != 0)))
+ {
return EFI_INVALID_PARAMETER;
}