Files
2026-02-19 23:28:57 +01:00

49 lines
850 B
C

#include "types.h"
#include "asm.h"
//u32 jump_addr(void *addr);
asm(".globl _jump_addr");
asm("_jump_addr:");
asm("add -4,sp;");
asm("st.w lp,0[sp];");
asm("jal __dojump;");
asm("ld.w 0[sp],lp;");
asm("add 4,sp;");
asm("jmp [lp];");
asm("__dojump:");
asm("jmp [r6];");
void inline set_intlevel(u8 level)
{
asm(
"stsr sr5,r5;"
"movhi 0xFFF1,r0,r6;"
"movea 0xFFFF,r6,r6;"
"and r5,r6;"
"mov %0,r5;"
"andi 0x000F,r5,r5;"
"shl 0x10,r5;"
"or r6,r5;"
"ldsr r5,sr5;"
: /* Output */
: "r" (level) /* Input */
: "r5", "r6" /* Clobber */
);
}
int inline get_intlevel()
{
int level;
asm(
"stsr sr5,r5;"
"shr 0x10,r5;"
"andi 0x000F,r5,r5;"
"mov r5,%0;"
: "=r" (level) /* Output */
: /* Input */
: "r5" /* Clobber */
);
return level;
}