arc: Fix for undefined shift behavior (CID 211523)

find_msb_set() can return 0, resulting in a undefined shift of 255 bits.
Fixes #27319

Signed-off-by: Ruud Derwig <Ruud.Derwig@synopsys.com>
This commit is contained in:
Ruud Derwig 2020-08-18 17:29:27 +02:00 committed by Anas Nashif
commit 80194192d4

View file

@ -29,19 +29,19 @@
static inline void _region_init(uint32_t index, uint32_t region_addr, uint32_t size, static inline void _region_init(uint32_t index, uint32_t region_addr, uint32_t size,
uint32_t region_attr) uint32_t region_attr)
{ {
uint8_t bits = find_msb_set(size) - 1;
index = index * 2U; index = index * 2U;
if (bits < ARC_FEATURE_MPU_ALIGNMENT_BITS) {
bits = ARC_FEATURE_MPU_ALIGNMENT_BITS;
}
if ((1 << bits) < size) {
bits++;
}
if (size > 0) { if (size > 0) {
uint8_t bits = find_msb_set(size) - 1;
if (bits < ARC_FEATURE_MPU_ALIGNMENT_BITS) {
bits = ARC_FEATURE_MPU_ALIGNMENT_BITS;
}
if ((1 << bits) < size) {
bits++;
}
region_attr &= ~(AUX_MPU_RDP_SIZE_MASK); region_attr &= ~(AUX_MPU_RDP_SIZE_MASK);
region_attr |= AUX_MPU_RDP_REGION_SIZE(bits); region_attr |= AUX_MPU_RDP_REGION_SIZE(bits);
region_addr |= AUX_MPU_RDB_VALID_MASK; region_addr |= AUX_MPU_RDB_VALID_MASK;