A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1#include "mips.h"
2/* s0-s7 not saved as this are callee saved registers
3 * CO_STATUS is not saved as nested interrupts are not supported
4 *
5 * Separate irqstack is used for context save and irq processing
6 * k0 holds the address of the top of this stack and k1 is used
7 * to hold original sp value. Since we do not support nesting
8 * there is nothing to warry about
9 */
10 .extern irqvector
11
12 .global irq_handler
13 .set mips32r2
14 .set noreorder
15 .set noat
16 .section .irq_vector,"ax",%progbits
17
18irq_handler:
19 move k1, sp
20 move sp, k0
21 addiu sp, sp, -84
22
23 /* context save */
24 sw AT, 0(sp)
25 sw v0, 4(sp)
26 sw v1, 8(sp)
27 sw a0, 12(sp)
28 sw a1, 16(sp)
29 sw a2, 20(sp)
30 sw a3, 24(sp)
31 sw t0, 28(sp)
32 sw t1, 32(sp)
33 sw t2, 36(sp)
34 sw t3, 40(sp)
35 sw t4, 44(sp)
36 sw t5, 48(sp)
37 sw t6, 52(sp)
38 sw t7, 56(sp)
39 sw t8, 60(sp)
40 sw t9, 64(sp)
41 sw fp, 68(sp)
42 sw ra, 72(sp)
43
44 mfhi t0
45 mflo t1
46 sw t0, 76(sp)
47 sw t1, 80(sp)
48
49 /* handle interrupt */
50 lui t0, 0xb002 /* INTC base */
51 lw t1, 0(t0) /* INTC_PD */
52 clz t1, t1
53 sll t0, t1, 2 /* offset */
54 la t1, irqvector
55 addu t0, t1, t0 /* irq handler pointer address */
56 lw t0, 0(t0)
57 jalr t0 /* call handler function */
58 nop
59
60 /* context restore */
61 lw t0, 76(sp)
62 lw t1, 80(sp)
63 mthi t0
64 mtlo t1
65
66 lw AT, 0(sp)
67 lw v0, 4(sp)
68 lw v1, 8(sp)
69 lw a0, 12(sp)
70 lw a1, 16(sp)
71 lw a2, 20(sp)
72 lw a3, 24(sp)
73 lw t0, 28(sp)
74 lw t1, 32(sp)
75 lw t2, 36(sp)
76 lw t3, 40(sp)
77 lw t4, 44(sp)
78 lw t5, 48(sp)
79 lw t6, 52(sp)
80 lw t7, 56(sp)
81 lw t8, 60(sp)
82 lw t9, 64(sp)
83 lw fp, 68(sp)
84 lw ra, 72(sp)
85
86 addiu sp, sp, 84
87 move sp, k1
88 eret
89
90 .set reorder
91 .set at