move sboot to the root directory
[open-ath9k-htc-firmware.git] / sboot / magpie_1_1 / sboot / athos / src / xtos / switch_context.S
diff --git a/sboot/magpie_1_1/sboot/athos/src/xtos/switch_context.S b/sboot/magpie_1_1/sboot/athos/src/xtos/switch_context.S
new file mode 100755 (executable)
index 0000000..c70c0c8
--- /dev/null
@@ -0,0 +1,94 @@
+/* switch_contexts.S - setup for multiple contexts */
+
+/*
+ * Copyright (c) 2003-2010 Tensilica Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <xtensa/coreasm.h>
+#include <xtensa/xtruntime-frames.h>
+
+#if XCHAL_NUM_CONTEXTS > 1
+
+
+/*
+ *  void       _xtos_setup_context(int context_num, StartInfo *info);
+ */
+       .align 4 
+       .global _xtos_setup_context
+       .type _xtos_setup_context,@function
+_xtos_setup_context:
+       abi_entry
+#if XCHAL_HAVE_INTERRUPTS
+       rsil    a5, 15                  /* disable interrupts so we can use EXCSAVE_1 */
+#else
+       rsr     a5, PS                  /* just read PS */
+#endif
+       wsr     a3, EXCSAVE_1           /* save pointer to new context info */
+       s32i    a5, a3, INFO_prevps     /* save previous PS */
+       movi    a4, ~0x01F00000         /* mask out PS.CTXT */
+       slli    a2, a2, 20              /* shift up new PS.CTXT value */
+       and     a4, a5, a4
+       or      a4, a4, a2              /* new PS value */
+       wsr     a4, PS
+       rsync
+       /*  We're now in the new context!  */
+       movi    a0, 0
+       movi    a1, 1
+       wsr     a1, WINDOWSTART
+       wsr     a0, WINDOWBASE
+       rsync
+       rsr     a9, EXCSAVE_1           /* get pointer to context info */
+       movi    a0, 0                   /* terminate call frames */
+       l32i    a1, a9, INFO_sp         /* get stack pointer */
+       l32i    a10, a9, INFO_arg1      /* get start function's arguments... */
+       l32i    a8, a9, INFO_funcpc     /* get start function's address */
+       /*  Okay, now switch back to context zero:  */
+       l32i    a9, a9, INFO_prevps     /* retrieve previous PS */
+       wsr     a9, PS
+       rsync
+       /*  Back to original context!  */
+       abi_return
+
+       .size   _xtos_setup_context, . - _xtos_setup_context
+
+
+
+       /*
+        *  This is the first thing to be executed in the new context
+        *  by explicit setting of PC:
+        */
+       .align 4 
+       .global _xtos_start_context
+_xtos_start_context:
+#ifdef __XTENSA_CALL0_ABI__
+       Crash the assembler here:  I think this is wrong.
+       callx0  a8
+#else
+       callx8  a8
+#endif
+1:     nop
+       j       1b      /* do nothing until context 0 exits */
+       .size   _xtos_start_context, . - _xtos_start_context
+
+
+#endif /* XCHAL_NUM_CONTEXTS > 1 */
+