⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu_support.s

📁 toppers操作系统源码
💻 S
字号:
/*  * *  TOPPERS/JSP Kernel *     Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory *              Graduate School of Information Science, Nagoya Univ., JAPAN   *  * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *     涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *     スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *     脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *     荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *     の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *     脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *     とˉ *   (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *       侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *   (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *       鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *     巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * *  @(#) $Id: cpu_support.S,v 1.4 2005/07/06 01:48:21 honda Exp $ */#define _MACRO_ONLY/* *  アプリケ〖ションと鼎奶のインクル〖ドファイル */#include <kernel.h>/* *  タ〖ゲット巴赂攫鼠の年盗 */#include <t_config.h>#include "jsp_kernel.h"#include "offset.h"#include <nios2.h>    .set noat    .section .exceptions, "xa"    .align 2    .global _irq_entry    .type   _irq_entry, @function_irq_entry:    /*     *  毋嘲妥傍の冉年     */    rdctl   et, estatus    andi    et, et, 1    beq     et, zero, _check_trap    rdctl   et, ipending    beq     et, zero, _check_trap       /*    * 毋嘲妥傍は充哈み    */    addi ea, ea, -4      /* 提り戎孟をデクリメント */    addi  sp, sp, -76    /* レジスタの瘦赂 */    rdctl et, estatus    stw   et,   0(sp)    stw   at,   4(sp)    stw   r2,   8(sp)    stw   r3,  12(sp)    stw   r4,  16(sp)    stw   r5,  20(sp)    stw   r6,  24(sp)    stw   r7,  28(sp)    stw   r8,  32(sp)    stw   r9,  36(sp)    stw   r10, 40(sp)    stw   r11, 44(sp)    stw   r12, 48(sp)    stw   r13, 52(sp)    stw   r14, 56(sp)    stw   r15, 60(sp)    stw   fp,  64(sp)    stw   ra,  68(sp)    stw   ea,  72(sp)    /*     * 驴脚充哈みか冉年     */    ldw   r3, %gprel(interrupt_count)(gp)  /* ネスト搀眶のチェック */    bltu  zero, r3,  nest_int    movhi r2, %hiadj(STACKTOP-4)    addi  r2, r2, %lo(STACKTOP-4)    stw   sp, 0(r2)     /* スタックポインタの瘦赂 */            mov   sp, r2        /* スタックポインタの掐れ仑え */nest_int:    /*     *  充哈み妥傍の冉年と钙び叫し     */    call int_handler_callret_from_int:    ldw   r3, %gprel(interrupt_count)(gp)       bltu  zero, r3, res_reg_and_ret /* ネスト搀眶が1笆惧なら提る */    ldw   r2, 0(sp)                 /* スタックポインタを提す */    mov   sp, r2                    /* スタックポインタを提す */    ldw   r3, %gprel(reqflg)(gp)    /* reqflgのチェック */    beq   r3, zero, res_reg_and_ret    br    ret_intres_reg_and_ret:    ldw   et,   0(sp)  /* レジスタの牲耽 */    wrctl estatus, et    ldw   at,   4(sp)    ldw   r2,   8(sp)    ldw   r3,  12(sp)    ldw   r4,  16(sp)    ldw   r5,  20(sp)    ldw   r6,  24(sp)    ldw   r7,  28(sp)    ldw   r8,  32(sp)    ldw   r9,  36(sp)    ldw   r10, 40(sp)    ldw   r11, 44(sp)    ldw   r12, 48(sp)    ldw   r13, 52(sp)    ldw   r14, 56(sp)    ldw   r15, 60(sp)    ldw   fp,  64(sp)    ldw   ra,  68(sp)    ldw   ea,  72(sp)    addi  sp, sp, 76            eret      _check_trap:            /*     *  Trapか冉年     */    ldw   et, -4(ea)               /* 毋嘲を叫した炭吾を艰评 */    xorhi et, et, 0x003b           /*  惧疤16bit             */    xori  et, et, 0x683a           /*  布疤16bit             */    beq   et, zero, trap_handler_check_exc:    addi  sp, sp, -76    rdctl et,   estatus    stw   et,    0(sp)    stw   at,    4(sp)    stw   r2,    8(sp)    stw   r3,   12(sp)    stw   r4,   16(sp)    stw   r5,   20(sp)    stw   r6,   24(sp)    stw   r7,   28(sp)    stw   r8,   32(sp)    stw   r9,   36(sp)    stw   r10,  40(sp)    stw   r11,  44(sp)    stw   r12,  48(sp)    stw   r13,  52(sp)    stw   r14,  56(sp)    stw   r15,  60(sp)    stw   fp,   64(sp)    stw   ra,   68(sp)    stw   ea,   72(sp)    mov   r4,   sp     /* ハンドラの苞眶 */    /*     * 驴脚充哈みか冉年     */    ldw   r3, %gprel(interrupt_count)(gp)  /* ネスト搀眶のチェック */    bltu  zero, r3,  nest_int_exc        movhi r2, %hiadj(STACKTOP-4)    addi  r2, r2, %lo(STACKTOP-4)    stw   sp, 0(r2)     /* スタックポインタの瘦赂 */            mov   sp, r2        /* スタックポインタの掐れ仑え */nest_int_exc:        call exc_handler_call  /* CPU毋嘲ハンドラ钙び叫しル〖チンの悸乖 */    br ret_from_int        /* リタ〖ン借妄 */trap_handler:   /*    *  Trapハンドラ〖    */    eret      .set noat    .align  2    .global ret_int    .global ret_excret_int:ret_exc:    stw   zero, %gprel(reqflg)(gp)   /* reqflg を FALSEに */    ldw   r5,   %gprel(runtsk)(gp)   /* r5 <- runtsk      */    ldw   r6,   %gprel(enadsp)(gp)   /* r6 <- enadsp      */    beq   r6,   zero, ret_int_1      /* enadsp が FALSE なら ret_int_1 へ */    ldw   r4,   %gprel(schedtsk)(gp) /* r4 <- schedtsk    */    beq   r4,   r5, ret_int_1        /* runtsk と schedtskが票じならret_int_1へ */    addi  sp,   sp, -32              /* 荒りのレジスタを瘦赂 */        stw   r16,  0(sp)    stw   r17,  4(sp)    stw   r18,  8(sp)    stw   r19, 12(sp)    stw   r20, 16(sp)    stw   r21, 20(sp)    stw   r22, 24(sp)    stw   r23, 28(sp)    stw   sp,  TCB_sp(r5)         /* タスクスタックをTCBに瘦赂 */    movhi r2,  %hiadj(ret_int_r)  /* 悸乖倡幌戎孟を瘦赂        */    addi  r2,  r2, %lo(ret_int_r)    stw   r2,  TCB_pc(r5)         /* 悸乖浩倡戎孟をTCBに瘦赂   */    br    dispatcherret_int_r:    ldw   r16,  0(sp)       /* レジスタを牲耽 */    ldw   r17,  4(sp)    ldw   r18,  8(sp)    ldw   r19, 12(sp)    ldw   r20, 16(sp)    ldw   r21, 20(sp)    ldw   r22, 24(sp)    ldw   r23, 28(sp)    addi  sp, sp, 32    ret_int_1:    /*     *  タスク毋嘲ル〖チンの弹瓢         *  ret_int_r は dispatcher から钙び叫されるため·     *  tcbのアドレスは r4 に掐っている     */    ldw  r5, TCB_enatex(r4)       /* r5 <- enatex */#if TCB_enatex_mask > 0xffff    andhi r6, r5, %hi(TCB_enatex_mask)#else    andi r6, r5, %lo(TCB_enatex_mask)#endif /* TCB_enatex_mask > 0xffff */    andhi r6, r5, 4    beq  r6, zero, ret_int_2      /* enatex が FALSE ならリタ〖ン */    ldw  r7, TCB_texptn(r4)       /* r7 <- texptn, texptnが0でなければ */    beq  zero, r7, ret_int_2          call call_texrtn              /* タスク毋嘲ル〖チンの钙び叫し */ret_int_2:    ldw   et,   0(sp)    /* レジスタを牲耽 */    wrctl estatus, et    ldw   at,   4(sp)    ldw   r2,   8(sp)    ldw   r3,  12(sp)    ldw   r4,  16(sp)    ldw   r5,  20(sp)    ldw   r6,  24(sp)    ldw   r7,  28(sp)    ldw   r8,  32(sp)    ldw   r9,  36(sp)    ldw   r10, 40(sp)    ldw   r11, 44(sp)    ldw   r12, 48(sp)    ldw   r13, 52(sp)    ldw   r14, 56(sp)    ldw   r15, 60(sp)    ldw   fp,  64(sp)    ldw   ra,  68(sp)    ldw   ea,  72(sp)    addi  sp, sp, 76            eret              .global dispatch    .align  2dispatch:    addi  sp, sp, -40                /* レジスタを瘦赂 */        stw   r16,  0(sp)    stw   r17,  4(sp)    stw   r18,  8(sp)    stw   r19, 12(sp)    stw   r20, 16(sp)    stw   r21, 20(sp)    stw   r22, 24(sp)    stw   r23, 28(sp)    stw   fp,  32(sp)    stw   ra,  36(sp)    ldw   r4,  %gprel(runtsk)(gp)  /* r4 <- runtsk              */    stw   sp,  TCB_sp(r4)          /* タスクスタックをTCBに瘦赂 */    movhi r5,  %hiadj(dispatch_r)  /* 悸乖倡幌戎孟を瘦赂        */    addi  r5,  r5, %lo(dispatch_r)    stw   r5,  TCB_pc(r4)          /* 悸乖浩倡戎孟をTCBに瘦赂   */    br    dispatcherdispatch_r:    ldw   r16,  0(sp)              /* レジスタを牲耽 */    ldw   r17,  4(sp)    ldw   r18,  8(sp)    ldw   r19, 12(sp)    ldw   r20, 16(sp)    ldw   r21, 20(sp)    ldw   r22, 24(sp)    ldw   r23, 28(sp)    ldw   fp,  32(sp)         /*     * タスク毋嘲ル〖チンの弹瓢     *  dispatch_r は dispatcher から钙び叫されるため·     *  tcb のアドレスは r4 に掐っている     */        ldw  r5, TCB_enatex(r4)       /* r5 <- enatex */#if TCB_enatex_mask > 0xffff    andhi r6, r5, %hi(TCB_enatex_mask)#else    andi r6, r5, %lo(TCB_enatex_mask)#endif /* TCB_enatex_mask > 0xffff */    beq  r6, zero, dispatch_r_1   /* enatex が FALSE ならリタ〖ン */    ldw  r7, TCB_texptn(r4)       /* r7 <- texptn, texptnが0でなければ */    beq  r7, zero, dispatch_r_1        call call_texrtn              /* タスク毋嘲ル〖チンの钙び叫し */dispatch_r_1:    ldw   ra, 36(sp)              /* 荒りのレジスタを牲耽 */        addi  sp, sp, 40                    ret    .global exit_and_dispatchexit_and_dispatch:    stw      zero, %gprel(interrupt_count)(gp)  /* interrupt_count をクリア */dispatcher:    /*     * ここは充哈み敦贿で丸ること     */        ldw   r4,   %gprel(schedtsk)(gp) /* r4 <- schedtsk              */    stw   r4,   %gprel(runtsk)(gp)   /* schedtsk を runtskに        */    beq   r4,   zero, dispatcher_1   /* schedtskがあるか            */    ldw   sp,   TCB_sp(r4)           /* TCBからタスクスタックを牲耽 */    ldw   r5,   TCB_pc(r4)           /* TCBから悸乖浩倡戎孟を牲耽   */    jmp   r5dispatcher_1:    /*     * ここで充哈みモ〖ドに磊り仑えるのは·ここで券栏する充哈み借妄     * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で     * のタスクディスパッチの松贿という2つの罢蹋があるˉ     */    movhi sp, %hiadj(STACKTOP)            /* 充哈みスタックに恃构  */    addi  sp, sp, %lo(STACKTOP)                  movi  r5, 1                           /* interrupt_count を1に */    stw   r5, %gprel(interrupt_count)(gp)  dispatcher_2:    wrctl status, r5      /* 充哈みの钓材 */    nop    nop    nop    nop    wrctl status, zero                      /* 充哈みの敦贿             */    ldw   r6, %gprel(reqflg)(gp)            /* r6 <- reqflg             */    beq   r6, zero, dispatcher_2            /* reqflg が FALSE なら     */    stw   zero, %gprel(interrupt_count)(gp) /* interrupt_count をクリア */     stw   zero, %gprel(reqflg)(gp)          /* reqflg を FALSE に       */     br    dispatcher    .text    .global activate_r    .align 2activate_r:    movi  r2, 1    wrctl status, r2      /* 充哈み钓材       */    ldw   r4, 4(sp)       /* 苞眶(exinf)      */    ldw   r2, 0(sp)       /* タスクの悸乖戎孟 */    addi  sp, sp, 8    movhi ra, %hiadj(ext_tsk)    addi  ra, ra, %lo(ext_tsk)    jmp   r2              /* タスクの悸乖倡幌 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -