dev-arm: Fix Bitwise operation in GICv3
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Tue, 23 Apr 2019 15:08:14 +0000 (16:08 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 2 May 2019 12:44:13 +0000 (12:44 +0000)
GICv3 LPI code is wrongly using the xor operator (^) in order to
evaluate powers of two.

Change-Id: Ib1131fd5940d334967a3741f8fd15d86625be356
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18589
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/dev/arm/gic_v3_redistributor.cc

index eb5767a1691a29740ac86e06294b637abb6ae918..348cd9627660ba47101fa28f77a476d49dca33e1 100644 (file)
@@ -675,7 +675,7 @@ Gicv3Redistributor::write(Addr addr, uint64_t data, size_t size,
               lpiIDBits = 0xf;
           }
 
-          uint32_t largest_lpi_id = 2 ^ (lpiIDBits + 1);
+          uint32_t largest_lpi_id = 1 << (lpiIDBits + 1);
           uint32_t number_lpis = largest_lpi_id - SMALLEST_LPI_ID + 1;
           lpiConfigurationTable.resize(number_lpis);
           break;
@@ -699,7 +699,7 @@ Gicv3Redistributor::write(Addr addr, uint64_t data, size_t size,
 
       case GICR_INVLPIR: { // Redistributor Invalidate LPI Register
           uint32_t lpi_id = data & 0xffffffff;
-          uint32_t largest_lpi_id = 2 ^ (lpiIDBits + 1);
+          uint32_t largest_lpi_id = 1 << (lpiIDBits + 1);
 
           if (lpi_id > largest_lpi_id) {
               return;
@@ -830,7 +830,7 @@ Gicv3Redistributor::update()
     }
 
     // Check LPIs
-    uint32_t largest_lpi_id = 2 ^ (lpiIDBits + 1);
+    uint32_t largest_lpi_id = 1 << (lpiIDBits + 1);
     char lpi_pending_table[largest_lpi_id / 8];
     ThreadContext * tc = gic->getSystem()->getThreadContext(cpuId);
     tc->getVirtProxy().readBlob(lpiPendingTablePtr,
@@ -881,7 +881,7 @@ Gicv3Redistributor::setClrLPI(uint64_t data, bool set)
     }
 
     uint32_t lpi_id = data & 0xffffffff;
-    uint32_t largest_lpi_id = 2 ^ (lpiIDBits + 1);
+    uint32_t largest_lpi_id = 1 << (lpiIDBits + 1);
 
     if (lpi_id > largest_lpi_id) {
         // Writes to GICR_SETLPIR or GICR_CLRLPIR have not effect if