📄 cpu_support.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 + -