[CPU] MMIOHandler IsRangeWatched now returns true if the entire range is watched.
This commit is contained in:
parent
45ba1d0bf3
commit
a1677d34e1
|
@ -240,12 +240,20 @@ bool MMIOHandler::IsRangeWatched(uint32_t physical_address, size_t length) {
|
||||||
for (auto it = access_watches_.begin(); it != access_watches_.end(); ++it) {
|
for (auto it = access_watches_.begin(); it != access_watches_.end(); ++it) {
|
||||||
auto entry = *it;
|
auto entry = *it;
|
||||||
if ((entry->address <= physical_address &&
|
if ((entry->address <= physical_address &&
|
||||||
entry->address + entry->length > physical_address) ||
|
entry->address + entry->length > physical_address + length)) {
|
||||||
(entry->address >= physical_address &&
|
// This range lies entirely within this watch.
|
||||||
entry->address < physical_address + length)) {
|
|
||||||
// This watch lies within the range.
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(DrChat): Check if the range is partially covered, and subtract the
|
||||||
|
// covered portion if it is.
|
||||||
|
if ((entry->address <= physical_address &&
|
||||||
|
entry->address + entry->length > physical_address)) {
|
||||||
|
// The beginning of range lies partially within this watch.
|
||||||
|
} else if ((entry->address < physical_address + length &&
|
||||||
|
entry->address + entry->length > physical_address + length)) {
|
||||||
|
// The ending of this range lies partially within this watch.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -77,7 +77,7 @@ class MMIOHandler {
|
||||||
// Fires and clears any access watches that overlap this range.
|
// Fires and clears any access watches that overlap this range.
|
||||||
void InvalidateRange(uint32_t physical_address, size_t length);
|
void InvalidateRange(uint32_t physical_address, size_t length);
|
||||||
|
|
||||||
// Returns true if /any/ part of this range is watched.
|
// Returns true if /all/ of this range is watched.
|
||||||
bool IsRangeWatched(uint32_t physical_address, size_t length);
|
bool IsRangeWatched(uint32_t physical_address, size_t length);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
Loading…
Reference in New Issue