mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-06 15:05:59 +00:00
vm::var improved, cleanup
Mostly vm::var initialization introduced. Added vm::make_var function.
This commit is contained in:
parent
cc02a147d3
commit
a974ee009e
116 changed files with 2763 additions and 3019 deletions
|
|
@ -25,7 +25,7 @@ s32 cellSyncMutexInitialize(vm::ptr<CellSyncMutex> mutex)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
mutex->exchange({});
|
||||
mutex->ctrl.exchange({ 0, 0 });
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -45,10 +45,10 @@ s32 cellSyncMutexLock(PPUThread& ppu, vm::ptr<CellSyncMutex> mutex)
|
|||
}
|
||||
|
||||
// increase acq value and remember its old value
|
||||
const auto order = mutex->atomic_op(&sync_mutex_t::acquire);
|
||||
const auto order = mutex->ctrl.atomic_op(_sync::mutex::acquire);
|
||||
|
||||
// wait until rel value is equal to old acq value
|
||||
vm::wait_op(ppu, mutex.addr(), 4, WRAP_EXPR(mutex->load().rel == order));
|
||||
vm::wait_op(ppu, mutex.addr(), 4, WRAP_EXPR(mutex->ctrl.load().rel == order));
|
||||
|
||||
_mm_mfence();
|
||||
|
||||
|
|
@ -69,7 +69,7 @@ s32 cellSyncMutexTryLock(vm::ptr<CellSyncMutex> mutex)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
if (!mutex->atomic_op(&sync_mutex_t::try_lock))
|
||||
if (!mutex->ctrl.atomic_op(_sync::mutex::try_lock))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
|
@ -91,9 +91,9 @@ s32 cellSyncMutexUnlock(vm::ptr<CellSyncMutex> mutex)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
mutex->atomic_op(&sync_mutex_t::unlock);
|
||||
mutex->ctrl.atomic_op(_sync::mutex::unlock);
|
||||
|
||||
vm::notify_at(mutex.addr(), 4);
|
||||
vm::notify_at(mutex);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -118,7 +118,7 @@ s32 cellSyncBarrierInitialize(vm::ptr<CellSyncBarrier> barrier, u16 total_count)
|
|||
}
|
||||
|
||||
// clear current value, write total_count and sync
|
||||
barrier->exchange({ 0, total_count });
|
||||
barrier->ctrl.exchange({ 0, total_count });
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -137,9 +137,9 @@ s32 cellSyncBarrierNotify(PPUThread& ppu, vm::ptr<CellSyncBarrier> barrier)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
vm::wait_op(ppu, barrier.addr(), 4, WRAP_EXPR(barrier->atomic_op(&sync_barrier_t::try_notify)));
|
||||
vm::wait_op(ppu, barrier.addr(), 4, WRAP_EXPR(barrier->ctrl.atomic_op(_sync::barrier::try_notify)));
|
||||
|
||||
vm::notify_at(barrier.addr(), 4);
|
||||
vm::notify_at(barrier);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -160,12 +160,12 @@ s32 cellSyncBarrierTryNotify(vm::ptr<CellSyncBarrier> barrier)
|
|||
|
||||
_mm_mfence();
|
||||
|
||||
if (!barrier->atomic_op(&sync_barrier_t::try_notify))
|
||||
if (!barrier->ctrl.atomic_op(_sync::barrier::try_notify))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
||||
vm::notify_at(barrier.addr(), 4);
|
||||
vm::notify_at(barrier);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -186,9 +186,9 @@ s32 cellSyncBarrierWait(PPUThread& ppu, vm::ptr<CellSyncBarrier> barrier)
|
|||
|
||||
_mm_mfence();
|
||||
|
||||
vm::wait_op(ppu, barrier.addr(), 4, WRAP_EXPR(barrier->atomic_op(&sync_barrier_t::try_wait)));
|
||||
vm::wait_op(ppu, barrier.addr(), 4, WRAP_EXPR(barrier->ctrl.atomic_op(_sync::barrier::try_wait)));
|
||||
|
||||
vm::notify_at(barrier.addr(), 4);
|
||||
vm::notify_at(barrier);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -209,12 +209,12 @@ s32 cellSyncBarrierTryWait(vm::ptr<CellSyncBarrier> barrier)
|
|||
|
||||
_mm_mfence();
|
||||
|
||||
if (!barrier->atomic_op(&sync_barrier_t::try_wait))
|
||||
if (!barrier->ctrl.atomic_op(_sync::barrier::try_wait))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
||||
vm::notify_at(barrier.addr(), 4);
|
||||
vm::notify_at(barrier);
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -239,7 +239,7 @@ s32 cellSyncRwmInitialize(vm::ptr<CellSyncRwm> rwm, vm::ptr<void> buffer, u32 bu
|
|||
}
|
||||
|
||||
// clear readers and writers, write buffer_size, buffer addr and sync
|
||||
rwm->ctrl.store({});
|
||||
rwm->ctrl.store({ 0, 0 });
|
||||
rwm->size = buffer_size;
|
||||
rwm->buffer = buffer;
|
||||
|
||||
|
|
@ -263,18 +263,18 @@ s32 cellSyncRwmRead(PPUThread& ppu, vm::ptr<CellSyncRwm> rwm, vm::ptr<void> buff
|
|||
}
|
||||
|
||||
// wait until `writers` is zero, increase `readers`
|
||||
vm::wait_op(ppu, rwm.addr(), 4, WRAP_EXPR(rwm->ctrl.atomic_op(&sync_rwm_t::try_read_begin)));
|
||||
vm::wait_op(ppu, rwm.addr(), 8, WRAP_EXPR(rwm->ctrl.atomic_op(_sync::rwlock::try_read_begin)));
|
||||
|
||||
// copy data to buffer
|
||||
std::memcpy(buffer.get_ptr(), rwm->buffer.get_ptr(), rwm->size);
|
||||
|
||||
// decrease `readers`, return error if already zero
|
||||
if (!rwm->ctrl.atomic_op(&sync_rwm_t::try_read_end))
|
||||
if (!rwm->ctrl.atomic_op(_sync::rwlock::try_read_end))
|
||||
{
|
||||
return CELL_SYNC_ERROR_ABORT;
|
||||
}
|
||||
|
||||
vm::notify_at(rwm.addr(), 4);
|
||||
vm::notify_at(rwm.ptr(&CellSyncRwm::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -294,7 +294,7 @@ s32 cellSyncRwmTryRead(vm::ptr<CellSyncRwm> rwm, vm::ptr<void> buffer)
|
|||
}
|
||||
|
||||
// increase `readers` if `writers` is zero
|
||||
if (!rwm->ctrl.atomic_op(&sync_rwm_t::try_read_begin))
|
||||
if (!rwm->ctrl.atomic_op(_sync::rwlock::try_read_begin))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
|
@ -303,12 +303,12 @@ s32 cellSyncRwmTryRead(vm::ptr<CellSyncRwm> rwm, vm::ptr<void> buffer)
|
|||
std::memcpy(buffer.get_ptr(), rwm->buffer.get_ptr(), rwm->size);
|
||||
|
||||
// decrease `readers`, return error if already zero
|
||||
if (!rwm->ctrl.atomic_op(&sync_rwm_t::try_read_end))
|
||||
if (!rwm->ctrl.atomic_op(_sync::rwlock::try_read_end))
|
||||
{
|
||||
return CELL_SYNC_ERROR_ABORT;
|
||||
}
|
||||
|
||||
vm::notify_at(rwm.addr(), 4);
|
||||
vm::notify_at(rwm.ptr(&CellSyncRwm::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -328,18 +328,18 @@ s32 cellSyncRwmWrite(PPUThread& ppu, vm::ptr<CellSyncRwm> rwm, vm::cptr<void> bu
|
|||
}
|
||||
|
||||
// wait until `writers` is zero, set to 1
|
||||
vm::wait_op(ppu, rwm.addr(), 4, WRAP_EXPR(rwm->ctrl.atomic_op(&sync_rwm_t::try_write_begin)));
|
||||
vm::wait_op(ppu, rwm.addr(), 8, WRAP_EXPR(rwm->ctrl.atomic_op(_sync::rwlock::try_write_begin)));
|
||||
|
||||
// wait until `readers` is zero
|
||||
vm::wait_op(ppu, rwm.addr(), 4, WRAP_EXPR(!rwm->ctrl.load().readers));
|
||||
vm::wait_op(ppu, rwm.addr(), 8, WRAP_EXPR(!rwm->ctrl.load().readers));
|
||||
|
||||
// copy data from buffer
|
||||
std::memcpy(rwm->buffer.get_ptr(), buffer.get_ptr(), rwm->size);
|
||||
|
||||
// sync and clear `readers` and `writers`
|
||||
rwm->ctrl.exchange({});
|
||||
rwm->ctrl.exchange({ 0, 0 });
|
||||
|
||||
vm::notify_at(rwm.addr(), 4);
|
||||
vm::notify_at(rwm.ptr(&CellSyncRwm::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -368,9 +368,9 @@ s32 cellSyncRwmTryWrite(vm::ptr<CellSyncRwm> rwm, vm::cptr<void> buffer)
|
|||
std::memcpy(rwm->buffer.get_ptr(), buffer.get_ptr(), rwm->size);
|
||||
|
||||
// sync and clear `readers` and `writers`
|
||||
rwm->ctrl.exchange({});
|
||||
rwm->ctrl.exchange({ 0, 0 });
|
||||
|
||||
vm::notify_at(rwm.addr(), 4);
|
||||
vm::notify_at(rwm.ptr(&CellSyncRwm::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -400,7 +400,7 @@ s32 cellSyncQueueInitialize(vm::ptr<CellSyncQueue> queue, vm::ptr<u8> buffer, u3
|
|||
}
|
||||
|
||||
// clear sync var, write size, depth, buffer addr and sync
|
||||
queue->ctrl.store({});
|
||||
queue->ctrl.store({ 0, 0 });
|
||||
queue->size = size;
|
||||
queue->depth = depth;
|
||||
queue->buffer = buffer;
|
||||
|
|
@ -428,15 +428,15 @@ s32 cellSyncQueuePush(PPUThread& ppu, vm::ptr<CellSyncQueue> queue, vm::cptr<voi
|
|||
|
||||
u32 position;
|
||||
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(&sync_queue_t::try_push_begin, depth, position)));
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_push_begin, depth, position)));
|
||||
|
||||
// copy data from the buffer at the position
|
||||
std::memcpy(&queue->buffer[position * queue->size], buffer.get_ptr(), queue->size);
|
||||
|
||||
// clear 5th byte
|
||||
queue->ctrl &= { 0xffffffff, 0x00ffffff };
|
||||
// ...push_end
|
||||
queue->ctrl._and_not({ 0, 0xff000000 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -459,7 +459,7 @@ s32 cellSyncQueueTryPush(vm::ptr<CellSyncQueue> queue, vm::cptr<void> buffer)
|
|||
|
||||
u32 position;
|
||||
|
||||
if (!queue->ctrl.atomic_op(&sync_queue_t::try_push_begin, depth, position))
|
||||
if (!queue->ctrl.atomic_op(_sync::queue::try_push_begin, depth, position))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
|
@ -467,10 +467,10 @@ s32 cellSyncQueueTryPush(vm::ptr<CellSyncQueue> queue, vm::cptr<void> buffer)
|
|||
// copy data from the buffer at the position
|
||||
std::memcpy(&queue->buffer[position * queue->size], buffer.get_ptr(), queue->size);
|
||||
|
||||
// clear 5th byte
|
||||
queue->ctrl &= { 0xffffffff, 0x00ffffff };
|
||||
// ...push_end
|
||||
queue->ctrl._and_not({ 0, 0xff000000 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -493,15 +493,15 @@ s32 cellSyncQueuePop(PPUThread& ppu, vm::ptr<CellSyncQueue> queue, vm::ptr<void>
|
|||
|
||||
u32 position;
|
||||
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(&sync_queue_t::try_pop_begin, depth, position)));
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_pop_begin, depth, position)));
|
||||
|
||||
// copy data at the position to the buffer
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position * queue->size], queue->size);
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size);
|
||||
|
||||
// clear first byte
|
||||
queue->ctrl &= { 0x00ffffff, 0xffffffffu };
|
||||
// ...pop_end
|
||||
queue->ctrl._and_not({ 0xff000000, 0 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -524,18 +524,18 @@ s32 cellSyncQueueTryPop(vm::ptr<CellSyncQueue> queue, vm::ptr<void> buffer)
|
|||
|
||||
u32 position;
|
||||
|
||||
if (!queue->ctrl.atomic_op(&sync_queue_t::try_pop_begin, depth, position))
|
||||
if (!queue->ctrl.atomic_op(_sync::queue::try_pop_begin, depth, position))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
||||
// copy data at the position to the buffer
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position * queue->size], queue->size);
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size);
|
||||
|
||||
// clear first byte
|
||||
queue->ctrl &= { 0x00ffffff, 0xffffffffu };
|
||||
// ...pop_end
|
||||
queue->ctrl._and_not({ 0xff000000, 0 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -558,15 +558,15 @@ s32 cellSyncQueuePeek(PPUThread& ppu, vm::ptr<CellSyncQueue> queue, vm::ptr<void
|
|||
|
||||
u32 position;
|
||||
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(&sync_queue_t::try_peek_begin, depth, position)));
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_peek_begin, depth, position)));
|
||||
|
||||
// copy data at the position to the buffer
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position * queue->size], queue->size);
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size);
|
||||
|
||||
// clear first byte
|
||||
queue->ctrl &= { 0x00ffffff, 0xffffffffu };
|
||||
// ...peek_end
|
||||
queue->ctrl._and_not({ 0xff000000, 0 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -589,18 +589,18 @@ s32 cellSyncQueueTryPeek(vm::ptr<CellSyncQueue> queue, vm::ptr<void> buffer)
|
|||
|
||||
u32 position;
|
||||
|
||||
if (!queue->ctrl.atomic_op(&sync_queue_t::try_peek_begin, depth, position))
|
||||
if (!queue->ctrl.atomic_op(_sync::queue::try_peek_begin, depth, position))
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
|
||||
// copy data at the position to the buffer
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position * queue->size], queue->size);
|
||||
std::memcpy(buffer.get_ptr(), &queue->buffer[position % depth * queue->size], queue->size);
|
||||
|
||||
// clear first byte
|
||||
queue->ctrl &= { 0x00ffffff, 0xffffffffu };
|
||||
// ...peek_end
|
||||
queue->ctrl._and_not({ 0xff000000, 0 });
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -619,9 +619,9 @@ s32 cellSyncQueueSize(vm::ptr<CellSyncQueue> queue)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
queue->check_depth();
|
||||
const u32 depth = queue->check_depth();
|
||||
|
||||
return queue->ctrl.load().m_v2 & 0xffffff;
|
||||
return queue->ctrl.load().count & 0xffffff;
|
||||
}
|
||||
|
||||
s32 cellSyncQueueClear(PPUThread& ppu, vm::ptr<CellSyncQueue> queue)
|
||||
|
|
@ -638,15 +638,14 @@ s32 cellSyncQueueClear(PPUThread& ppu, vm::ptr<CellSyncQueue> queue)
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
queue->check_depth();
|
||||
const u32 depth = queue->check_depth();
|
||||
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(&sync_queue_t::try_clear_begin_1)));
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_clear_begin_1)));
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(_sync::queue::try_clear_begin_2)));
|
||||
|
||||
vm::wait_op(ppu, queue.addr(), 8, WRAP_EXPR(queue->ctrl.atomic_op(&sync_queue_t::try_clear_begin_2)));
|
||||
queue->ctrl.exchange({ 0, 0 });
|
||||
|
||||
queue->ctrl.exchange({});
|
||||
|
||||
vm::notify_at(queue.addr(), 8);
|
||||
vm::notify_at(queue.ptr(&CellSyncQueue::ctrl));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
|
@ -715,7 +714,7 @@ s32 cellSyncLFQueueInitialize(vm::ptr<CellSyncLFQueue> queue, vm::cptr<void> buf
|
|||
}
|
||||
}
|
||||
|
||||
if (!depth || (depth >> 15) || direction > 3)
|
||||
if (!depth || depth > 0x7fff || direction > 3)
|
||||
{
|
||||
return CELL_SYNC_ERROR_INVAL;
|
||||
}
|
||||
|
|
@ -759,11 +758,9 @@ s32 cellSyncLFQueueInitialize(vm::ptr<CellSyncLFQueue> queue, vm::cptr<void> buf
|
|||
{
|
||||
if (sdk_ver > 0x17ffff)
|
||||
{
|
||||
auto data = vm::get_ptr<u64>(queue.addr());
|
||||
|
||||
for (u32 i = 0; i < sizeof(CellSyncLFQueue) / sizeof(u64); i++)
|
||||
for (const auto& data : vm::_ref<u64[16]>(queue.addr()))
|
||||
{
|
||||
if (data[i])
|
||||
if (data)
|
||||
{
|
||||
return CELL_SYNC_ERROR_STAT;
|
||||
}
|
||||
|
|
@ -798,7 +795,7 @@ s32 cellSyncLFQueueInitialize(vm::ptr<CellSyncLFQueue> queue, vm::cptr<void> buf
|
|||
{
|
||||
syncLFQueueInitialize(queue, buffer, size, depth, direction, eaSignal);
|
||||
|
||||
queue->init.exchange({});
|
||||
queue->init.exchange(0);
|
||||
}
|
||||
|
||||
return CELL_OK;
|
||||
|
|
@ -1067,7 +1064,7 @@ s32 _cellSyncLFQueuePushBody(PPUThread& ppu, vm::ptr<CellSyncLFQueue> queue, vm:
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
const vm::var<s32> position(ppu);
|
||||
vm::var<s32> position;
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
|
@ -1098,7 +1095,7 @@ s32 _cellSyncLFQueuePushBody(PPUThread& ppu, vm::ptr<CellSyncLFQueue> queue, vm:
|
|||
const s32 size = queue->m_size;
|
||||
const s32 pos = *position;
|
||||
const u32 addr = VM_CAST((u64)((queue->m_buffer.addr() & ~1ull) + size * (pos >= depth ? pos - depth : pos)));
|
||||
std::memcpy(vm::get_ptr<void>(addr), buffer.get_ptr(), size);
|
||||
std::memcpy(vm::base(addr), buffer.get_ptr(), size);
|
||||
|
||||
if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY)
|
||||
{
|
||||
|
|
@ -1373,7 +1370,7 @@ s32 _cellSyncLFQueuePopBody(PPUThread& ppu, vm::ptr<CellSyncLFQueue> queue, vm::
|
|||
return CELL_SYNC_ERROR_ALIGN;
|
||||
}
|
||||
|
||||
const vm::var<s32> position(ppu);
|
||||
vm::var<s32> position;
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
|
@ -1404,7 +1401,7 @@ s32 _cellSyncLFQueuePopBody(PPUThread& ppu, vm::ptr<CellSyncLFQueue> queue, vm::
|
|||
const s32 size = queue->m_size;
|
||||
const s32 pos = *position;
|
||||
const u32 addr = VM_CAST((u64)((queue->m_buffer.addr() & ~1) + size * (pos >= depth ? pos - depth : pos)));
|
||||
std::memcpy(buffer.get_ptr(), vm::get_ptr<void>(addr), size);
|
||||
std::memcpy(buffer.get_ptr(), vm::base(addr), size);
|
||||
|
||||
if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue