move sboot to the root directory
[open-ath9k-htc-firmware.git] / sboot / magpie_1_1 / sboot / athos / src / xtos / user-vector-min.S
diff --git a/sboot/magpie_1_1/sboot/athos/src/xtos/user-vector-min.S b/sboot/magpie_1_1/sboot/athos/src/xtos/user-vector-min.S
new file mode 100755 (executable)
index 0000000..3ec0f36
--- /dev/null
@@ -0,0 +1,105 @@
+// 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 <xtensa/coreasm.h>
+#include <xtensa/config/system.h>
+#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 */
+