mirror of https://github.com/xemu-project/xemu.git
memory: stricter checks prior to unsetting engaged_in_io
engaged_in_io could be unset by an MR with re-entrancy checks disabled. Ensure that only MRs that can set the engaged_in_io flag can unset it. Signed-off-by: Alexander Bulekov <alxndr@bu.edu> Message-Id: <20230516084002.3813836-1-alxndr@bu.edu> Reviewed-by: Darren Kenny <darren.kenny@oracle.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
1afae3b881
commit
3884bf6468
|
@ -534,6 +534,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr,
|
||||||
unsigned access_size;
|
unsigned access_size;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
MemTxResult r = MEMTX_OK;
|
MemTxResult r = MEMTX_OK;
|
||||||
|
bool reentrancy_guard_applied = false;
|
||||||
|
|
||||||
if (!access_size_min) {
|
if (!access_size_min) {
|
||||||
access_size_min = 1;
|
access_size_min = 1;
|
||||||
|
@ -552,6 +553,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr,
|
||||||
return MEMTX_ACCESS_ERROR;
|
return MEMTX_ACCESS_ERROR;
|
||||||
}
|
}
|
||||||
mr->dev->mem_reentrancy_guard.engaged_in_io = true;
|
mr->dev->mem_reentrancy_guard.engaged_in_io = true;
|
||||||
|
reentrancy_guard_applied = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: support unaligned access? */
|
/* FIXME: support unaligned access? */
|
||||||
|
@ -568,7 +570,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr,
|
||||||
access_mask, attrs);
|
access_mask, attrs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mr->dev) {
|
if (mr->dev && reentrancy_guard_applied) {
|
||||||
mr->dev->mem_reentrancy_guard.engaged_in_io = false;
|
mr->dev->mem_reentrancy_guard.engaged_in_io = false;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
|
Loading…
Reference in New Issue