| /* |
| * Xtensa Secondary Processors startup code. |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Copyright (C) 2001 - 2013 Tensilica Inc. |
| * |
| * Joe Taylor <joe@tensilica.com> |
| * Chris Zankel <chris@zankel.net> |
| * Marc Gauthier <marc@tensilica.com, marc@alumni.uwaterloo.ca> |
| * Pete Delaney <piet@tensilica.com> |
| */ |
| |
| #include <linux/linkage.h> |
| |
| #include <asm/cacheasm.h> |
| #include <asm/initialize_mmu.h> |
| #include <asm/mxregs.h> |
| #include <asm/regs.h> |
| |
| |
| .section .SecondaryResetVector.text, "ax" |
| |
| |
| ENTRY(_SecondaryResetVector) |
| _j _SetupOCD |
| |
| .begin no-absolute-literals |
| .literal_position |
| |
| _SetupOCD: |
| /* |
| * Initialize WB, WS, and clear PS.EXCM (to allow loop instructions). |
| * Set Interrupt Level just below XCHAL_DEBUGLEVEL to allow |
| * xt-gdb to single step via DEBUG exceptions received directly |
| * by ocd. |
| */ |
| movi a1, 1 |
| movi a0, 0 |
| wsr a1, windowstart |
| wsr a0, windowbase |
| rsync |
| |
| movi a1, LOCKLEVEL |
| wsr a1, ps |
| rsync |
| |
| _SetupMMU: |
| Offset = _SetupMMU - _SecondaryResetVector |
| |
| #ifdef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX |
| initialize_mmu |
| #endif |
| |
| /* |
| * Start Secondary Processors with NULL pointer to boot params. |
| */ |
| movi a2, 0 # a2 == NULL |
| movi a3, _startup |
| jx a3 |
| |
| .end no-absolute-literals |
| |
| |
| .section .SecondaryResetVector.remapped_text, "ax" |
| .global _RemappedSecondaryResetVector |
| |
| .org 0 # Need to do org before literals |
| |
| _RemappedSecondaryResetVector: |
| .begin no-absolute-literals |
| .literal_position |
| |
| _j _RemappedSetupMMU |
| . = _RemappedSecondaryResetVector + Offset |
| |
| _RemappedSetupMMU: |
| |
| #ifdef CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX |
| initialize_mmu |
| #endif |
| |
| .end no-absolute-literals |