29#include <EASTL/functional.h>
32#include <source_location>
59static constexpr bool debugMode =
false;
61static constexpr bool debugMode =
true;
65static inline uint32_t getCop0Status() {
68 asm volatile(
"mfc0 %0, $12 ; nop" :
"=r"(
r));
75static inline void setCop0Status(uint32_t
r) {
77 asm(
"mtc0 %0, $12 ; nop" : :
"r"(
r));
81[[noreturn]]
void abort(
const char* msg, std::source_location location = std::source_location::current());
82[[noreturn]]
void abort();
92static inline void fastEnterCriticalSection() {
94 asm volatile(
"mtc0 %0, $12 ; nop ; nop" : :
"r"(0x40000000));
103static inline void fastLeaveCriticalSection() {
105 asm volatile(
"mtc0 %0, $12" : :
"r"(0x40000401));
110static inline void dmaReleaseBarrier() {
__asm__ volatile(
"" :::
"memory"); }
113static inline void dmaAcquireBarrier() {
__asm__ volatile(
"" :::
"memory"); }
126static void waitForStatus(T mask, T expected,
const volatile T*
value) {
127 while ((*
value & mask) != expected);
131enum class DMA :
unsigned {
142enum class IRQ :
unsigned {
160[[noreturn]]
static inline void abort(
const char* msg,
161 std::source_location location = std::source_location::current()) {
162 if constexpr (debugMode) {
164 }
else if constexpr (!debugMode) {
255uint32_t
openEvent(uint32_t classId, uint32_t
spec, uint32_t
mode, eastl::function<
void()>&& lambda);
358void addOnFrame(eastl::function<
void()>&& lambda);
360[[noreturn]]
void crashHandler(uint32_t exceptionCode, uint32_t* kernelRegisters);
366inline void assert(
bool condition,
const char* message,
367 std::source_location location = std::source_location::current()) {
368 if constexpr (debugMode) {
373 }
else if constexpr (!debugMode) {
int irq
Definition cdltest.c:296
The application class.
Definition application.hh:49
uint32_t r
Definition cpu.c:310
__asm__(" .section .text.monitorSlotEntry, \"ax\", @progbits\n" " .align 2\n" " .global monitorSlotEntry\n" " .type monitorSlotEntry, @function\n" " .set push\n" " .set noreorder\n" " .set noat\n" "monitorSlotEntry:\n" " mfc0 $v0, $13\n" " nop\n" " andi $v0, $v0, 0x7c\n" " beqz $v0, 1f\n" " srl $v0, $v0, 2\n" " li $v1, " MON_STR(MON_SLOT_EXCMASK) "\n" " srlv $v1, $v1, $v0\n" " andi $v1, $v1, 1\n" " bnez $v1, 2f\n" " nop\n" " jr $ra\n" " nop\n" "1:\n" MON_SLOT_RX_TEST " jr $ra\n" " nop\n" "2:\n" " sw $a0, 0x10($k0)\n" " sw $a1, 0x14($k0)\n" " sw $a2, 0x18($k0)\n" " sw $a3, 0x1c($k0)\n" " mfc0 $a0, $12\n" " nop\n" " sw $a0, 0x8c($k0)\n" " mfc0 $a1, $13\n" " nop\n" " sw $a1, 0x90($k0)\n" " sw $k1, 0x6c($k0)\n" " sw $s0, 0x40($k0)\n" " sw $s1, 0x44($k0)\n" " sw $s2, 0x48($k0)\n" " sw $s3, 0x4c($k0)\n" " sw $s4, 0x50($k0)\n" " sw $s5, 0x54($k0)\n" " sw $s6, 0x58($k0)\n" " sw $s7, 0x5c($k0)\n" " sw $t0, 0x20($k0)\n" " sw $t1, 0x24($k0)\n" " sw $t2, 0x28($k0)\n" " sw $t3, 0x2c($k0)\n" " sw $t4, 0x30($k0)\n" " sw $t5, 0x34($k0)\n" " sw $t6, 0x38($k0)\n" " sw $t7, 0x3c($k0)\n" " sw $t8, 0x60($k0)\n" " sw $t9, 0x64($k0)\n" " sw $gp, 0x70($k0)\n" " sw $sp, 0x74($k0)\n" " sw $fp, 0x78($k0)\n" " mfhi $a0\n" " nop\n" " sw $a0, 0x84($k0)\n" " mflo $a0\n" " nop\n" " sw $a0, 0x88($k0)\n" " move $s0, $ra\n" " la $sp, monitorSlotStack + " MON_STR(MONITOR_SLOT_STACK_WORDS) " * 4 - 16\n" " jal monitorSlotDispatch\n" " nop\n" " lw $k0, 0x108($zero)\n" " move $ra, $s0\n" " lw $k0, 0($k0)\n" " nop\n" " addiu $k0, $k0, 8\n" " lw $a0, 0x84($k0)\n" " lw $a1, 0x88($k0)\n" " mthi $a0\n" " mtlo $a1\n" " lw $a0, 0x10($k0)\n" " lw $a1, 0x14($k0)\n" " lw $a2, 0x18($k0)\n" " lw $a3, 0x1c($k0)\n" " lw $t0, 0x20($k0)\n" " lw $t1, 0x24($k0)\n" " lw $t2, 0x28($k0)\n" " lw $t3, 0x2c($k0)\n" " lw $t4, 0x30($k0)\n" " lw $t5, 0x34($k0)\n" " lw $t6, 0x38($k0)\n" " lw $t7, 0x3c($k0)\n" " lw $t8, 0x60($k0)\n" " lw $t9, 0x64($k0)\n" " lw $s0, 0x40($k0)\n" " lw $sp, 0x74($k0)\n" " jr $ra\n" " nop\n" " .set pop\n" " .size monitorSlotEntry, . - monitorSlotEntry\n" " .previous\n")
DmaCallback
Definition kernel.hh:38
@ FROM_MAIN_LOOP
Definition kernel.hh:40
@ FROM_ISR
Definition kernel.hh:39
void pumpCallbacks()
Definition kernel.cpp:423
void prepare(Application &)
Definition kernel.cpp:347
void crashHandler(uint32_t exceptionCode, uint32_t *kernelRegisters)
Definition crash-handler.cpp:145
void addOnFrame(eastl::function< void()> &&lambda)
Definition kernel.cpp:449
void beginFrame()
Definition kernel.cpp:453
void addInitializer(eastl::function< void(Application &)> &&lambda)
Definition kernel.cpp:284
void abort()
Definition kernel.cpp:201
uint32_t openEvent(uint32_t classId, uint32_t spec, uint32_t mode, eastl::function< void()> &&lambda)
A C++ wrapper around the openEvent syscall.
Definition kernel.cpp:208
void queueCallbackFromISR(eastl::function< void()> &&lambda)
Queues a callback to be called from the main thead.
Definition kernel.cpp:417
void assert(bool condition, const char *message, std::source_location location=std::source_location::current())
A simple assert macro.
Definition kernel.hh:366
unsigned registerDmaEvent(DMA channel, eastl::function< void()> &&lambda)
Sets an ISR callback for a given DMA channel.
Definition kernel.cpp:217
DMA
Definition kernel.hh:131
void queuePsyqoBreakHandler(eastl::function< bool(uint32_t)> &&handler)
Queues a break handler for psyqo's reserved category.
Definition kernel.cpp:111
void disableDma(DMA channel)
Disables the given DMA channel.
Definition kernel.cpp:253
void installCrashHandler()
Installs a crash handler for the application.
Definition kernel.cpp:172
void setBreakHandler(unsigned category, eastl::function< bool(uint32_t)> &&handler)
Sets a break handler for a given category.
Definition kernel.cpp:105
void flushCache()
Flushes the i-cache.
IRQ
Definition kernel.hh:142
void queueCallback(eastl::function< void()> &&lambda)
Queues a callback to be called from the main thead.
Definition kernel.cpp:410
void unregisterDmaEvent(unsigned slot)
Frees the given DMA callback slot.
Definition kernel.cpp:266
bool isKernelTakenOver()
Returns whether the kernel has been taken over.
Definition kernel.cpp:115
void enableDma(DMA channel, unsigned priority=7)
Enables the given DMA channel.
Definition kernel.cpp:235
void queueIRQHandler(IRQ irq, eastl::function< void()> &&lambda)
Queues an IRQ handler to be called from the exception handler.
Definition kernel.cpp:184
void takeOverKernel()
Takes over the kernel. Can only be called once inside the main function.
Definition kernel.cpp:140
static int value
Definition syscalls.h:553
static uint32_t spec
Definition syscalls.h:393
static uint32_t uint32_t void(* handler)())
Definition syscalls.h:401
static void uint32_t mode
Definition syscalls.h:274