diff mbox

hw/intc/arm_gicv3: fix an extra left-shift when reading IPRIORITYR

Message ID 20180614054857.26248-1-suratiamol@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Amol Surati June 14, 2018, 5:48 a.m. UTC
When either GICD_IPRIORITYR or GICR_IPRIORITYR is read as a 32-bit
register, the post left-shift operator in the for loop causes an
extra shift after the least significant byte has been placed.

The 32-bit value actually returned is therefore the expected value
shifted left by 8 bits.

Signed-off-by: Amol Surati <suratiamol@gmail.com>
---
 hw/intc/arm_gicv3_dist.c   | 3 ++-
 hw/intc/arm_gicv3_redist.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

Comments

Peter Maydell June 15, 2018, 3:38 p.m. UTC | #1
On 14 June 2018 at 06:48, Amol Surati <suratiamol@gmail.com> wrote:
> When either GICD_IPRIORITYR or GICR_IPRIORITYR is read as a 32-bit
> register, the post left-shift operator in the for loop causes an
> extra shift after the least significant byte has been placed.
>
> The 32-bit value actually returned is therefore the expected value
> shifted left by 8 bits.
>
> Signed-off-by: Amol Surati <suratiamol@gmail.com>

Oops; thanks for the bugfix.

Applied to target-arm.next, thanks.

-- PMM
diff mbox

Patch

diff --git a/hw/intc/arm_gicv3_dist.c b/hw/intc/arm_gicv3_dist.c
index 93fe936862..53c55c5729 100644
--- a/hw/intc/arm_gicv3_dist.c
+++ b/hw/intc/arm_gicv3_dist.c
@@ -441,7 +441,8 @@  static MemTxResult gicd_readl(GICv3State *s, hwaddr offset,
         int i, irq = offset - GICD_IPRIORITYR;
         uint32_t value = 0;
 
-        for (i = irq + 3; i >= irq; i--, value <<= 8) {
+        for (i = irq + 3; i >= irq; i--) {
+            value <<= 8;
             value |= gicd_read_ipriorityr(s, attrs, i);
         }
         *data = value;
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
index 8a8684d76e..3b0ba6de1a 100644
--- a/hw/intc/arm_gicv3_redist.c
+++ b/hw/intc/arm_gicv3_redist.c
@@ -192,7 +192,8 @@  static MemTxResult gicr_readl(GICv3CPUState *cs, hwaddr offset,
         int i, irq = offset - GICR_IPRIORITYR;
         uint32_t value = 0;
 
-        for (i = irq + 3; i >= irq; i--, value <<= 8) {
+        for (i = irq + 3; i >= irq; i--) {
+            value <<= 8;
             value |= gicr_read_ipriorityr(cs, attrs, i);
         }
         *data = value;