Annotation of sys/arch/sh/sh/vectors.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: vectors.S,v 1.2 2007/05/14 07:05:49 art Exp $ */
! 2: /* $NetBSD: exception_vector.S,v 1.19 2006/08/22 21:47:57 uwe Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 2002 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * must display the following acknowledgement:
! 18: * This product includes software developed by the NetBSD
! 19: * Foundation, Inc. and its contributors.
! 20: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 21: * contributors may be used to endorse or promote products derived
! 22: * from this software without specific prior written permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 25: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 26: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 27: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 28: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 29: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 30: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 31: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 32: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 33: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 34: * POSSIBILITY OF SUCH DAMAGE.
! 35: */
! 36:
! 37: #include "assym.h"
! 38:
! 39: #include <sh/param.h>
! 40: #include <sh/asm.h>
! 41: #include <sh/locore.h>
! 42: #include <sh/trap.h>
! 43: #include <sh/ubcreg.h>
! 44: #include <sh/mmu_sh3.h>
! 45: #include <sh/mmu_sh4.h>
! 46:
! 47: /*
! 48: * Exception vectors. The following routines are copied to vector addreses.
! 49: * sh_vector_generic: VBR + 0x100
! 50: * sh_vector_tlbmiss: VBR + 0x400
! 51: * sh_vector_interrupt: VBR + 0x600
! 52: */
! 53:
! 54: #define VECTOR_END_MARKER(sym) \
! 55: .globl _C_LABEL(sym); \
! 56: _C_LABEL(sym):
! 57:
! 58:
! 59: /*
! 60: * LINTSTUB: Var: char sh_vector_generic[1];
! 61: *
! 62: * void sh_vector_generic(void) __attribute__((__noreturn__))
! 63: * Copied to VBR+0x100. This code should be position independent
! 64: * and no more than 786 bytes long (== 0x400 - 0x100).
! 65: */
! 66: NENTRY(sh_vector_generic)
! 67: __EXCEPTION_ENTRY
! 68: __INTR_MASK(r0, r1)
! 69: /* Identify exception cause */
! 70: MOV (EXPEVT, r0)
! 71: mov.l @r0, r0
! 72: mov.l r0, @(TF_EXPEVT, r14) /* trapframe->tf_expevt = EXPEVT */
! 73: /* Get curproc */
! 74: mov.l _L.curproc, r1
! 75: mov.l @r1, r4 /* 1st arg */
! 76: /* Get TEA */
! 77: MOV (TEA, r1)
! 78: mov.l @r1, r6 /* 3rd arg */
! 79: /* Check TLB exception or not */
! 80: mov.l _L.TLB_PROT_ST, r1
! 81: cmp/hi r1, r0
! 82: bt 1f
! 83:
! 84: /* tlb_exception(curproc, trapframe, trunc_page(TEA)); */
! 85: mov.l _L.VPN_MASK, r1
! 86: and r1, r6 /* va = trunc_page(va) */
! 87: __EXCEPTION_UNBLOCK(r0, r1)
! 88: mov.l _L.tlb, r0
! 89: jsr @r0
! 90: mov r14, r5 /* 2nd arg */
! 91: bra 2f
! 92: nop
! 93:
! 94: /* general_exception(curproc, trapframe, TEA); */
! 95: 1: mov r4, r8
! 96: #ifdef DDB
! 97: mov #0, r2
! 98: MOV (BBRA, r1)
! 99: mov.w r2, @r1 /* disable UBC */
! 100: mov.l r2, @(TF_UBC, r14) /* clear trapframe->tf_ubc */
! 101: #endif /* DDB */
! 102: __EXCEPTION_UNBLOCK(r0, r1)
! 103: mov.l _L.general, r0
! 104: jsr @r0
! 105: mov r14, r5 /* 2nd arg */
! 106:
! 107: /* Check for ASTs on exit to user mode. */
! 108: mov r8, r4
! 109: mov.l _L.ast, r0
! 110: jsr @r0
! 111: mov r14, r5
! 112: #ifdef DDB /* BBRA = trapframe->tf_ubc */
! 113: __EXCEPTION_BLOCK(r0, r1)
! 114: mov.l @(TF_UBC, r14), r0
! 115: MOV (BBRA, r1)
! 116: mov.w r0, @r1
! 117: #endif /* DDB */
! 118: 2: __EXCEPTION_RETURN
! 119: /* NOTREACHED */
! 120: .align 2
! 121: _L.curproc: .long _C_LABEL(cpu_info_store) + CI_CURPROC
! 122: REG_SYMBOL(EXPEVT)
! 123: REG_SYMBOL(BBRA)
! 124: REG_SYMBOL(TEA)
! 125: _L.tlb: .long _C_LABEL(tlb_exception)
! 126: _L.general: .long _C_LABEL(general_exception)
! 127: _L.ast: .long _C_LABEL(ast)
! 128: _L.TLB_PROT_ST: .long 0xc0
! 129: _L.VPN_MASK: .long 0xfffff000
! 130:
! 131: /* LINTSTUB: Var: char sh_vector_generic_end[1]; */
! 132: VECTOR_END_MARKER(sh_vector_generic_end)
! 133: SET_ENTRY_SIZE(sh_vector_generic)
! 134:
! 135:
! 136: #ifdef SH3
! 137: /*
! 138: * LINTSTUB: Var: char sh3_vector_tlbmiss[1];
! 139: *
! 140: * void sh3_vector_tlbmiss(void) __attribute__((__noreturn__))
! 141: * Copied to VBR+0x400. This code should be position independent
! 142: * and no more than 512 bytes long (== 0x600 - 0x400).
! 143: */
! 144: NENTRY(sh3_vector_tlbmiss)
! 145: __EXCEPTION_ENTRY
! 146: mov #(SH3_TEA & 0xff), r0
! 147: mov.l @r0, r6 /* 3rd arg: va = TEA */
! 148: #if !defined(P1_STACK)
! 149: /* Load kernel stack */
! 150: mov.l __L.VPN_MASK, r0
! 151: and r6, r0
! 152: tst r0, r0 /* check VPN == 0 */
! 153: bt 6f
! 154: mov.l _L.CURUPTE, r1
! 155: mov.l @r1, r1
! 156: mov #UPAGES,r3
! 157: mov #1, r2
! 158: 4: mov.l @r1+, r7
! 159: cmp/eq r7, r0 /* md_upte.addr: u-area VPN */
! 160: bt 5f
! 161: add #4, r1 /* skip md_upte.data */
! 162: cmp/eq r2, r3
! 163: bf/s 4b
! 164: add #1, r2
! 165: bra 7f /* pull insn at 6f into delay slot */
! 166: mov #(SH3_EXPEVT & 0xff), r0
! 167: 5: mov.l @r1, r2 /* md_upte.data: u-area PTE */
! 168: mov #(SH3_PTEL & 0xff), r1
! 169: mov.l r2, @r1
! 170: mov #(SH3_PTEH & 0xff), r1
! 171: mov.l @r1, r2
! 172: mov.l __L.VPN_MASK, r0
! 173: and r2, r0
! 174: mov.l r0, @r1 /* ASID 0 */
! 175: ldtlb
! 176: bra 3f
! 177: mov.l r2, @r1 /* restore ASID */
! 178: #endif /* !P1_STACK */
! 179: 6: mov #(SH3_EXPEVT & 0xff), r0
! 180: 7: mov.l @r0, r0
! 181: mov.l r0, @(TF_EXPEVT, r14) /* trapframe->tf_expevt = EXPEVT */
! 182: mov.l 2f, r0
! 183: mov.l @r0, r4 /* 1st arg */
! 184: __INTR_MASK(r0, r1)
! 185: __EXCEPTION_UNBLOCK(r0, r1)
! 186: mov.l 1f, r0
! 187: jsr @r0
! 188: mov r14, r5 /* 2nd arg */
! 189: 3: __EXCEPTION_RETURN
! 190: .align 2
! 191: 2: .long _C_LABEL(cpu_info_store) + CI_CURPROC
! 192: 1: .long _C_LABEL(tlb_exception)
! 193: __L.VPN_MASK: .long 0xfffff000
! 194: _L.CURUPTE: .long _C_LABEL(curupte)
! 195:
! 196: /* LINTSTUB: Var: char sh3_vector_tlbmiss_end[1]; */
! 197: VECTOR_END_MARKER(sh3_vector_tlbmiss_end)
! 198: SET_ENTRY_SIZE(sh3_vector_tlbmiss)
! 199: #endif /* SH3 */
! 200:
! 201:
! 202: #ifdef SH4
! 203: /*
! 204: * LINTSTUB: Var: char sh4_vector_tlbmiss[1];
! 205: *
! 206: * void sh4_vector_tlbmiss(void) __attribute__((__noreturn__))
! 207: * Copied to VBR+0x400. This code should be position independent
! 208: * and no more than 512 bytes long (== 0x600 - 0x400).
! 209: */
! 210: NENTRY(sh4_vector_tlbmiss)
! 211: __EXCEPTION_ENTRY
! 212: mov.l _L.TEA4, r0
! 213: mov.l @r0, r6
! 214: mov.l _L.EXPEVT4, r0
! 215: mov.l @r0, r0
! 216: mov.l r0, @(TF_EXPEVT, r14) /* trapframe->tf_expevt = EXPEVT */
! 217: mov.l 2f, r0
! 218: mov.l @r0, r4 /* 1st arg */
! 219: __INTR_MASK(r0, r1)
! 220: __EXCEPTION_UNBLOCK(r0, r1)
! 221: mov.l 1f, r0
! 222: jsr @r0
! 223: mov r14, r5 /* 2nd arg */
! 224: __EXCEPTION_RETURN
! 225: .align 2
! 226: 1: .long _C_LABEL(tlb_exception)
! 227: 2: .long _C_LABEL(cpu_info_store) + CI_CURPROC
! 228: _L.EXPEVT4: .long SH4_EXPEVT
! 229: _L.TEA4: .long SH4_TEA
! 230:
! 231: /* LINTSTUB: Var: char sh4_vector_tlbmiss_end[1]; */
! 232: VECTOR_END_MARKER(sh4_vector_tlbmiss_end)
! 233: SET_ENTRY_SIZE(sh4_vector_tlbmiss)
! 234: #endif /* SH4 */
! 235:
! 236:
! 237: /*
! 238: * LINTSTUB: Var: char sh_vector_interrupt[1];
! 239: *
! 240: * void sh_vector_interrupt(void) __attribute__((__noreturn__)):
! 241: * copied to VBR+0x600. This code should be relocatable.
! 242: */
! 243: NENTRY(sh_vector_interrupt)
! 244: __EXCEPTION_ENTRY
! 245: xor r0, r0
! 246: mov.l r0, @(TF_EXPEVT, r14) /* (for debug) */
! 247: stc r0_bank,r6 /* ssp */
! 248: /* Enable exception for P3 access */
! 249: __INTR_MASK(r0, r1)
! 250: __EXCEPTION_UNBLOCK(r0, r1)
! 251: /* uvmexp.intrs++ */
! 252: mov.l __L.uvmexp.intrs, r0
! 253: mov.l @r0, r1
! 254: add #1 r1
! 255: mov.l r1, @r0
! 256: /* Dispatch interrupt handler */
! 257: mov.l __L.intc_intr, r0
! 258: jsr @r0 /* intc_intr(ssr, spc, ssp) */
! 259: nop
! 260: /* Check for ASTs on exit to user mode. */
! 261: mov.l 1f, r0
! 262: mov.l @r0, r4 /* 1st arg */
! 263: mov.l __L.ast, r0
! 264: jsr @r0
! 265: mov r14, r5 /* 2nd arg */
! 266: __EXCEPTION_RETURN
! 267: .align 2
! 268: 1: .long _C_LABEL(cpu_info_store) + CI_CURPROC
! 269: __L.intc_intr: .long _C_LABEL(intc_intr)
! 270: __L.ast: .long _C_LABEL(ast)
! 271: __L.uvmexp.intrs: .long _C_LABEL(uvmexp) + UVMEXP_INTRS
! 272:
! 273: /* LINTSTUB: Var: char sh_vector_interrupt_end[1]; */
! 274: VECTOR_END_MARKER(sh_vector_interrupt_end)
! 275: SET_ENTRY_SIZE(sh_vector_interrupt)
CVSweb