summaryrefslogtreecommitdiff
path: root/src/dev/arm
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/arm')
-rw-r--r--src/dev/arm/gic_v3_redistributor.cc51
-rw-r--r--src/dev/arm/gic_v3_redistributor.hh9
2 files changed, 51 insertions, 9 deletions
diff --git a/src/dev/arm/gic_v3_redistributor.cc b/src/dev/arm/gic_v3_redistributor.cc
index 79de7d55c..0ee6b8adc 100644
--- a/src/dev/arm/gic_v3_redistributor.cc
+++ b/src/dev/arm/gic_v3_redistributor.cc
@@ -860,6 +860,43 @@ Gicv3Redistributor::update()
}
}
+uint8_t
+Gicv3Redistributor::readEntryLPI(uint32_t lpi_id)
+{
+ Addr lpi_pending_entry_ptr = lpiPendingTablePtr + (lpi_id / 8);
+
+ uint8_t lpi_pending_entry;
+ ThreadContext * tc = gic->getSystem()->getThreadContext(cpuId);
+ tc->getPhysProxy().readBlob(lpi_pending_entry_ptr,
+ (uint8_t*) &lpi_pending_entry,
+ sizeof(lpi_pending_entry));
+
+ return lpi_pending_entry;
+}
+
+void
+Gicv3Redistributor::writeEntryLPI(uint32_t lpi_id, uint8_t lpi_pending_entry)
+{
+ Addr lpi_pending_entry_ptr = lpiPendingTablePtr + (lpi_id / 8);
+
+ ThreadContext * tc = gic->getSystem()->getThreadContext(cpuId);
+ tc->getPhysProxy().writeBlob(lpi_pending_entry_ptr,
+ (uint8_t*) &lpi_pending_entry,
+ sizeof(lpi_pending_entry));
+}
+
+bool
+Gicv3Redistributor::isPendingLPI(uint32_t lpi_id)
+{
+ // Fetch the LPI pending entry from memory
+ uint8_t lpi_pending_entry = readEntryLPI(lpi_id);
+
+ uint8_t lpi_pending_entry_bit_position = lpi_id % 8;
+ bool is_set = lpi_pending_entry & (1 << lpi_pending_entry_bit_position);
+
+ return is_set;
+}
+
void
Gicv3Redistributor::setClrLPI(uint64_t data, bool set)
{
@@ -878,12 +915,9 @@ Gicv3Redistributor::setClrLPI(uint64_t data, bool set)
return;
}
- Addr lpi_pending_entry_ptr = lpiPendingTablePtr + (lpi_id / 8);
- uint8_t lpi_pending_entry;
- ThreadContext * tc = gic->getSystem()->getThreadContext(cpuId);
- tc->getPhysProxy().readBlob(lpi_pending_entry_ptr,
- (uint8_t*) &lpi_pending_entry,
- sizeof(lpi_pending_entry));
+ // Fetch the LPI pending entry from memory
+ uint8_t lpi_pending_entry = readEntryLPI(lpi_id);
+
uint8_t lpi_pending_entry_bit_position = lpi_id % 8;
bool is_set = lpi_pending_entry & (1 << lpi_pending_entry_bit_position);
@@ -905,9 +939,8 @@ Gicv3Redistributor::setClrLPI(uint64_t data, bool set)
lpi_pending_entry &= ~(1 << (lpi_pending_entry_bit_position));
}
- tc->getPhysProxy().writeBlob(lpi_pending_entry_ptr,
- (uint8_t*) &lpi_pending_entry,
- sizeof(lpi_pending_entry));
+ writeEntryLPI(lpi_id, lpi_pending_entry);
+
updateAndInformCPUInterface();
}
diff --git a/src/dev/arm/gic_v3_redistributor.hh b/src/dev/arm/gic_v3_redistributor.hh
index 0e99b746d..6aff91db5 100644
--- a/src/dev/arm/gic_v3_redistributor.hh
+++ b/src/dev/arm/gic_v3_redistributor.hh
@@ -190,8 +190,17 @@ class Gicv3Redistributor : public Serializable
return cpuInterface;
}
+ uint32_t
+ processorNumber() const
+ {
+ return cpuId;
+ }
+
Gicv3::GroupId getIntGroup(int int_id) const;
Gicv3::IntStatus intStatus(uint32_t int_id) const;
+ uint8_t readEntryLPI(uint32_t intid);
+ void writeEntryLPI(uint32_t intid, uint8_t lpi_entry);
+ bool isPendingLPI(uint32_t intid);
void setClrLPI(uint64_t data, bool set);
void reset();
void sendSGI(uint32_t int_id, Gicv3::GroupId group, bool ns);