diff options
| author | Varshit Pandya <varshit.pandya@arm.com> | 2026-08-06 13:46:53 +0100 |
|---|---|---|
| committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2026-08-27 15:14:44 +0000 |
| commit | 125e8f8622b31a773e6aa9bba6ddb69fe2519e0e (patch) | |
| tree | c4262600a92b060d810697757bfe972829073136 /DynamicTablesPkg | |
| parent | f24679c855400cb306f543bf353f102b9120ba7a (diff) | |
| download | edk2-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.c | 6 |
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;
}
|
