29 #include <EASTL/functional.h>
37 static inline uint32_t getCop0Status() {
39 asm(
"mfc0 %0, $12 ; nop" :
"=r"(r));
43 static inline void setCop0Status(uint32_t r) {
asm(
"mtc0 %0, $12 ; nop" : :
"r"(r)); }
46 static inline bool fastEnterCriticalSection() {
47 uint32_t sr = Internal::getCop0Status();
48 Internal::setCop0Status(sr & ~0x401);
49 return (sr & 0x401) == 0x401;
52 static inline void fastLeaveCriticalSection() {
53 uint32_t sr = Internal::getCop0Status();
55 Internal::setCop0Status(sr);
58 enum class DMA : unsigned {
69 void abort(
const char* msg);
70 uint32_t openEvent(uint32_t classId, uint32_t spec, uint32_t mode, eastl::function<
void()>&& lambda);
71 unsigned registerDmaEvent(DMA channel, eastl::function<
void()>&& lambda);
72 void enableDma(DMA channel,
unsigned priority = 7);
73 void disableDma(DMA channel);
74 void unregisterDmaEvent(
unsigned slot);
76 void queueCallback(eastl::function<
void()>&& lambda);
77 void queueCallbackFromISR(eastl::function<
void()>&& lambda);
83 void addOnFrame(eastl::function<
void()>&& lambda);
87 inline void assert(
bool condition,
const char* message) {
88 if (!condition) abort(message);