Skip to content

Instantly share code, notes, and snippets.

@FlyGoat
Last active December 25, 2018 12:54
Show Gist options
  • Save FlyGoat/adf386f469c3fa9e959e0b75c73e7f15 to your computer and use it in GitHub Desktop.
Save FlyGoat/adf386f469c3fa9e959e0b75c73e7f15 to your computer and use it in GitHub Desktop.
kicad-mips_n64-libcontext patch
diff --git a/common/system/libcontext.cpp b/common/system/libcontext.cpp
index 1f1285370..434df15e6 100644
--- a/common/system/libcontext.cpp
+++ b/common/system/libcontext.cpp
@@ -710,3 +710,120 @@ __asm (
);
#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_mips_n64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl jump_fcontext\n"
+".align 2\n"
+".set noreorder\n"
+".type jump_fcontext,@function\n"
+".ent jump_fcontext\n"
+"jump_fcontext:\n"
+" # reserve space on stack\n"
+" daddiu $sp, $sp, -176\n"
+" sd $s0, 64($sp) # save S0\n"
+" sd $s1, 72($sp) # save S1\n"
+" sd $s2, 80($sp) # save S2\n"
+" sd $s3, 88($sp) # save S3\n"
+" sd $s4, 96($sp) # save S4\n"
+" sd $s5, 104($sp) # save S5\n"
+" sd $s6, 112($sp) # save S6\n"
+" sd $s7, 120($sp) # save S7\n"
+" sd $fp, 128($sp) # save FP\n"
+" sd $ra, 144($sp) # save RA\n"
+" sd $ra, 152($sp) # save RA as PC\n"
+" s.d $f24, 0($sp) # save F24\n"
+" s.d $f25, 8($sp) # save F25\n"
+" s.d $f26, 16($sp) # save F26\n"
+" s.d $f27, 24($sp) # save F27\n"
+" s.d $f28, 32($sp) # save F28\n"
+" s.d $f29, 40($sp) # save F29\n"
+" s.d $f30, 48($sp) # save F30\n"
+" s.d $f31, 56($sp) # save F31\n"
+" # store SP (pointing to old context-data) in pointer a0(first arg)\n"
+" sd $sp, 0($a0)\n"
+" # get SP (pointing to new context-data) from a1 param\n"
+" move $sp, $a1\n"
+" l.d $f24, 0($sp) # restore F24\n"
+" l.d $f25, 8($sp) # restore F25\n"
+" l.d $f26, 16($sp) # restore F26\n"
+" l.d $f27, 24($sp) # restore F27\n"
+" l.d $f28, 32($sp) # restore F28\n"
+" l.d $f29, 40($sp) # restore F29\n"
+" l.d $f30, 48($sp) # restore F30\n"
+" l.d $f31, 56($sp) # restore F31\n"
+" ld $s0, 64($sp) # restore S0\n"
+" ld $s1, 72($sp) # restore S1\n"
+" ld $s2, 80($sp) # restore S2\n"
+" ld $s3, 88($sp) # restore S3\n"
+" ld $s4, 96($sp) # restore S4\n"
+" ld $s5, 104($sp) # restore S5\n"
+" ld $s6, 112($sp) # restore S6\n"
+" ld $s7, 120($sp) # restore S7\n"
+" ld $fp, 128($sp) # restore FP\n"
+" ld $ra, 144($sp) # restore RA\n"
+" # load PC\n"
+" ld $t9, 152($sp)\n"
+" sd $a2, 160($sp)\n"
+" # adjust stack\n"
+" daddiu $sp, $sp, 176\n"
+" move $a0, $a2 # move *data from a2 to a0 as param\n"
+" move $v0, $a2 # move *data from a2 to v0 as return\n"
+" # jump to context\n"
+" jr $t9\n"
+" nop\n"
+".end jump_fcontext\n"
+".size jump_fcontext, .-jump_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_mips_n64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl make_fcontext\n"
+".align 2\n"
+".set noreorder\n"
+".type make_fcontext,@function\n"
+".ent make_fcontext\n"
+"make_fcontext:\n"
+"#ifdef __PIC__\n"
+".set noreorder\n"
+".cpload $t9\n"
+".set reorder\n"
+"#endif\n"
+" # shift address in A0 to lower 16 byte boundary\n"
+" li $v1, 0xfffffffffffffff0\n"
+" and $v0, $v1, $a0\n"
+" # reserve space for context-data on context-stack\n"
+" daddiu $v0, $v0, -176\n"
+" # third arg of make_fcontext() == address of context-function\n"
+" sd $a2, 152($v0)\n"
+" # save global pointer in context-data\n"
+" sd $gp, 136($v0)\n"
+" # psudo instruction compute abs address of label finish based on GP\n"
+" dla $t9, finish\n"
+" # save address of finish as return-address for context-function\n"
+" # will be entered after context-function returns\n"
+" sd $t9, 144($v0)\n"
+" jr $ra # return pointer to context-data\n"
+" nop\n"
+"finish:\n"
+" # reload our gp register (needed for la)\n"
+" daddiu $t0, $sp, -176\n"
+" ld $gp, 136($t0)\n"
+" ld $v0, 160($t0)\n"
+" # call _exit(0)\n"
+" dla $t9, _exit\n"
+" move $a0, $zero\n"
+" jr $t9\n"
+" nop\n"
+".end make_fcontext\n"
+".size make_fcontext, .-make_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
diff --git a/include/system/libcontext.h b/include/system/libcontext.h
index e274e4315..e08548733 100644
--- a/include/system/libcontext.h
+++ b/include/system/libcontext.h
@@ -39,6 +39,9 @@
#elif __aarch64__
#define LIBCONTEXT_PLATFORM_linux_arm64
#define LIBCONTEXT_CALL_CONVENTION
+ #elif (__mips__ && _MIPS_SIM == _ABI64)
+ #define LIBCONTEXT_PLATFORM_linux_mips_n64
+ #define LIBCONTEXT_CALL_CONVENTION
#endif
#elif defined(__MINGW32__) || defined(__MINGW64__)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment