mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 07:21:25 +12:00
SPU reservations: Do not access violate under vm::writer_lock
TODO: Throw exception when encountering page faults notification enabled memory
This commit is contained in:
parent
fbbad7c851
commit
37513b1898
1 changed files with 8 additions and 4 deletions
|
@ -1655,8 +1655,9 @@ void spu_thread::do_putlluc(const spu_mfc_cmd& args)
|
||||||
{
|
{
|
||||||
// Full lock (heavyweight)
|
// Full lock (heavyweight)
|
||||||
// TODO: vm::check_addr
|
// TODO: vm::check_addr
|
||||||
|
auto& super_data = *vm::get_super_ptr<decltype(rdata)>(addr);
|
||||||
vm::writer_lock lock(addr);
|
vm::writer_lock lock(addr);
|
||||||
mov_rdata(data, to_write);
|
mov_rdata(super_data, to_write);
|
||||||
res.release(res.load() + 127);
|
res.release(res.load() + 127);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1865,13 +1866,14 @@ bool spu_thread::process_mfc_cmd()
|
||||||
if (g_cfg.core.spu_accurate_getllar)
|
if (g_cfg.core.spu_accurate_getllar)
|
||||||
{
|
{
|
||||||
*reinterpret_cast<atomic_t<u32>*>(&data) += 0;
|
*reinterpret_cast<atomic_t<u32>*>(&data) += 0;
|
||||||
|
const auto& super_data = *vm::get_super_ptr<decltype(rdata)>(addr);
|
||||||
|
|
||||||
// Full lock (heavyweight)
|
// Full lock (heavyweight)
|
||||||
// TODO: vm::check_addr
|
// TODO: vm::check_addr
|
||||||
vm::writer_lock lock(addr);
|
vm::writer_lock lock(addr);
|
||||||
|
|
||||||
ntime = old_time;
|
ntime = old_time;
|
||||||
mov_rdata(dst, data);
|
mov_rdata(dst, super_data);
|
||||||
res.release(old_time);
|
res.release(old_time);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1965,13 +1967,15 @@ bool spu_thread::process_mfc_cmd()
|
||||||
{
|
{
|
||||||
*reinterpret_cast<atomic_t<u32>*>(&data) += 0;
|
*reinterpret_cast<atomic_t<u32>*>(&data) += 0;
|
||||||
|
|
||||||
|
auto& super_data = *vm::get_super_ptr<decltype(rdata)>(addr);
|
||||||
|
|
||||||
// Full lock (heavyweight)
|
// Full lock (heavyweight)
|
||||||
// TODO: vm::check_addr
|
// TODO: vm::check_addr
|
||||||
vm::writer_lock lock(addr);
|
vm::writer_lock lock(addr);
|
||||||
|
|
||||||
if (cmp_rdata(rdata, data))
|
if (cmp_rdata(rdata, super_data))
|
||||||
{
|
{
|
||||||
mov_rdata(data, to_write);
|
mov_rdata(super_data, to_write);
|
||||||
res.release(old_time + 128);
|
res.release(old_time + 128);
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue