aboutsummaryrefslogtreecommitdiffstats
path: root/os/nil/ports/e200/nilcore.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/nil/ports/e200/nilcore.c')
-rw-r--r--os/nil/ports/e200/nilcore.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/os/nil/ports/e200/nilcore.c b/os/nil/ports/e200/nilcore.c
index 410765079..5ca3e40c0 100644
--- a/os/nil/ports/e200/nilcore.c
+++ b/os/nil/ports/e200/nilcore.c
@@ -52,4 +52,57 @@
/* Module exported functions. */
/*===========================================================================*/
+/**
+ * @brief Performs a context switch between two threads.
+ * @details This is the most critical code in any port, this function
+ * is responsible for the context switch between 2 threads.
+ * @note The implementation of this code affects <b>directly</b> the context
+ * switch performance so optimize here as much as you can.
+ */
+#if !defined(__DOXYGEN__)
+__attribute__((naked))
+#endif
+void port_dummy1(void) {
+
+ asm (".global _port_switch");
+ asm ("_port_switch:");
+ asm ("subi %sp, %sp, 80"); /* Size of the intctx structure. */
+ asm ("mflr %r0");
+ asm ("stw %r0, 84(%sp)"); /* LR into the caller frame. */
+ asm ("mfcr %r0");
+ asm ("stw %r0, 0(%sp)"); /* CR. */
+ asm ("stmw %r14, 4(%sp)"); /* GPR14...GPR31. */
+
+ asm ("stw %sp, 12(%r4)"); /* Store swapped-out stack. */
+ asm ("lwz %sp, 12(%r3)"); /* Load swapped-in stack. */
+
+ asm ("lmw %r14, 4(%sp)"); /* GPR14...GPR31. */
+ asm ("lwz %r0, 0(%sp)"); /* CR. */
+ asm ("mtcr %r0");
+ asm ("lwz %r0, 84(%sp)"); /* LR from the caller frame. */
+ asm ("mtlr %r0");
+ asm ("addi %sp, %sp, 80"); /* Size of the intctx structure. */
+ asm ("blr");
+}
+
+/**
+ * @brief Start a thread by invoking its work function.
+ * @details If the work function returns @p chThdExit() is automatically
+ * invoked.
+ */
+#if !defined(__DOXYGEN__)
+__attribute__((naked))
+#endif
+void port_dummy2(void) {
+
+ asm (".global _port_thread_start");
+ asm ("_port_thread_start:");
+ chSysUnlock();
+ asm ("mr %r3, %r31"); /* Thread parameter. */
+ asm ("mtctr %r30");
+ asm ("bctrl"); /* Invoke thread function. */
+ asm ("li %r0, 0");
+ asm ("bl chSysHalt"); /* Thread termination on exit. */
+}
+
/** @} */