Ignore:
Timestamp:
Jun 27, 2017, 10:53:32 AM (7 years ago)
Author:
ertl-honda
Message:

3.1.0を反映

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_wo_tecs/trunk/arch/arm_gcc/common/core_support.S

    r302 r306  
    66 *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2015 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5353 *  の責任を負わない.
    5454 *
    55  *  $Id: core_support.S 459 2015-08-29 13:03:42Z ertl-hiro $
     55 *  $Id: core_support.S 733 2016-04-03 09:10:54Z ertl-hiro $
    5656 */
    5757
     
    7272 *  例外ベクタ
    7373 */
    74         ASECTION(vector)
     74        ASECTION(.vector)
     75        AALIGN(5)
    7576        AGLOBAL(vector_table)
    7677ALABEL(vector_table)
     
    122123‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    123124         */
    124         push    {lr}                                    /* 戻り番地を保存 */
     125        push    {r12,lr}                                /* 戻り番地を保存,r12はダミー */
    125126#ifdef TOPPERS_SUPPORT_OVRHDR
    126127        bl              ovrtimer_stop
     
    139140        bl              ovrtimer_start
    140141#endif /* TOPPERS_SUPPORT_OVRHDR */
    141         pop             {lr}                                    /* 戻り番地を復帰 */
     142        pop             {r12,lr}                                /* 戻り番地を復帰 */
    142143        bx              lr
    143144
     
    325326         */
    326327        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    327         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     328        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    328329
    329330        /*
     
    339340         */
    340341        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    341         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     342        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    342343        push    {r1}                                    /* spsrをスタックに保存 */
    343344#else /* __TARGET_ARCH_ARM < 6 */
     
    354355         */
    355356        cps             #CPSR_SVC_MODE
    356         stmfd   sp!, {r0-r4,r12,lr}
     357        stmfd   sp!, {r0-r5,r12,lr}
    357358#endif /* __TARGET_ARCH_ARM < 6 */
     359
     360        /*
     361         *  スタックポインタの調整
     362         */
     363        and             r1, sp, #4
     364        sub             sp, sp, r1
     365        push    {r0,r1}                                 /* r0はスペース確保のため */
    358366
    359367        /*
     
    378386         *  非タスクコンテキスト用のスタックに切り換える.
    379387         */
    380         mov             r1, sp                                  /* この時点のスタックポインタをr1に */
     388        mov             r3, sp                                  /* この時点のスタックポインタをr3に */
    381389        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    382390        ldr             sp, [r2]
    383         push    {r1}                                    /* 切換え前のスタックポインタを保存 */
    384 
     391        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     392                                                                        /* r0はスペース確保のため */
    385393ALABEL(irq_handler_1)
    386394        /*
     
    388396         */
    389397        bl              irc_begin_int
    390         cmp             r4, #TNUM_INHNO                 /* スプリアス割込みなら */
    391         bhs             irq_handler_2                   /*  irq_handler_2に分岐 */
    392 
     398#if TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6
     399        cmp             r4, #TNUM_INHNO                 /* TNUM_INHNOの値によってはエラーになる */
     400#else /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
     401        movw    r3, #TNUM_INHNO
     402        cmp             r4, r3                 
     403#endif /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
     404        bhs             irq_handler_2                   /* スプリアス割込みなら */
     405                                                                        /*  irq_handler_2に分岐 */
    393406        /*
    394407         *  CPUロック解除状æ
     
    447460ALABEL(irq_handler_2)
    448461        bl              irc_end_int
    449 #endif /* OMIT_IRQ_HANDLER */
    450462
    451463        /*
     
    462474         *  タスク用のスタックに戻す.
    463475         */
    464         pop             {r1}
    465         mov     sp, r1
     476        pop             {r0,r3}
     477        mov     sp, r3
    466478
    467479        /*
     
    469481要か判定する.
    470482         */
    471 ALABEL(ret_int_1)
    472483        ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
    473484        ldr             r0, [r0]
     
    482493        tst             r0, r0                                  /* p_runtskがNULLならdispatcher_0へ */
    483494        beq             dispatcher_0
    484         stmfd   sp!, {r5-r11}                   /* 非スクラッチレジスタの保存 */
     495        stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
    485496        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    486497        adr             r1, ret_int_r                   /* 実行再開番地を保存 */
     
    492503         *  コンテキストを復帰する.
    493504         */
    494         ldmfd   sp!, {r5-r11}                   /* 非スクラッチレジスタの復帰 */
     505        ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
    495506
    496507#ifdef TOPPERS_SUPPORT_OVRHDR
     
    516527#endif /* TOPPERS_SUPPORT_OVRHDR */
    517528ALABEL(irq_handler_3)
     529        pop             {r0,r1}                                 /* スタックポインタの調整 */
     530        add             sp, sp, r1
    518531#if __TARGET_ARCH_ARM < 6
    519532        ldmfd   sp!, {r0}                               /* 戻りå
    520533ˆã®cpsrをspsrに設定 */
    521534        msr             spsr_cxsf, r0
    522         ldmfd   sp!, {r0-r4,r12,lr,pc}^ /* コンテキストの復帰 */
     535        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    523536                                                                        /* ^付きなので,spsr → cpsr */
    524537#else /* __TARGET_ARCH_ARM < 6 */
    525         ldmfd   sp!, {r0-r4,r12,lr}
     538        ldmfd   sp!, {r0-r5,r12,lr}
    526539        rfefd   sp!
    527540#endif /* __TARGET_ARCH_ARM < 6 */
     
    536549        b               irq_handler_3
    537550#endif /* TOPPERS_SUPPORT_OVRHDR */
     551#endif /* OMIT_IRQ_HANDLER */
    538552
    539553/*
     
    560574         */
    561575        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    562         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     576        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    563577
    564578        /*
     
    573587         */
    574588        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    575         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     589        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    576590        push    {r1}                                    /* spsrをスタックに保存 */
    577591#else /* __TARGET_ARCH_ARM < 6 */
     
    587601         */
    588602        cps             #CPSR_SVC_MODE
    589         stmfd   sp!, {r0-r4,r12,lr}
     603        stmfd   sp!, {r0-r5,r12,lr}
    590604#endif /* __TARGET_ARCH_ARM < 6 */
    591605        mov             r4, #EXCNO_UNDEF
     
    609623         */
    610624        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    611         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     625        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    612626
    613627        /*
     
    620634         *  戻り番地とspsrを保存する.
    621635         */
    622         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     636        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    623637        push    {r1}                                    /* spsrをスタックに保存 */
    624638#else /* __TARGET_ARCH_ARM < 6 */
     
    634648         */
    635649        cps             #CPSR_SVC_MODE                  /* 不要と思われる */
    636         stmfd   sp!, {r0-r4,r12,lr}
     650        stmfd   sp!, {r0-r5,r12,lr}
    637651#endif /* __TARGET_ARCH_ARM < 6 */
    638652        mov             r4, #EXCNO_SVC
     
    657671         */
    658672        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    659         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     673        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    660674
    661675        /*
     
    670684         */
    671685        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    672         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     686        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    673687        push    {r1}                                    /* spsrをスタックに保存 */
    674688#else /* __TARGET_ARCH_ARM < 6 */
     
    684698         */
    685699        cps             #CPSR_SVC_MODE
    686         stmfd   sp!, {r0-r4,r12,lr}
     700        stmfd   sp!, {r0-r5,r12,lr}
    687701#endif /* __TARGET_ARCH_ARM < 6 */
    688702        mov             r4, #EXCNO_PABORT
     
    720734         */
    721735        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    722         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     736        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    723737
    724738        /*
     
    733747         */
    734748        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    735         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     749        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    736750        push    {r1}                                    /* spsrをスタックに保存 */
    737751#else /* __TARGET_ARCH_ARM < 6 */
     
    747761         */
    748762        cps             #CPSR_SVC_MODE
    749         stmfd   sp!, {r0-r4,r12,lr}
     763        stmfd   sp!, {r0-r5,r12,lr}
    750764#endif /* __TARGET_ARCH_ARM < 6 */
    751765        mov             r4, #EXCNO_DABORT
     
    766780        ldr             sp, =istkpt
    767781        ldr             sp, [sp]
    768         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     782        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    769783
    770784        /*
     
    779793         */
    780794        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    781         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     795        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    782796        push    {r1}                                    /* spsrをスタックに保存 */
    783797#else /* __TARGET_ARCH_ARM < 6 */
     
    786800         *  クポインタを初期化する.
    787801         */
    788         cpsid   if,#CPSR_SVC_MODE
     802        cpsid   if, #CPSR_SVC_MODE
    789803        ldr             sp, =istkpt
    790804        ldr             sp, [sp]
     
    802816         */
    803817        cps             #CPSR_SVC_MODE
    804         stmfd   sp!, {r0-r4,r12,lr}
     818        stmfd   sp!, {r0-r5,r12,lr}
    805819#endif /* __TARGET_ARCH_ARM < 6 */
    806820
     
    833847         */
    834848        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    835         stmfd   sp!, {r0-r4,r12,lr,pc}          /* pcはスペース確保のため */
     849        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    836850
    837851        /*
     
    846860         */
    847861        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    848         str             r2, [sp,#0x1c]                  /* 戻り番地をスタックに保存 */
     862        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    849863        push    {r1}                                    /* spsrをスタックに保存 */
    850864#else /* __TARGET_ARCH_ARM < 6 */
     
    860874         */
    861875        cps             #CPSR_SVC_MODE
    862         stmfd   sp!, {r0-r4,r12,lr}
     876        stmfd   sp!, {r0-r5,r12,lr}
    863877#endif /* __TARGET_ARCH_ARM < 6 */
    864878        mov             r4, #EXCNO_FIQ
     
    875889 * 【この時点のレジスタ状æ
    876890‹ã€‘
    877  *  r0:CPU例外ハンドラ番号
     891 *  r4:CPU例外ハンドラ番号
    878892 */
    879893ALABEL(exc_handler_1)
     
    889903        ldr             r3, [r2]
    890904        push    {r3}                                    /* 例外ネストカウントを保存 */
    891         mov             r12, sp                                 /* CPU例外のæƒ
     905        mov             r5, sp                                  /* CPU例外のæƒ
    892906報を記憶している領域の */
    893                                                                         /*                              å
    894 ˆé ­ç•ªåœ°ã‚’r12に保存 */
     907                                                                        /*                                å
     908ˆé ­ç•ªåœ°ã‚’r5に保存 */
     909        /*
     910         *  スタックポインタの調整
     911         */
     912        and             r1, sp, #4
     913        sub             sp, sp, r1
     914        push    {r0,r1}                                 /* r0はスペース確保のため */
     915
    895916        /*
    896917         *  カーネル管理外のCPU例外か判定する
     
    905926         *  のいずれかがセットされているなら,これ該当する.
    906927         */
    907         ldr             r1, [r12,#T_EXCINF_cpsr]        /* 例外フレームからcpsrを取得 */
     928        ldr             r1, [r5,#T_EXCINF_cpsr]         /* 例外フレームからcpsrを取得 */
    908929        ands    r1, r1, #CPSR_FIQ_IRQ_BIT
    909930        bne             nk_exc_handler_1                /* カーネル管理外のCPU例外の処理へ */
     
    915936         *  r3:excpt_nest_countの値
    916937         *  r4:CPU例外ハンドラ番号
    917          *  r12:CPU例外のæƒ
     938         *  r5:CPU例外のæƒ
    918939報を記憶している領域のå
    919940ˆé ­ç•ªåœ°
     
    932953         *  オーバランタイマを停止する.
    933954         */
    934         push    {r12}
    935955        bl              ovrtimer_stop
    936         pop             {r12}
    937956#endif /* TOPPERS_SUPPORT_OVRHDR */
    938957
     
    943962        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    944963        ldr             sp, [r2]
    945         push    {r3}                                    /* 切換え前のスタックポインタを保存 */
    946 
     964        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     965                                                                        /* r0はスペース確保のため */
    947966ALABEL(exc_handler_2)
    948967        /*
     
    950969‹ã€‘
    951970         *  r4:CPU例外ハンドラ番号
    952          *  r12:CPU例外のæƒ
     971         *  r5:CPU例外のæƒ
    953972報を記憶している領域のå
    954973ˆé ­ç•ªåœ°
     
    9821001         */
    9831002#ifdef LOG_EXC_ENTER
    984         push    {r12}
    9851003        mov             r0, r4                                  /* CPU例外番号をパラメータに渡す */
    9861004        bl              log_exc_enter
    987         pop             {r12}
    9881005#endif /* LOG_EXC_ENTER */
    9891006
     
    9931010        ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
    9941011        ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
    995         mov             r0, r12                                 /* CPU例外のæƒ
     1012        mov             r0, r5                                  /* CPU例外のæƒ
    9961013報を記憶している領域の */
    9971014                                                                        /*              å
     
    10351052        ldr             r3, [r2]
    10361053        subs    r3, r3, #1
    1037         str             r3, [r2]
     1054        str             r3, [r2]                                /* 戻りå
     1055ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
     1056        bne             exc_handler_3                   /*                              exc_handler_3に分岐 */
    10381057
    10391058        /*
    10401059         *  タスク用のスタックに戻す.
    10411060         */
    1042         popeq   {r1}                                    /* 戻りå
    1043 ˆãŒã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
    1044         moveq   sp, r1                                  /*               ã‚¿ã‚¹ã‚¯ç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ã«æˆ»ã™ */
     1061        pop             {r0,r3}
     1062        mov             sp, r3
     1063
     1064        /*
     1065         *  ディスパッチがå¿
     1066要か判定する.
     1067         */
     1068        ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
     1069        ldr             r0, [r0]
     1070        ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
     1071        ldr             r1, [r1]
     1072        teq             r0, r1                                  /* p_runtskとp_schedtskが同じなら */
     1073        beq             exc_handler_4                   /*                                exc_handler_4へ */
     1074
     1075        /*
     1076         *  コンテキストを保存する.
     1077         */
     1078        tst             r0, r0                                  /* p_runtskがNULLならdispatcher_0へ */
     1079        beq             dispatcher_0
     1080        stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     1081        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
     1082        adr             r1, ret_exc_r                   /* 実行再開番地を保存 */
     1083        str             r1, [r0,#TCB_pc]
     1084        b               dispatcher                              /* r0にはp_runtskが格納されている */
     1085
     1086ALABEL(ret_exc_r)
     1087        /*
     1088         *  コンテキストを復帰する.
     1089         */
     1090        ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     1091
     1092#ifdef TOPPERS_SUPPORT_OVRHDR
     1093        /*
     1094         *  オーバランタイマを動作開始する.
     1095         */
     1096        bl              ovrtimer_start
     1097#endif /* TOPPERS_SUPPORT_OVRHDR */
     1098
     1099        /*
     1100         *  CPU例外処理からのリターン
     1101         *
     1102         *  CPU例外処理からのリターンにより,CPUロック解除状æ
     1103‹ã«é·ç§»ã™ã‚‹ã‚ˆ
     1104         *  うにするå¿
     1105要があるが,ARMはCPSRのビットによってCPUロック状æ
     1106‹ã‚’
     1107         *  表しているため,CPSRをå
     1108ƒã«æˆ»ã—てリターンすればよい.
     1109         */
     1110#ifndef TOPPERS_SUPPORT_OVRHDR
     1111ALABEL(exc_handler_4)
     1112#endif /* TOPPERS_SUPPORT_OVRHDR */
     1113ALABEL(exc_handler_3)
     1114        pop             {r0,r1}                                 /* スタックポインタの調整 */
     1115        add             sp, sp, r1
    10451116        add             sp, sp, #8                              /* スタック上のæƒ
    10461117報を捨てる */
    1047         beq             ret_int_1                               /* ret_int_1に分岐 */
    1048 
    1049         /*
    1050          *  CPU例外処理からのリターン(irq_handler_3と同じ処理å†
    1051 å®¹ï¼‰
    1052          */
    10531118#if __TARGET_ARCH_ARM < 6
    10541119        ldmfd   sp!, {r0}                               /* 戻りå
    10551120ˆã®cpsrをspsrに設定 */
    10561121        msr             spsr_cxsf, r0
    1057         ldmfd   sp!, {r0-r4,r12,lr,pc}^ /* コンテキストの復帰 */
     1122        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    10581123                                                                        /* ^付きなので,spsr → cpsr */
    10591124#else /* __TARGET_ARCH_ARM < 6 */
    1060         ldmfd   sp!, {r0-r4,r12,lr}
     1125        ldmfd   sp!, {r0-r5,r12,lr}
    10611126        rfefd   sp!
    10621127#endif /* __TARGET_ARCH_ARM < 6 */
     1128
     1129#ifdef TOPPERS_SUPPORT_OVRHDR
     1130ALABEL(exc_handler_4)
     1131        /*
     1132         *  オーバランタイマを動作開始する.
     1133         */
     1134        tst             r0, r0                                  /* p_runtskがNULLでない場合 */
     1135        blne    ovrtimer_start
     1136        b               exc_handler_3
     1137#endif /* TOPPERS_SUPPORT_OVRHDR */
    10631138
    10641139/*
     
    10741149         *  r3:excpt_nest_countの値
    10751150         *  r4:CPU例外ハンドラ番号
    1076          *  r12:CPU例外のæƒ
     1151         *  r5:CPU例外のæƒ
    10771152報を記憶している領域のå
    10781153ˆé ­ç•ªåœ°
     
    10931168        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    10941169        ldr             sp, [r2]
    1095         push    {r3}                                    /* 切換え前のスタックポインタを保存 */
    1096 
     1170        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     1171                                                                        /* r0はスペース確保のため */
    10971172ALABEL(nk_exc_handler_2)
    10981173        /*
     
    11091184        ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
    11101185        ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
    1111         mov             r0, r12                                 /* CPU例外のæƒ
     1186        mov             r0, r5                                  /* CPU例外のæƒ
    11121187報を記憶している領域の */
    11131188                                                                        /*              å
     
    11231198        ldr             r3, [r2]
    11241199        subs    r3, r3, #1
    1125         str             r3, [r2]
     1200        str             r3, [r2]                                /* 戻りå
     1201ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
     1202        bne             exc_handler_3                   /*                              exc_handler_3に分岐 */
    11261203
    11271204        /*
    11281205         *  タスク用のスタックに戻す.
    11291206         */
    1130         popeq   {r1}                                    /* 戻りå
    1131 ˆãŒã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
    1132         moveq   sp, r1                                  /*               ã‚¿ã‚¹ã‚¯ç”¨ã®ã‚¹ã‚¿ãƒƒã‚¯ã«æˆ»ã™ */
    1133         add             sp, sp, #8                              /* スタック上のæƒ
    1134 å ±ã‚’捨てる */
    1135 
    1136         /*
    1137          *  CPU例外処理からのリターン(irq_handler_3と同じ処理å†
    1138 å®¹ï¼‰
    1139          */
    1140 #if __TARGET_ARCH_ARM < 6
    1141         ldmfd   sp!, {r0}                               /* 戻りå
    1142 ˆã®cpsrをspsrに設定 */
    1143         msr             spsr_cxsf, r0
    1144         ldmfd   sp!, {r0-r4,r12,lr,pc}^ /* コンテキストの復帰 */
    1145                                                                         /* ^付きなので,spsr → cpsr */
    1146 #else /* __TARGET_ARCH_ARM < 6 */
    1147         ldmfd   sp!, {r0-r4,r12,lr}
    1148         rfefd   sp!
    1149 #endif /* __TARGET_ARCH_ARM < 6 */
    1150 
    1151 /*
    1152  *  微少時間å¾
    1153 ã¡
    1154  */
    1155         ATEXT
    1156         AALIGN(2)
    1157         AGLOBAL(_sil_dly_nse)
    1158 ALABEL(_sil_dly_nse)
    1159         subs    r0, r0, #SIL_DLY_TIM1
    1160         bxls    lr
    1161 ALABEL(_sil_dly_nse1)
    1162         subs    r0, r0, #SIL_DLY_TIM2
    1163         bhi             _sil_dly_nse1
    1164         bx              lr
     1207        pop             {r0,r3}
     1208        mov             sp, r3
     1209        b               exc_handler_3
    11651210
    11661211/*
     
    11861231
    11871232#endif /* __thumb__ */
     1233
     1234/*
     1235 *  微少時間å¾
     1236ち
     1237 *
     1238 *  キャッシュラインのどの場所にあるかのよって実行時間が変わるため,大
     1239 *  きめの単位でアラインしている.
     1240 */
     1241        ATEXT
     1242        AALIGN(8)
     1243        AGLOBAL(sil_dly_nse)
     1244ALABEL(sil_dly_nse)
     1245        mov             r1, #0
     1246        mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測å
     1247¨ä½“の無効化 */
     1248        asm_inst_sync_barrier r3
     1249        subs    r0, r0, #SIL_DLY_TIM1
     1250        bxls    lr
     1251ALABEL(sil_dly_nse1)
     1252        mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測å
     1253¨ä½“の無効化 */
     1254        asm_inst_sync_barrier r3
     1255        subs    r0, r0, #SIL_DLY_TIM2
     1256        bhi             sil_dly_nse1
     1257        bx              lr
Note: See TracChangeset for help on using the changeset viewer.