Home | History | Annotate | Line # | Download | only in arm32
exception.S revision 1.17.2.1
      1  1.17.2.1      tls /*	$NetBSD: exception.S,v 1.17.2.1 2012/11/20 03:01:02 tls Exp $	*/
      2       1.1    chris 
      3       1.1    chris /*
      4       1.1    chris  * Copyright (c) 1994-1997 Mark Brinicombe.
      5       1.1    chris  * Copyright (c) 1994 Brini.
      6       1.1    chris  * All rights reserved.
      7       1.1    chris  *
      8       1.1    chris  * This code is derived from software written for Brini by Mark Brinicombe
      9       1.1    chris  *
     10       1.1    chris  * Redistribution and use in source and binary forms, with or without
     11       1.1    chris  * modification, are permitted provided that the following conditions
     12       1.1    chris  * are met:
     13       1.1    chris  * 1. Redistributions of source code must retain the above copyright
     14       1.1    chris  *    notice, this list of conditions and the following disclaimer.
     15       1.1    chris  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1    chris  *    notice, this list of conditions and the following disclaimer in the
     17       1.1    chris  *    documentation and/or other materials provided with the distribution.
     18       1.1    chris  * 3. All advertising materials mentioning features or use of this software
     19       1.1    chris  *    must display the following acknowledgement:
     20       1.1    chris  *	This product includes software developed by Brini.
     21       1.1    chris  * 4. The name of the company nor the name of the author may be used to
     22       1.1    chris  *    endorse or promote products derived from this software without specific
     23       1.1    chris  *    prior written permission.
     24       1.1    chris  *
     25       1.1    chris  * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
     26       1.1    chris  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     27       1.1    chris  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     28       1.1    chris  * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     29       1.1    chris  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30       1.1    chris  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     31       1.1    chris  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32       1.1    chris  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33       1.1    chris  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34       1.1    chris  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35       1.1    chris  * SUCH DAMAGE.
     36       1.1    chris  *
     37       1.1    chris  * RiscBSD kernel project
     38       1.1    chris  *
     39       1.1    chris  * exception.S
     40       1.1    chris  *
     41       1.1    chris  * Low level handlers for exception vectors
     42       1.1    chris  *
     43       1.1    chris  * Created      : 24/09/94
     44       1.1    chris  *
     45       1.1    chris  * Based on kate/display/abort.s
     46       1.1    chris  */
     47       1.1    chris 
     48      1.16     matt #include "assym.h"
     49       1.1    chris #include <machine/asm.h>
     50       1.1    chris #include <machine/cpu.h>
     51       1.1    chris #include <machine/frame.h>
     52      1.16     matt 
     53  1.17.2.1      tls 	RCSID("$NetBSD: exception.S,v 1.17.2.1 2012/11/20 03:01:02 tls Exp $")
     54       1.1    chris 
     55       1.1    chris 	.text
     56       1.1    chris 	.align	0
     57       1.1    chris 
     58      1.12      scw AST_ALIGNMENT_FAULT_LOCALS
     59       1.1    chris 
     60       1.1    chris /*
     61       1.3  thorpej  * reset_entry:
     62       1.3  thorpej  *
     63       1.3  thorpej  *	Handler for Reset exception.
     64       1.3  thorpej  */
     65       1.3  thorpej ASENTRY_NP(reset_entry)
     66       1.3  thorpej 	adr	r0, Lreset_panicmsg
     67       1.3  thorpej 	mov	r1, lr
     68       1.3  thorpej 	bl	_C_LABEL(panic)
     69       1.3  thorpej 	/* NOTREACHED */
     70       1.3  thorpej Lreset_panicmsg:
     71       1.3  thorpej 	.asciz	"Reset vector called, LR = 0x%08x"
     72       1.3  thorpej 	.balign	4
     73       1.1    chris 
     74       1.3  thorpej /*
     75       1.3  thorpej  * swi_entry
     76       1.3  thorpej  *
     77       1.3  thorpej  *	Handler for the Software Interrupt exception.
     78       1.3  thorpej  */
     79       1.3  thorpej ASENTRY_NP(swi_entry)
     80       1.3  thorpej 	PUSHFRAME
     81       1.9      scw 	ENABLE_ALIGNMENT_FAULTS
     82       1.9      scw 
     83       1.3  thorpej 	mov	r0, sp			/* Pass the frame to any function */
     84       1.5    bjh21 	bl	_C_LABEL(swi_handler)	/* It's a SWI ! */
     85       1.1    chris 
     86      1.12      scw 	DO_AST_AND_RESTORE_ALIGNMENT_FAULTS
     87       1.3  thorpej 	PULLFRAME
     88       1.3  thorpej 	movs	pc, lr			/* Exit */
     89       1.1    chris 
     90       1.3  thorpej /*
     91       1.3  thorpej  * prefetch_abort_entry:
     92       1.3  thorpej  *
     93       1.3  thorpej  *	Handler for the Prefetch Abort exception.
     94       1.3  thorpej  */
     95       1.1    chris ASENTRY_NP(prefetch_abort_entry)
     96      1.13      scw #ifdef __XSCALE__
     97      1.13      scw 	nop				/* Make absolutely sure any pending */
     98      1.13      scw 	nop				/* imprecise aborts have occurred. */
     99      1.13      scw #endif
    100       1.1    chris         sub     lr, lr, #0x00000004     /* Adjust the lr */
    101       1.1    chris 
    102       1.1    chris 	PUSHFRAMEINSVC
    103       1.9      scw 	ENABLE_ALIGNMENT_FAULTS
    104       1.9      scw 
    105      1.12      scw 	ldr	r1, Lprefetch_abort_handler_address
    106      1.12      scw 	adr	lr, exception_exit
    107       1.1    chris  	mov	r0, sp			/* pass the stack pointer as r0 */
    108      1.12      scw 	ldr	pc, [r1]
    109       1.1    chris 
    110       1.1    chris Lprefetch_abort_handler_address:
    111       1.1    chris 	.word	_C_LABEL(prefetch_abort_handler_address)
    112       1.1    chris 
    113       1.1    chris 	.data
    114  1.17.2.1      tls 	.p2align 2
    115       1.1    chris 	.global	_C_LABEL(prefetch_abort_handler_address)
    116       1.1    chris _C_LABEL(prefetch_abort_handler_address):
    117       1.1    chris 	.word	abortprefetch
    118       1.1    chris 
    119       1.1    chris 	.text
    120       1.1    chris abortprefetch:
    121       1.7    bjh21         adr     r0, abortprefetchmsg
    122       1.1    chris 	b	_C_LABEL(panic)
    123       1.1    chris 
    124       1.1    chris abortprefetchmsg:
    125       1.1    chris         .asciz  "abortprefetch"
    126       1.1    chris         .align  0
    127       1.1    chris 
    128       1.1    chris /*
    129       1.3  thorpej  * data_abort_entry:
    130       1.1    chris  *
    131       1.3  thorpej  *	Handler for the Data Abort exception.
    132       1.1    chris  */
    133       1.3  thorpej ASENTRY_NP(data_abort_entry)
    134      1.13      scw #ifdef __XSCALE__
    135      1.13      scw 	nop				/* Make absolutely sure any pending */
    136      1.13      scw 	nop				/* imprecise aborts have occurred. */
    137      1.13      scw #endif
    138       1.3  thorpej         sub     lr, lr, #0x00000008     /* Adjust the lr */
    139       1.1    chris 
    140       1.3  thorpej 	PUSHFRAMEINSVC			/* Push trap frame and switch */
    141       1.3  thorpej 					/* to SVC32 mode */
    142       1.9      scw 	ENABLE_ALIGNMENT_FAULTS
    143       1.9      scw 
    144      1.12      scw 	ldr	r1, Ldata_abort_handler_address
    145      1.12      scw 	adr	lr, exception_exit
    146       1.3  thorpej 	mov	r0, sp			/* pass the stack pointer as r0 */
    147       1.3  thorpej 	ldr	pc, [r1]
    148       1.1    chris 
    149       1.3  thorpej Ldata_abort_handler_address:
    150       1.3  thorpej 	.word	_C_LABEL(data_abort_handler_address)
    151       1.1    chris 
    152       1.3  thorpej 	.data
    153  1.17.2.1      tls 	.p2align 2
    154       1.3  thorpej 	.global	_C_LABEL(data_abort_handler_address)
    155       1.3  thorpej _C_LABEL(data_abort_handler_address):
    156       1.3  thorpej 	.word	abortdata
    157       1.1    chris 
    158       1.3  thorpej 	.text
    159       1.3  thorpej abortdata:
    160       1.7    bjh21         adr     r0, abortdatamsg
    161       1.3  thorpej 	b	_C_LABEL(panic)
    162       1.1    chris 
    163       1.3  thorpej abortdatamsg:
    164       1.3  thorpej         .asciz  "abortdata"
    165       1.3  thorpej         .align  0
    166       1.1    chris 
    167       1.3  thorpej /*
    168       1.3  thorpej  * address_exception_entry:
    169       1.3  thorpej  *
    170       1.3  thorpej  *	Handler for the Address Exception exception.
    171       1.3  thorpej  *
    172       1.3  thorpej  *	NOTE: This exception isn't really used on arm32.  We
    173       1.3  thorpej  *	print a warning message to the console and then treat
    174       1.3  thorpej  *	it like a Data Abort.
    175       1.3  thorpej  */
    176       1.3  thorpej ASENTRY_NP(address_exception_entry)
    177       1.3  thorpej 	mrs	r1, cpsr_all
    178       1.3  thorpej 	mrs	r2, spsr_all
    179       1.3  thorpej 	mov	r3, lr
    180       1.3  thorpej 	adr	r0, Laddress_exception_msg
    181       1.3  thorpej 	bl	_C_LABEL(printf)	/* XXX CLOBBERS LR!! */
    182       1.3  thorpej 	b	data_abort_entry
    183       1.3  thorpej Laddress_exception_msg:
    184       1.3  thorpej 	.asciz	"Address Exception CPSR=0x%08x SPSR=0x%08x LR=0x%08x\n"
    185       1.3  thorpej 	.balign	4
    186      1.13      scw 
    187      1.13      scw /*
    188      1.13      scw  * General exception exit handler
    189      1.13      scw  * (Placed here to be within range of all the references to it)
    190      1.13      scw  *
    191      1.13      scw  * It exits straight away if not returning to USR mode.
    192      1.13      scw  * This loops around delivering any pending ASTs.
    193      1.13      scw  * Interrupts are disabled at suitable points to avoid ASTs
    194      1.13      scw  * being posted between testing and exit to user mode.
    195      1.13      scw  *
    196      1.13      scw  * This function uses PULLFRAMEFROMSVCANDEXIT and
    197      1.13      scw  * DO_AST_AND_RESTORE_ALIGNMENT_FAULTS thus should
    198      1.13      scw  * only be called if the exception handler used PUSHFRAMEINSVC
    199      1.13      scw  * followed by ENABLE_ALIGNMENT_FAULTS.
    200      1.13      scw  */
    201      1.13      scw 
    202      1.13      scw exception_exit:
    203      1.13      scw 	DO_AST_AND_RESTORE_ALIGNMENT_FAULTS
    204      1.13      scw 	PULLFRAMEFROMSVCANDEXIT
    205       1.1    chris 
    206       1.1    chris /*
    207       1.3  thorpej  * undefined_entry:
    208       1.3  thorpej  *
    209       1.3  thorpej  *	Handler for the Undefined Instruction exception.
    210       1.3  thorpej  *
    211       1.3  thorpej  *	We indirect the undefined vector via the handler address
    212       1.3  thorpej  *	in the data area.  Entry to the undefined handler must
    213       1.3  thorpej  *	look like direct entry from the vector.
    214       1.1    chris  */
    215       1.1    chris ASENTRY_NP(undefined_entry)
    216       1.1    chris 	stmfd	sp!, {r0, r1}
    217      1.17     matt 	GET_CURCPU(r0)
    218       1.1    chris 	ldr	r1, [sp], #0x0004
    219      1.17     matt 	str	r1, [r0, #CI_UNDEFSAVE]!
    220       1.1    chris 	ldr	r1, [sp], #0x0004
    221       1.1    chris 	str	r1, [r0, #0x0004]
    222       1.1    chris 	ldmia	r0, {r0, r1, pc}
    223       1.1    chris 
    224       1.1    chris /*
    225       1.1    chris  * assembly bounce code for calling the kernel
    226       1.1    chris  * undefined instruction handler. This uses
    227       1.1    chris  * a standard trap frame and is called in SVC mode.
    228       1.1    chris  */
    229       1.1    chris 
    230       1.1    chris ENTRY_NP(undefinedinstruction_bounce)
    231       1.1    chris 	PUSHFRAMEINSVC
    232       1.9      scw 	ENABLE_ALIGNMENT_FAULTS
    233      1.12      scw 
    234       1.1    chris 	mov	r0, sp
    235      1.12      scw 	adr	lr, exception_exit
    236      1.12      scw 	b	_C_LABEL(undefinedinstruction)
    237