ppc: Add cooperative task switching for PowerPC
authorbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Sun, 10 Aug 2008 19:06:11 +0000 (19:06 +0000)
committerbernie <bernie@38d2e660-2303-0410-9eaa-f027e97ec537>
Sun, 10 Aug 2008 19:06:11 +0000 (19:06 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1611 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cpu/attr.h
bertos/emul/switch.S
bertos/emul/switch_ppc.S [new file with mode: 0644]

index bfcb705edb6c1d350fda9c827d8ecda22bb9cc07..289869360294add9dbf0af54ca0ea0507c72ca03 100644 (file)
         */
        #define CPU_IDLE NOP
 
+#elif CPU_PPC
+
+       #define CPU_PUSH_CALL_CONTEXT(sp, func) \
+               do { \
+                       CPU_PUSH_WORD((sp), (cpustack_t)(func)); /* LR -> 8(SP) */ \
+                       CPU_PUSH_WORD((sp), 0);                  /* CR -> 4(SP) */ \
+               } while (0)
+
 #else
        #define CPU_PUSH_CALL_CONTEXT(sp, func) \
                CPU_PUSH_WORD((sp), (cpustack_t)(func))
index ce87cdce3760127c707eabe4b39d9c7e010d7768..50567d193cf5ad0ed19a4da68f62f0a2b82b5679 100644 (file)
@@ -2,6 +2,8 @@
        #include "switch_i386.S"
 #elif defined(__x86_64__)
        #include "switch_x86_64.s"
+#elif defined(_ARCH_PPC) || defined(_ARCH_PPC64)
+       #include "switch_ppc.S"
 #else
        #error Unknown CPU
 #endif
diff --git a/bertos/emul/switch_ppc.S b/bertos/emul/switch_ppc.S
new file mode 100644 (file)
index 0000000..082efa8
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * \file
+ * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
+ * Copyright 2008 Bernie Innocenti <bernie@codewiz.org>
+ * -->
+ *
+ * \version $Id: switch_i386.S 1578 2008-08-08 10:54:40Z bernie $
+ * \author Bernie Innocenti <bernie@codewiz.org>
+ *
+ * \brief PowerPC context switch
+ */
+
+#ifdef __APPLE__
+    //This workaround is necessary to compile under OS X assembler.
+    #define SWITCH_CONTEXT _asm_switch_context
+#else
+    #define SWITCH_CONTEXT asm_switch_context
+#endif
+
+.balign 4
+
+/* void asm_switch_context(void ** new_sp, void ** save_sp) */
+/*                                 r3              r4       */
+.globl SWITCH_CONTEXT
+SWITCH_CONTEXT:
+       mflr    0               /* r0 = lr */
+       stw     0,8(1)          /* store lr at *(sp+8) */
+       stw     1,0(4)          /* *save_sp = sp */
+       lwz     1,0(3)          /* sp = *new_sp */
+       lwz     0,8(1)          /* retrieve lr from *(sp+8) */
+       mtlr    0               /* lr = r0 */
+       blr                     /* return */