mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-17 08:11:51 +00:00
spu: Simplify watchdog design (PC is purely HLE and occupies SPU code kernel space only, max 256K)
This commit is contained in:
parent
94c1b74a17
commit
582913dc31
@ -59,33 +59,19 @@ namespace spu
|
|||||||
{
|
{
|
||||||
namespace scheduler
|
namespace scheduler
|
||||||
{
|
{
|
||||||
struct executable_block_map
|
std::array<std::atomic<u8>, 65536> atomic_instruction_table = {};
|
||||||
{
|
|
||||||
std::array<std::atomic<u8>, 1024> locations;
|
|
||||||
|
|
||||||
std::atomic<u8>& operator[](u32 offset)
|
|
||||||
{
|
|
||||||
return locations[offset];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//TODO: Only initialize loaded memory blocks to save RAM
|
|
||||||
//TODO: Concurrent spu thread limit can be configurable
|
|
||||||
std::array<executable_block_map, 65536> atomic_instruction_table;
|
|
||||||
constexpr u32 native_jiffy_duration_us = 2000000;
|
constexpr u32 native_jiffy_duration_us = 2000000;
|
||||||
|
|
||||||
void acquire_pc_address(u32 pc, u32 timeout_ms = 3)
|
void acquire_pc_address(u32 pc, u32 timeout_ms = 3)
|
||||||
{
|
{
|
||||||
const u8 max_concurrent_instructions = (u8)g_cfg.core.preferred_spu_threads;
|
const u8 max_concurrent_instructions = (u8)g_cfg.core.preferred_spu_threads;
|
||||||
|
const u32 pc_offset = pc >> 2;
|
||||||
const u32 block = pc >> 12;
|
|
||||||
const u32 offset = (pc & 0xFFF) >> 2;
|
|
||||||
|
|
||||||
if (timeout_ms > 0)
|
if (timeout_ms > 0)
|
||||||
{
|
{
|
||||||
while (timeout_ms--)
|
while (timeout_ms--)
|
||||||
{
|
{
|
||||||
if (atomic_instruction_table[block][offset].load(std::memory_order_consume) >= max_concurrent_instructions)
|
if (atomic_instruction_table[pc_offset].load(std::memory_order_consume) >= max_concurrent_instructions)
|
||||||
std::this_thread::sleep_for(1ms);
|
std::this_thread::sleep_for(1ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,15 +80,14 @@ namespace spu
|
|||||||
std::this_thread::yield();
|
std::this_thread::yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_instruction_table[block][offset]++;
|
atomic_instruction_table[pc_offset]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void release_pc_address(u32 pc)
|
void release_pc_address(u32 pc)
|
||||||
{
|
{
|
||||||
const u32 block = pc >> 12;
|
const u32 pc_offset = pc >> 2;
|
||||||
const u32 offset = (pc & 0xFFF) >> 2;
|
|
||||||
|
|
||||||
atomic_instruction_table[block][offset]--;
|
atomic_instruction_table[pc_offset]--;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct concurrent_execution_watchdog
|
struct concurrent_execution_watchdog
|
||||||
|
Loading…
Reference in New Issue
Block a user