blob: 499243947479b23d954304bedd4ea36e4cd79186 [file] [log] [blame]
/*
* Copyright 2014-2015, Imagination Technologies Limited and/or its
* affiliated group companies.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
.set nomips16
#include <mips/regdef.h>
#include <mips/asm.h>
#include <mips/cpu.h>
#include <mips/hal.h>
# Used to support an alternate entry point that overlays the TLB refill
# exception entry point. This flag must be cleared before exceptions
# are ready to be handled.
.data
EXPORTS(__first_boot, 4)
.word 0x1
_TEXT_SECTION
#
# FUNCTION: __register_excpt_handler
#
# DESCRIPTION: Register __exception_entry at EBASE+0x180. Return the new
# value for C0_SR.
#
WLEAF(__register_excpt_handler)
.set push
.set noat
# Fetch initial status
mfc0 $5, C0_SR
# Get into a sane state.
# Important things: base mode is kernel and ERL, ESL, IE are clear
# Set BEV=1 to allow changing EBASE later
lui $10, %hi(SR_BEV)
mtc0 $10, C0_SR
ehb
# Enable use of a boot state hook
# $4 = Boot time RA
# $5 = Boot time SR
# $6 = Current RA. There is no stack so get the callee to pass this
# back.
.weak __register_excpt_boot
LA $9, __register_excpt_boot
beqz $9, 1f
move $6, ra
jalr $9
move ra, $2
1:
# Clear first boot flag
LA $9, __first_boot
sw $0, 0($9)
mfc0 $12, C0_CONFIG3
#if defined (__mips_micromips)
# Set Config3.ISAOnExc for micromips
lui $4, 1 /* 0x10000 */
or $4, $4, $12
mtc0 $4, C0_CONFIG3
#endif
# Set desired EBASE
LA $10, __excpt_ebase
# Always set the write gate as the requested EBASE may not be in kseg0.
# This may or may not exist in hardware but if it doesn't then the
# ebase address will simply get masked with inevitable consequences.
ori $10, $10, EBASE_WG
PTR_MTC0 $10, C0_EBASE
ehb
# Set up new empty status value
move $2, $0
# Set up vector spacing
LA $9, __isr_vec_space
# Check for vectored interrupt support
ext $10, $12, CFG3_VI_SHIFT, 1
ext $11, $12, CFG3_VEIC_SHIFT, 1
or $10, $10, $11
# Skip vector spacing setup if neither VINT nor VEIC is present
beqz $10, 1f
# Set vector spacing
mfc0 $10, C0_INTCTL
ins $10, $9, 0, 10
mtc0 $10, C0_INTCTL
b 2f
1:
# Check non-zero vector spacing without vectored interrupt support.
# If so, do not enable interrupts.
bnez $9, 3f
2:
# Turn on use of the special exception vector and enable interrupts
lui $9, %hi(CR_IV)
mtc0 $9, C0_CAUSE
ehb
# Check for VEIC and do not enable interrupts if EIC is active
ext $10, $12, CFG3_VEIC_SHIFT, 1
bnez $10, 3f
# Enable interrupts in the new status value
ori $2, $2, SR_IE
3:
jr $31
.set pop
WEND(__register_excpt_handler)