diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2014-07-17 10:03:21 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2014-07-17 10:03:21 +0000 |
commit | 6fd6d0670e8e639eb1909ccdb8e1d509db02d6f7 (patch) | |
tree | b97e05eca5439bb88d7816178a13c908fd9fb148 /os/nil/ports/e200/nilcore.c | |
parent | 1272fdce1e9e8d55e5fddf3ae79019ca7836c770 (diff) | |
download | ChibiOS-6fd6d0670e8e639eb1909ccdb8e1d509db02d6f7.tar.gz ChibiOS-6fd6d0670e8e639eb1909ccdb8e1d509db02d6f7.tar.bz2 ChibiOS-6fd6d0670e8e639eb1909ccdb8e1d509db02d6f7.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7039 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/nil/ports/e200/nilcore.c')
-rw-r--r-- | os/nil/ports/e200/nilcore.c | 53 |
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. */
+}
+
/** @} */
|