Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RAS/AMD/ATL: Fix bit overflow in denorm_addr_df4_np2()

The hash_pa8 and hashed_bit values in denorm_addr_df4_np2() are
currently defined as u8 types. These variables represent single bits.

'hash_pa8' is set based on logical AND operations using masks with more
than 8 bits. So the calculated value will not fit in this variable. It
will always be '0'. The 'hash_pa8' check later in the function will fail
which produces incorrect results for some cases.

Change these variables to bool type. This clarifies that they are
single bit values. Also, this allows the compiler to ensure they hold
the proper results. Remove an unnecessary shift operation.

[ bp: Remove the unnecessary brackets in the else-branch of the
hash_pa8 assignment. ]

Fixes: 3f3174996be6 ("RAS: Introduce AMD Address Translation Library")
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20240222165449.23582-1-yazen.ghannam@amd.com

authored by

Yazen Ghannam and committed by
Borislav Petkov (AMD)
dd61b55d 6f15e617

+2 -3
+2 -3
drivers/ras/amd/atl/denormalize.c
··· 545 545 unsigned int mod_value, shift_value; 546 546 u16 mask = df_cfg.component_id_mask; 547 547 u64 temp_addr_a, temp_addr_b; 548 - u8 hash_pa8, hashed_bit; 548 + bool hash_pa8, hashed_bit; 549 549 550 550 switch (ctx->map.intlv_mode) { 551 551 case DF4_NPS4_3CHAN_HASH: ··· 577 577 hash_pa8 = BIT_ULL(shift_value) & ctx->ret_addr; 578 578 temp_addr_a = remove_bits(shift_value, shift_value, ctx->ret_addr); 579 579 } else { 580 - hash_pa8 = (ctx->coh_st_fabric_id & df_cfg.socket_id_mask); 581 - hash_pa8 >>= df_cfg.socket_id_shift; 580 + hash_pa8 = ctx->coh_st_fabric_id & df_cfg.socket_id_mask; 582 581 temp_addr_a = ctx->ret_addr; 583 582 } 584 583