GSP: Fix appending of interrupts to the shared memory buffer

The code was previously appending the interrupt to after the end of the
buffer, instead of at the end.
merge-requests/60/head
Yuri Kunde Schlesner 2015-01-14 03:26:27 +07:00
parent 9e084826b8
commit 7630b31672
2 changed files with 11 additions and 16 deletions

@ -210,12 +210,12 @@ void SignalInterrupt(InterruptId interrupt_id) {
} }
for (int thread_id = 0; thread_id < 0x4; ++thread_id) { for (int thread_id = 0; thread_id < 0x4; ++thread_id) {
InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id); InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id);
interrupt_relay_queue->number_interrupts = interrupt_relay_queue->number_interrupts + 1;
u8 next = interrupt_relay_queue->index; u8 next = interrupt_relay_queue->index;
next += interrupt_relay_queue->number_interrupts; next += interrupt_relay_queue->number_interrupts;
next = next % 0x34; // 0x34 is the number of interrupt slots next = next % 0x34; // 0x34 is the number of interrupt slots
interrupt_relay_queue->number_interrupts += 1;
interrupt_relay_queue->slot[next] = interrupt_id; interrupt_relay_queue->slot[next] = interrupt_id;
interrupt_relay_queue->error_code = 0x0; // No error interrupt_relay_queue->error_code = 0x0; // No error

@ -45,21 +45,16 @@ enum class CommandId : u32 {
/// GSP thread interrupt relay queue /// GSP thread interrupt relay queue
struct InterruptRelayQueue { struct InterruptRelayQueue {
union {
u32 hex;
// Index of last interrupt in the queue // Index of last interrupt in the queue
BitField<0,8,u32> index; u8 index;
// Number of interrupts remaining to be processed by the userland code // Number of interrupts remaining to be processed by the userland code
BitField<8,8,u32> number_interrupts; u8 number_interrupts;
// Error code - zero on success, otherwise an error has occurred // Error code - zero on success, otherwise an error has occurred
BitField<16,8,u32> error_code; u8 error_code;
}; u8 padding1;
u32 unk0; u32 missed_PDC0;
u32 unk1; u32 missed_PDC1;
InterruptId slot[0x34]; ///< Interrupt ID slots InterruptId slot[0x34]; ///< Interrupt ID slots
}; };