Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:01

0001 /*
0002  * SH7750 interrupt support.
0003  *
0004  * Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia
0005  * Author: Victor V. Vengerov <vvv@oktet.ru>
0006  *
0007  *  Based on work:
0008  *  Authors: Ralf Corsepius (corsepiu@faw.uni-ulm.de) and
0009  *           Bernd Becker (becker@faw.uni-ulm.de)
0010  *
0011  *  COPYRIGHT (c) 1997-1998, FAW Ulm, Germany
0012  *
0013  *  This program is distributed in the hope that it will be useful,
0014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
0016  *
0017  *
0018  *  COPYRIGHT (c) 1998.
0019  *  On-Line Applications Research Corporation (OAR).
0020  *
0021  *  The license and distribution terms for this file may be
0022  *  found in the file LICENSE in this distribution or at
0023  *  http://www.rtems.org/license/LICENSE.
0024  *
0025  *  Modified to reflect isp entries for sh7045 processor:
0026  *  John M. Mills (jmills@tga.com)
0027  *  TGA Technologies, Inc.
0028  *      100 Pinnacle Way, Suite 140
0029  *  Norcross, GA 30071 U.S.A.
0030  *  August, 1999
0031  *
0032  *  This modified file may be copied and distributed in accordance
0033  *  the above-referenced license. It is provided for critique and
0034  *  developmental purposes without any warranty nor representation
0035  *  by the authors or by TGA Technologies.
0036  */
0037 
0038 #include <rtems/score/isr.h>
0039 
0040 /*
0041  * This is a exception vector table
0042  *
0043  * It has the same structure as the actual vector table (vectab)
0044  */
0045 
0046 
0047 #include <rtems/score/ispsh7750.h>
0048 #include <rtems/score/sh4_regs.h>
0049 #include <rtems/score/sh7750_regs.h>
0050 
0051 /* VBR register contents saved on startup -- used to hook exception by debug
0052  * agent */
0053 void *_VBR_Saved;
0054 
0055 #define __STRINGIFY1__(x) #x
0056 #define __STRINGIFY__(x) __STRINGIFY1__(x)
0057 
0058 #define STOP_TIMER \
0059      "        mov.l TSTR_k,r0      \n"                             \
0060      "        mov.b @r0,r1         \n"                             \
0061      "        and   #" __STRINGIFY__(~SH7750_TSTR_STR0) ",r1\n"    \
0062      "        mov.b r1,@r0         \n"
0063 
0064 #define START_TIMER \
0065      "        mov.l TSTR_k,r0      \n"                             \
0066      "        mov.b @r0,r1         \n"                             \
0067      "        or    #" __STRINGIFY__(SH7750_TSTR_STR0) ",r1\n"     \
0068      "        mov.b r1,@r0         \n"
0069 
0070 __asm__ ("        .text\n"
0071      "        .balign 256\n"
0072      "        .global __vbr_base\n"
0073      "__vbr_base:\n"
0074      "        .org __vbr_base + 0x100\n"
0075      "vbr_100:\n"
0076      "        mov.l  r0,@-r15\n"
0077      "        mov.l  r1,@-r15\n"
0078      "        mov.l  __VBR_Saved100_k, r0\n"
0079      "        mov.l  offset100_k,r1\n"
0080      "        mov.l  @r0,r0\n"
0081      "        add    r1,r0\n"
0082      "        mov.l  @r15+,r1\n"
0083      "        jmp    @r0\n"
0084      "        mov.l  @r15+,r0\n"
0085      "        .align 2\n"
0086      "__VBR_Saved100_k:\n"
0087      "        .long __VBR_Saved\n"
0088      "offset100_k:\n"
0089      "        .long  0x100\n"
0090 
0091      "        .org __vbr_base + 0x400\n"
0092      "vbr_400:\n"
0093      "        mov.l  r0,@-r15\n"
0094      "        mov.l  r1,@-r15\n"
0095      "        mov.l  __VBR_Saved400_k, r0\n"
0096      "        mov.l  offset400_k,r1\n"
0097      "        mov.l  @r0,r0\n"
0098      "        add    r1,r0\n"
0099      "        mov.l  @r15+,r1\n"
0100      "        jmp    @r0\n"
0101      "        mov.l  @r15+,r0\n"
0102      "        .align 2\n"
0103      "__VBR_Saved400_k:\n"
0104      "        .long __VBR_Saved\n"
0105      "offset400_k:\n"
0106      "        .long  0x400\n"
0107 
0108      "        .org __vbr_base + 0x600\n"
0109      "vbr_600:\n"
0110      "    mov.l r0,@-r15   \n"
0111      "    mov.l r1,@-r15   \n"
0112      "    stc   sr,r0      \n"
0113      "    mov.l __vbr_600_sr_and_k,r1\n"
0114      "    and   r1,r0      \n"
0115      "    mov.l __vbr_600_sr_or_k,r1\n"
0116      "    or    r1,r0      \n"
0117      "    ldc   r0,sr      \n"
0118      "    ldc.l @r15+,r1_bank\n"
0119      "    ldc.l @r15+,r0_bank\n"
0120      "    mov.l r0,@-r15   \n"
0121      "    mov.l r1,@-r15   \n"
0122      "    mov.l r2,@-r15   \n"
0123      "    mov.l r3,@-r15   \n"
0124      "    mov.l r4,@-r15   \n"
0125      "    mov.l r5,@-r15   \n"
0126      "    mov.l r6,@-r15   \n"
0127      "    mov.l r7,@-r15   \n"
0128 #if 0
0129      "    mov.l r8,@-r15   \n"
0130      "    mov.l r9,@-r15   \n"
0131      "    mov.l r10,@-r15  \n"
0132      "    mov.l r11,@-r15  \n"
0133      "    mov.l r12,@-r15  \n"
0134      "    mov.l r13,@-r15  \n"
0135 #endif
0136      "    mov.l r14,@-r15  \n"
0137      "    sts.l fpscr,@-r15\n"
0138      "    sts.l fpul,@-r15 \n"
0139      "    mov.l __ISR_temp_fpscr_k,r0   \n"
0140      "    lds   r0,fpscr   \n"
0141      "    fmov  fr0,@-r15  \n"
0142      "    fmov  fr1,@-r15  \n"
0143      "    fmov  fr2,@-r15  \n"
0144      "    fmov  fr3,@-r15  \n"
0145      "    fmov  fr4,@-r15  \n"
0146      "    fmov  fr5,@-r15  \n"
0147      "    fmov  fr6,@-r15  \n"
0148      "    fmov  fr7,@-r15  \n"
0149      "    fmov  fr8,@-r15  \n"
0150      "    fmov  fr9,@-r15  \n"
0151      "    fmov  fr10,@-r15 \n"
0152      "    fmov  fr11,@-r15 \n"
0153      "    fmov  fr12,@-r15 \n"
0154      "    fmov  fr13,@-r15 \n"
0155      "    fmov  fr14,@-r15 \n"
0156      "    fmov  fr15,@-r15 \n"
0157 
0158      "    sts.l pr,@-r15   \n"
0159      "    sts.l mach,@-r15 \n"
0160      "    sts.l macl,@-r15 \n"
0161      "    stc.l spc,@-r15  \n"
0162      "    stc.l ssr,@-r15  \n"
0163      "    mov r15,r14      \n"
0164 #if 0
0165      "    stc   ssr,r0     \n"
0166      "    ldc   r0,sr      \n"
0167 #endif
0168      "    mov.l __ISR_Handler_k, r1\n"
0169      "    mov.l _INTEVT_k,r4\n"
0170      "    mov.l @r4,r4     \n"
0171      "    shlr2 r4         \n"
0172      "    shlr  r4         \n"
0173 
0174      "    mov.l _ISR_Table_k,r0\n"
0175      "    mov.l @r0,r0     \n"
0176      "    add   r4,r0      \n"
0177      "    mov.l @r0,r0     \n"
0178      "    cmp/eq #0,r0     \n"
0179      "    bt    _ipl_hook  \n"
0180 
0181 
0182      "    jsr @r1          \n"
0183      "     shlr2 r4        \n"
0184      "    mov   r14,r15    \n"
0185      "    ldc.l @r15+,ssr  \n"
0186      "    ldc.l @r15+,spc  \n"
0187      "    lds.l @r15+,macl \n"
0188      "    lds.l @r15+,mach \n"
0189      "    lds.l @r15+,pr   \n"
0190      "    mov.l __ISR_temp_fpscr_k,r0   \n"
0191      "    lds   r0,fpscr   \n"
0192 
0193      "    fmov  @r15+,fr15 \n"
0194      "    fmov  @r15+,fr14 \n"
0195      "    fmov  @r15+,fr13 \n"
0196      "    fmov  @r15+,fr12 \n"
0197      "    fmov  @r15+,fr11 \n"
0198      "    fmov  @r15+,fr10 \n"
0199      "    fmov  @r15+,fr9  \n"
0200      "    fmov  @r15+,fr8  \n"
0201      "    fmov  @r15+,fr7  \n"
0202      "    fmov  @r15+,fr6  \n"
0203      "    fmov  @r15+,fr5  \n"
0204      "    fmov  @r15+,fr4  \n"
0205      "    fmov  @r15+,fr3  \n"
0206      "    fmov  @r15+,fr2  \n"
0207      "    fmov  @r15+,fr1  \n"
0208      "    fmov  @r15+,fr0  \n"
0209      "    lds.l @r15+,fpul \n"
0210      "    lds.l @r15+,fpscr\n"
0211      "    mov.l @r15+,r14  \n"
0212 #if 0
0213      "    mov.l @r15+,r13  \n"
0214      "    mov.l @r15+,r12  \n"
0215      "    mov.l @r15+,r11  \n"
0216      "    mov.l @r15+,r10  \n"
0217      "    mov.l @r15+,r9   \n"
0218      "    mov.l @r15+,r8   \n"
0219 #endif
0220 
0221      "    mov.l @r15+,r7   \n"
0222      "    mov.l @r15+,r6   \n"
0223      "    mov.l @r15+,r5   \n"
0224      "    mov.l @r15+,r4   \n"
0225      "    mov.l @r15+,r3   \n"
0226      "    mov.l @r15+,r2   \n"
0227      "    mov.l @r15+,r1   \n"
0228      "    mov.l @r15+,r0   \n"
0229      "    rte              \n"
0230      "    nop              \n"
0231      "    .align 2         \n"
0232      "__vbr_600_sr_and_k:    \n"
0233      "    .long " __STRINGIFY__(~(SH4_SR_RB | SH4_SR_BL)) "\n"
0234      "__vbr_600_sr_or_k:     \n"
0235      "    .long " __STRINGIFY__(SH4_SR_IMASK) "\n"
0236      "__ISR_Handler_k:     \n"
0237      "    .long ___ISR_Handler\n"
0238      "_INTEVT_k:           \n"
0239      "    .long " __STRINGIFY__(SH7750_INTEVT) "\n"
0240      "_ISR_Table_k:        \n"
0241      "    .long   __ISR_Vector_table\n"
0242 
0243      "_ipl_hook:           \n"
0244      "    mov   r14,r15    \n"
0245      "    ldc.l @r15+,ssr  \n"
0246      "    ldc.l @r15+,spc  \n"
0247      "    lds.l @r15+,macl \n"
0248      "    lds.l @r15+,mach \n"
0249      "    lds.l @r15+,pr   \n"
0250      "    mov.l __ISR_temp_fpscr_k,r0   \n"
0251      "    lds   r0,fpscr   \n"
0252      "    fmov  @r15+,fr15 \n"
0253      "    fmov  @r15+,fr14 \n"
0254      "    fmov  @r15+,fr13 \n"
0255      "    fmov  @r15+,fr12 \n"
0256      "    fmov  @r15+,fr11 \n"
0257      "    fmov  @r15+,fr10 \n"
0258      "    fmov  @r15+,fr9  \n"
0259      "    fmov  @r15+,fr8  \n"
0260      "    fmov  @r15+,fr7  \n"
0261      "    fmov  @r15+,fr6  \n"
0262      "    fmov  @r15+,fr5  \n"
0263      "    fmov  @r15+,fr4  \n"
0264      "    fmov  @r15+,fr3  \n"
0265      "    fmov  @r15+,fr2  \n"
0266      "    fmov  @r15+,fr1  \n"
0267      "    fmov  @r15+,fr0  \n"
0268      "    lds.l @r15+,fpul \n"
0269      "    lds.l @r15+,fpscr\n"
0270      "    mov.l @r15+,r14  \n"
0271 
0272      "    mov.l @r15+,r13  \n"
0273      "    mov.l @r15+,r12  \n"
0274      "    mov.l @r15+,r11  \n"
0275      "    mov.l @r15+,r10  \n"
0276      "    mov.l @r15+,r9   \n"
0277      "    mov.l @r15+,r8   \n"
0278 
0279 
0280      "    mov.l @r15+,r7   \n"
0281      "    mov.l @r15+,r6   \n"
0282      "    mov.l @r15+,r5   \n"
0283      "    mov.l @r15+,r4   \n"
0284      "    mov.l @r15+,r3   \n"
0285      "    mov.l @r15+,r2   \n"
0286      "    mov.l  __VBR_Saved600_k, r0\n"
0287      "    mov.l  offset600_k,r1\n"
0288      "    mov.l  @r0,r0\n"
0289      "    add    r1,r0\n"
0290      "    mov.l  @r15+,r1\n"
0291      "    jmp    @r0\n"
0292      "    mov.l  @r15+,r0\n"
0293      "    .align 2\n"
0294      "__ISR_temp_fpscr_k:  \n"
0295      "    .long  " __STRINGIFY__(SH4_FPSCR_PR) " \n"
0296      "__VBR_Saved600_k:\n"
0297      "        .long __VBR_Saved\n"
0298      "offset600_k:\n"
0299      "        .long  0x600\n"
0300 
0301  );
0302 
0303 
0304 /************************************************
0305  * Dummy interrupt service procedure for
0306  * interrupts being not allowed --> Trap 2
0307  ************************************************/
0308 __asm__ (" .section .text\n\
0309 .global __dummy_isp\n\
0310 __dummy_isp:\n\
0311       mov.l r14,@-r15\n\
0312       mov   r15, r14\n\
0313       trapa #2\n\
0314       mov.l @r15+,r14\n\
0315       rte\n\
0316       nop");