// user-vector-min.S - Minimal User Vector for General Exceptions // Takes less table space, but does not allow registering new handlers. // $Id: //depot/rel/Cottonwood/Xtensa/OS/xtos/user-vector-min.S#3 $ // Copyright (c) 2003-2004, 2006-2007, 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 #include "xtos-internal.h" #if XCHAL_HAVE_EXCEPTIONS // Vector code .begin literal_prefix .UserExceptionVector .section .UserExceptionVector.text, "ax" .align 4 .global _UserExceptionVector _UserExceptionVector: # if ((XSHAL_USER_VECTOR_SIZE >= 28) && XCHAL_HAVE_DENSITY) || XSHAL_VECTORS_PACKED addi a1, a1, -ESF_TOTALSIZE // allocate exception stack frame, etc. s32i a2, a1, UEXC_a2 s32i a3, a1, UEXC_a3 rsr a2, EXCCAUSE // get exception cause movi a3, _xtos_min_handler_table bgeui a2, 6, 1f // causes 6 and above map to zero addx4 a3, a2, a3 // index by cause if 1 .. 5 1: l32i a3, a3, 0 s32i a4, a1, UEXC_a4 jx a3 // jump to cause-specific handler .size _UserExceptionVector, . - _UserExceptionVector .end literal_prefix # else /*vector as small as 12 bytes:*/ addi a1, a1, -ESF_TOTALSIZE // allocate exception stack frame, etc. s32i a2, a1, UEXC_a2 movi a2, _UserExceptionFromVector // load user exception handler address //interlock jx a2 // jump to handler .size _UserExceptionVector, . - _UserExceptionVector .end literal_prefix // Dispatch outside vector: .text .align 4 .global _UserExceptionFromVector _UserExceptionFromVector: rsr a2, EXCCAUSE // get exception cause s32i a3, a1, UEXC_a3 movi a3, _xtos_min_handler_table bgeui a2, 6, 1f // causes 6 and above map to zero addx4 a3, a2, a3 // index by cause if 1 .. 5 1: l32i a3, a3, 0 s32i a4, a1, UEXC_a4 jx a3 // jump to cause-specific handler .size _UserExceptionFromVector, . - _UserExceptionFromVector # endif /*XEA2*/ /* * Read-only minimal table of assembly-level exception handlers * for user vectored exceptions. * Only provides entries for SYSCALL, MOVSP, and level-1 interrupt causes. */ .section .rodata, "a" .global _xtos_min_handler_table .align 4 _xtos_min_handler_table: .word _xtos_unhandled_exception // 0 Illegal Instruction, and causes > 5 .word _xtos_syscall_handler // 1 SYSCALL Instruction .word _xtos_unhandled_exception // 2 Instruction Fetch Error .word _xtos_unhandled_exception // 3 Load/Store Error # if XCHAL_HAVE_INTERRUPTS .word _xtos_l1int_handler // 4 Level-1 Interrupt # else .word _xtos_unhandled_exception // 4 Level-1 Interrupt (not configured) # endif .word _xtos_alloca_handler // 5 Alloca (MOVSP Instruction) .text #endif /* XCHAL_HAVE_EXCEPTIONS */