Commit 69ae4427 authored by Heyi Guo's avatar Heyi Guo Committed by Manish Pandey
Browse files

drivers/gicv3: fix logical issue for num_eints



In function gicv3_spis_config_defaults(), the variable num_ints is set
to (maximum SPI INTID + 1), while num_eints is set to (maximum ESPI
INTID). It introduces not only inconsistency to the code, but also
logical bug in the "for" loops, for the INTID of num_eints is also
valid and the check should be inclusive.

Fix this by setting num_eints to (maximum ESPI INTID + 1) as well.

Fix similar issues in gicv3_distif_save() and
gicv3_distif_init_restore().
Signed-off-by: default avatarHeyi Guo <guoheyi@linux.alibaba.com>
Change-Id: I4425777d17e84e85f38853603340bd348640154f
parent deb18901
/* /*
* Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -117,7 +117,7 @@ void gicv3_spis_config_defaults(uintptr_t gicd_base) ...@@ -117,7 +117,7 @@ void gicv3_spis_config_defaults(uintptr_t gicd_base)
* Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095 * Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095
*/ */
num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) & num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) &
TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID - 1; TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID;
for (i = MIN_ESPI_ID; i < num_eints; for (i = MIN_ESPI_ID; i < num_eints;
i += (1U << IGROUPR_SHIFT)) { i += (1U << IGROUPR_SHIFT)) {
......
...@@ -757,7 +757,7 @@ void gicv3_distif_save(gicv3_dist_ctx_t * const dist_ctx) ...@@ -757,7 +757,7 @@ void gicv3_distif_save(gicv3_dist_ctx_t * const dist_ctx)
* Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095 * Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095
*/ */
num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) & num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) &
TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID - 1; TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID;
} else { } else {
num_eints = 0U; num_eints = 0U;
} }
...@@ -881,7 +881,7 @@ void gicv3_distif_init_restore(const gicv3_dist_ctx_t * const dist_ctx) ...@@ -881,7 +881,7 @@ void gicv3_distif_init_restore(const gicv3_dist_ctx_t * const dist_ctx)
* Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095 * Maximum ESPI INTID is 32 * (GICD_TYPER.ESPI_range + 1) + 4095
*/ */
num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) & num_eints = ((((typer_reg >> TYPER_ESPI_RANGE_SHIFT) &
TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID - 1; TYPER_ESPI_RANGE_MASK) + 1U) << 5) + MIN_ESPI_ID;
} else { } else {
num_eints = 0U; num_eints = 0U;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment