[BACK]Return to locore.h CVS log [TXT][DIR] Up to [local] / sys / arch / sh / include

Annotation of sys/arch/sh/include/locore.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: locore.h,v 1.3 2007/05/26 15:28:19 miod Exp $ */
        !             2: /*     $NetBSD: locore.h,v 1.11 2006/01/23 22:32:50 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: #if defined(SH3) && defined(SH4)
        !            38: #define        MOV(x, r)       mov.l .L_/**/x, r; mov.l @r, r
        !            39: #define        REG_SYMBOL(x)   .L_/**/x:       .long   _C_LABEL(__sh_/**/x)
        !            40: #define        FUNC_SYMBOL(x)  .L_/**/x:       .long   _C_LABEL(__sh_/**/x)
        !            41: #elif defined(SH3)
        !            42: #define        MOV(x, r)       mov.l .L_/**/x, r
        !            43: #define        REG_SYMBOL(x)   .L_/**/x:       .long   SH3_/**/x
        !            44: #define        FUNC_SYMBOL(x)  .L_/**/x:       .long   _C_LABEL(sh3_/**/x)
        !            45: #elif defined(SH4)
        !            46: #define        MOV(x, r)       mov.l .L_/**/x, r
        !            47: #define        REG_SYMBOL(x)   .L_/**/x:       .long   SH4_/**/x
        !            48: #define        FUNC_SYMBOL(x)  .L_/**/x:       .long   _C_LABEL(sh4_/**/x)
        !            49: #endif /* SH3 && SH4 */
        !            50:
        !            51: /*
        !            52:  * BANK1 r7 contains kernel stack top address.
        !            53:  * BANK1 r6 contains current frame pointer. (per process)
        !            54:  */
        !            55: /*
        !            56:  * __EXCEPTION_ENTRY:
        !            57:  *     + setup stack pointer
        !            58:  *     + save all register to frame. (struct trapframe)
        !            59:  *     + setup kernel stack.
        !            60:  *     + change bank from 1 to 0
        !            61:  *     + set BANK0 (r4, r5, r6) = (ssr, spc, ssp)
        !            62:  */
        !            63: #define        __EXCEPTION_ENTRY                                               ;\
        !            64:        /* Check kernel/user mode. */                                   ;\
        !            65:        mov     #0x40,  r3                                              ;\
        !            66:        swap.b  r3,     r3                                              ;\
        !            67:        stc     ssr,    r2                                              ;\
        !            68:        swap.w  r3,     r3      /* r3 = 0x40000000 */                   ;\
        !            69:        mov     r2,     r0      /* r2 = r0 = SSR */                     ;\
        !            70:        and     r3,     r0                                              ;\
        !            71:        tst     r0,     r0      /* if (SSR.MD == 0) T = 1 */            ;\
        !            72:        mov     r14,    r1                                              ;\
        !            73:        mov     r6,     r14     /* frame pointer */                     ;\
        !            74:        bf/s    1f              /* T==0 ...Exception from kernel mode */;\
        !            75:         mov    r15,    r0                                              ;\
        !            76:        /* Exception from user mode */                                  ;\
        !            77:        mov     r7,     r15     /* change to kernel stack */            ;\
        !            78: 1:                                                                     ;\
        !            79:        /* Save registers */                                            ;\
        !            80:        mov.l   r1,     @-r14   /* tf_r14 */                            ;\
        !            81:        mov.l   r0,     @-r14   /* tf_r15 */                            ;\
        !            82:        stc.l   r0_bank,@-r14   /* tf_r0  */                            ;\
        !            83:        stc.l   r1_bank,@-r14   /* tf_r1  */                            ;\
        !            84:        stc.l   r2_bank,@-r14   /* tf_r2  */                            ;\
        !            85:        stc.l   r3_bank,@-r14   /* tf_r3  */                            ;\
        !            86:        stc.l   r4_bank,@-r14   /* tf_r4  */                            ;\
        !            87:        stc.l   r5_bank,@-r14   /* tf_r5  */                            ;\
        !            88:        stc.l   r6_bank,@-r14   /* tf_r6  */                            ;\
        !            89:        stc.l   r7_bank,@-r14   /* tf_r7  */                            ;\
        !            90:        mov.l   r8,     @-r14   /* tf_r8  */                            ;\
        !            91:        mov.l   r9,     @-r14   /* tf_r9  */                            ;\
        !            92:        mov.l   r10,    @-r14   /* tf_r10 */                            ;\
        !            93:        mov.l   r11,    @-r14   /* tf_r11 */                            ;\
        !            94:        mov.l   r12,    @-r14   /* tf_r12 */                            ;\
        !            95:        mov.l   r13,    @-r14   /* tf_r13 */                            ;\
        !            96:        sts.l   pr,     @-r14   /* tf_pr  */                            ;\
        !            97:        sts.l   mach,   @-r14   /* tf_mach*/                            ;\
        !            98:        sts.l   macl,   @-r14   /* tf_macl*/                            ;\
        !            99:        mov.l   r2,     @-r14   /* tf_ssr */                            ;\
        !           100:        stc.l   spc,    @-r14   /* tf_spc */                            ;\
        !           101:        add     #-TF_SPC, r14   /* skip tf_ubc, tf_expevt */            ;\
        !           102:        mov     r14,    r6      /* store frame pointer */               ;\
        !           103:        /* Change register bank to 0 */                                 ;\
        !           104:        shlr    r3              /* r3 = 0x20000000 */                   ;\
        !           105:        stc     sr,     r1      /* r1 = SR */                           ;\
        !           106:        not     r3,     r3                                              ;\
        !           107:        and     r1,     r3                                              ;\
        !           108:        ldc     r3,     sr      /* SR.RB = 0 */                         ;\
        !           109:        /* Set up argument. r4 = ssr, r5 = spc */                       ;\
        !           110:        stc     r2_bank,r4                                              ;\
        !           111:        stc     spc,    r5
        !           112:
        !           113: /*
        !           114:  * __EXCEPTION_RETURN:
        !           115:  *     + block exception
        !           116:  *     + restore all register from stack.
        !           117:  *     + rte.
        !           118:  */
        !           119: #define        __EXCEPTION_RETURN                                              ;\
        !           120:        mov     #0x10,  r0                                              ;\
        !           121:        swap.b  r0,     r0                                              ;\
        !           122:        swap.w  r0,     r0      /* r0 = 0x10000000 */                   ;\
        !           123:        stc     sr,     r1                                              ;\
        !           124:        or      r0,     r1                                              ;\
        !           125:        ldc     r1,     sr      /* SR.BL = 1 */                         ;\
        !           126:        stc     r6_bank,r0                                              ;\
        !           127:        mov     r0,     r14                                             ;\
        !           128:        add     #TF_SIZE, r0                                            ;\
        !           129:        ldc     r0,     r6_bank /* roll up frame pointer */             ;\
        !           130:        add     #TF_SPC, r14    /* skip tf_expevt, tf_ubc */            ;\
        !           131:        mov.l   @r14+,  r0      /* tf_spc */                            ;\
        !           132:        ldc     r0,     spc                                             ;\
        !           133:        mov.l   @r14+,  r0      /* tf_ssr */                            ;\
        !           134:        ldc     r0,     ssr                                             ;\
        !           135:        lds.l   @r14+,  macl    /* tf_macl*/                            ;\
        !           136:        lds.l   @r14+,  mach    /* tf_mach*/                            ;\
        !           137:        lds.l   @r14+,  pr      /* tf_pr  */                            ;\
        !           138:        mov.l   @r14+,  r13     /* tf_r13 */                            ;\
        !           139:        mov.l   @r14+,  r12     /* tf_r12 */                            ;\
        !           140:        mov.l   @r14+,  r11     /* tf_r11 */                            ;\
        !           141:        mov.l   @r14+,  r10     /* tf_r10 */                            ;\
        !           142:        mov.l   @r14+,  r9      /* tf_r9  */                            ;\
        !           143:        mov.l   @r14+,  r8      /* tf_r8  */                            ;\
        !           144:        mov.l   @r14+,  r7      /* tf_r7  */                            ;\
        !           145:        mov.l   @r14+,  r6      /* tf_r6  */                            ;\
        !           146:        mov.l   @r14+,  r5      /* tf_r5  */                            ;\
        !           147:        mov.l   @r14+,  r4      /* tf_r4  */                            ;\
        !           148:        mov.l   @r14+,  r3      /* tf_r3  */                            ;\
        !           149:        mov.l   @r14+,  r2      /* tf_r2  */                            ;\
        !           150:        mov.l   @r14+,  r1      /* tf_r1  */                            ;\
        !           151:        mov.l   @r14+,  r0      /* tf_r0  */                            ;\
        !           152:        mov.l   @r14+   r15     /* tf_r15 */                            ;\
        !           153:        mov.l   @r14+,  r14     /* tf_r14 */                            ;\
        !           154:        rte                                                             ;\
        !           155:         nop
        !           156:
        !           157:
        !           158: /*
        !           159:  * Macros to disable and enable exceptions (including interrupts).
        !           160:  * This modifies SR.BL
        !           161:  */
        !           162: #define        __0x10  #0x10
        !           163: #define        __0x78  #0x78
        !           164:
        !           165: #define        __EXCEPTION_BLOCK(Rn, Rm)                                       ;\
        !           166:        mov     __0x10, Rn                                              ;\
        !           167:        swap.b  Rn,     Rn                                              ;\
        !           168:        swap.w  Rn,     Rn      /* Rn = 0x10000000 */                   ;\
        !           169:        stc     sr,     Rm                                              ;\
        !           170:        or      Rn,     Rm                                              ;\
        !           171:        ldc     Rm,     sr      /* block exceptions */
        !           172:
        !           173: #define        __EXCEPTION_UNBLOCK(Rn, Rm)                                     ;\
        !           174:        mov     __0x10, Rn                                              ;\
        !           175:        swap.b  Rn,     Rn                                              ;\
        !           176:        swap.w  Rn,     Rn      /* Rn = 0x10000000 */                   ;\
        !           177:        not     Rn,     Rn                                              ;\
        !           178:        stc     sr,     Rm                                              ;\
        !           179:        and     Rn,     Rm                                              ;\
        !           180:        ldc     Rm,     sr      /* unblock exceptions */
        !           181:
        !           182: /*
        !           183:  * Macros to disable and enable interrupts.
        !           184:  * This modifies SR.I[0-3]
        !           185:  */
        !           186: #define        __INTR_MASK(Rn, Rm)                                             ;\
        !           187:        mov     __0x78, Rn                                              ;\
        !           188:        shll    Rn              /* Rn = 0x000000f0 */                   ;\
        !           189:        stc     sr,     Rm                                              ;\
        !           190:        or      Rn,     Rm                                              ;\
        !           191:        ldc     Rm,     sr      /* mask all interrupt */
        !           192:
        !           193: #define        __INTR_UNMASK(Rn, Rm)                                           ;\
        !           194:        mov     __0x78, Rn                                              ;\
        !           195:        shll    Rn              /* Rn = 0x000000f0 */                   ;\
        !           196:        not     Rn,     Rn                                              ;\
        !           197:        stc     sr,     Rm                                              ;\
        !           198:        and     Rn,     Rm                                              ;\
        !           199:        ldc     Rm,     sr      /* unmask all interrupt */
        !           200:
        !           201: #ifndef _LOCORE
        !           202: void sh3_switch_setup(struct proc *);
        !           203: void sh4_switch_setup(struct proc *);
        !           204: void sh3_switch_resume(struct proc *);
        !           205: void sh4_switch_resume(struct proc *);
        !           206: extern void (*__sh_switch_resume)(struct proc *);
        !           207: #endif /* !_LOCORE */

CVSweb