--- /dev/null
+// reset-unneeded.S -- Optional Extraneous Reset Code
+// $Id: //depot/rel/Cottonwood/Xtensa/OS/xtos/reset-unneeded.S#2 $
+
+// Copyright (c) 2002-2006 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.
+
+// This file is meant to be included by another, e.g. crt1-***.S .
+// The code it contains is generally not needed, so is kept in a
+// separate file for clarity of other code.
+
+#if XTOS_RESET_UNNEEDED
+ /*
+ * Reset registers that don't really need to be reset,
+ * but may provide more predictability when buggy code
+ * relies on uninitialized state. It might also clear
+ * "X"s a bit earlier in hardware simulations.
+ *
+ * NOTE: This code is by no means exhaustive.
+ * More processor registers/states could be reset if desired.
+ * This is just an example.
+ *
+ * ASSUMPTION: a0 is still zero at this point.
+ */
+
+ // Interrupt initialization.
+ // Because INTENABLE is cleared by the reset vector, clearing the
+ // interrupt-pending register should not be needed. This assumes
+ // that any application setting up an interrupt will register and
+ // clear it before enabling it, which is the recommended sequence.
+ //
+#if XCHAL_HAVE_INTERRUPTS && (XCHAL_INTCLEARABLE_MASK != 0) && !XCHAL_HAVE_FULL_RESET
+ movi a2, XCHAL_INTCLEARABLE_MASK
+ wsr a2, INTCLEAR // clear software and edge-trig ints
+#endif
+
+ // Timer initialization (not strictly required, but sometimes helpful)
+ .macro reset_timer num
+ wsr a0, CCOMPARE_0 + \num
+ .endm
+ iterate 0, XCHAL_NUM_TIMERS-1, reset_timer
+
+# if XCHAL_HAVE_WINDOWED
+ // Windowed address register init -- initialize entire physical AR file
+ movi a0, XCHAL_NUM_AREGS/8 // number of 8-register chunks
+arloop:
+ addi a8, a0, -1 // countdown into next chunk's a0
+ movi a0, 0
+ movi a1, 0
+ movi a2, 0
+ movi a3, 0
+ movi a4, 0
+ movi a5, 0
+ movi a6, 0
+ movi a7, 0
+ rotw 2 // rotate to next chunk
+ bnez a0, arloop
+ // NOTE: WINDOWBASE is back to zero at this point.
+# else /* XCHAL_HAVE_WINDOWED */
+ // Non-windowed address register init
+ movi a1, 0
+ movi a2, 0
+ movi a3, 0
+ movi a4, 0
+ movi a5, 0
+ movi a6, 0
+ movi a7, 0
+ movi a8, 0
+ movi a9, 0
+ movi a10, 0
+ movi a11, 0
+ movi a12, 0
+ movi a13, 0
+ movi a14, 0
+ movi a15, 0
+# endif /* XCHAL_HAVE_WINDOWED */
+ // Now all address registers are zero.
+
+ // Initialize LBEG, LEND, and LCOUNT.
+# if XCHAL_HAVE_LOOPS
+ wsr a0, LCOUNT // note: LCOUNT gets cleared by processor reset
+ wsr a0, LBEG
+ wsr a0, LEND
+# endif
+
+# if XCHAL_HAVE_DEBUG
+ .macro reset_dbreaka num
+ wsr a0, DBREAKA + \num
+ .endm
+ .macro reset_ibreaka num
+ wsr a0, IBREAKA + \num
+ .endm
+ iterate 0, XCHAL_NUM_DBREAK-1, reset_dbreaka
+ iterate 0, XCHAL_NUM_IBREAK-1, reset_ibreaka
+# endif
+
+ // SAR initialization
+ ssai 0
+
+ // Exception initialization
+# if XCHAL_HAVE_EXCEPTIONS
+ wsr a0, EPC+1
+ wsr a0, EXCSAVE+1
+ wsr a0, EXCCAUSE
+# endif
+
+# if XCHAL_HAVE_HIGHLEVEL_INTERRUPTS
+ .macro reset_int num
+ wsr a0, EPC + \num
+ wsr a0, EPS + \num
+ wsr a0, EXCSAVE + \num
+ .endm
+ iterate 2, XCHAL_NUM_INTLEVELS, reset_int
+# endif
+
+ // Booleans initialization
+# if XCHAL_HAVE_BOOLEANS
+ wsr a0, BR
+# endif
+
+ // MAC16 initialization
+# if XCHAL_HAVE_MAC16
+ wsr a0, ACCLO
+ wsr a0, ACCHI
+ wsr a0, M0
+ wsr a0, M1
+ wsr a0, M2
+ wsr a0, M3
+# endif
+
+ // OCD initialization
+# if XCHAL_HAVE_OCD
+ wsr a0, DDR
+# endif
+
+ isync // wait for all the above to take effect
+
+#endif /* XTOS_RESET_UNNEEDED */
+