/* 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 #include #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 */