📄 cpu_support.s
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2000-2003 by Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h" .section .text .align 2 .set noat /* atレジスタを网脱したときにワ〖ニングを叫蜗しないよう回年 */ .set noreorder/* * 毋嘲/充り哈み叫掐庚借妄ル〖チン∈办忍毋嘲∷ * * 慌屯¨ * ˇCPU毋嘲ハンドラは、润タスクコンテキストで悸乖する。 * ˇk0 レジスタを、充哈み】毋嘲ネストカウンタとして蝗脱する。 * ˇreqflg をチェックする涟に充哈みを敦贿しないと、reqflg をチェック稿に弹瓢さ * れた充哈みハンドラ柒でディスパッチが妥滇された眷圭にディスパッチされない。 * ˇ充哈み钓材】稍钓材の借妄は、EXLビットを脱いて乖う。 * これは、钙叫傅のコンテキストの CPUロック觉轮を瘦赂するためである。 * ただし、鼎奶婶に借妄を败乖する眷圭にはIEビットを脱いて、充哈み钓材】稍钓材 * を悸附する涩妥があるために、IEビットによる充哈み钓材】稍钓材に恃构している * 祸に庙罢。 * ∈毋¨觅变ディスパッチの借妄に掐る木涟、タスク毋嘲借妄を钙叫す木涟∷ * * C咐胳ル〖チンでlong long房を蝗う眷圭はレジスタの略闰】牲傅をdouble wordで乖 * うべきだが、蝗脱裳刨が你いのと、叫掐庚借妄のオ〖バ〖ヘッドを雇えて、wordで略 * 闰】牲傅を乖っている。经丸弄には略闰するデ〖タサイズをタスク掳拉で回年できる * ようにする徒年 */ .global general_exception .global join_interrupt_and_exception /* 簇眶钙叫(proc_interrupt_sys)箕に涩妥 */general_exception: addi sp, sp, -25*4 sw sp, 0*4(sp) /* EXCSTACK菇陇挛脱(cpu_experr簇眶脱) */ sw at, 1*4(sp) sw v0, 2*4(sp) sw v1, 3*4(sp) sw a0, 4*4(sp) sw a1, 5*4(sp) sw a2, 6*4(sp) sw a3, 7*4(sp) sw t0, 8*4(sp) sw t1, 9*4(sp) sw t2, 10*4(sp) sw t3, 11*4(sp) sw t4, 12*4(sp) sw t5, 13*4(sp) sw t6, 14*4(sp) sw t7, 15*4(sp) sw t8, 16*4(sp) sw t9, 17*4(sp) sw gp, 18*4(sp) sw fp, 19*4(sp) sw ra, 20*4(sp) mfc0 a1, Status /* a1 -> 毋嘲借妄で蝗う */ mfc0 t1, EPC sw a1, 21*4(sp) /* Status */ sw t1, 22*4(sp) /* EPC */ mfhi t2 /* 捐近换レジスタ HI の略闰 */ mflo t3 /* 捐近换レジスタ LO の略闰 */ sw t2, 23*4(sp) /* HI */ sw t3, 24*4(sp) /* LO */ move a0, sp /* 毋嘲ハンドラの苞眶肋年 */ /* 苞眶は、毋嘲券栏箕のデ〖タを锣闰したスタック挝拌へのポインタ 充哈みコントロ〖ラのデ〖タを崔めると剩花になるため、 滦据はMIPS3コアのレジスタ婶尸のみとする。 */ PUSH_ICU_IPM /* 充哈みコントロ〖ラの充哈みマスクの 略闰マクロ(システム巴赂婶で年盗) */ bgtz k0, multipul_exception /* 介檬の毋嘲と驴脚毋嘲の冉侍 */ addi k0, k0, 1 /* ネストカウンタのインクリメント *//* 介檬の毋嘲の眷圭 */first_exception: la t3, _stack_top /* _stack_top は、システム巴赂婶 (リンカスクリプト夸京)年盗 */ /* スタックポインタの负换(t3=t3-4)は、 _stack_top 肋年箕に乖っているので、 ここでは稍妥 */ sw sp, (t3) /* タスクスタックポインタの瘦赂 */ move sp, t3 /* スタック磊り仑え */ jal proc_interrupt_and_exception /* 充哈みと毋嘲の冉侍借妄へ */ nop /* 充哈み敦贿で提ってくる */ la t2, reqflg lw t3, (t2) /* t3 = reqflg */ lw sp, (sp) /* スタック磊り仑え */ beq t3, zero, ret_to_task_int /* ディスパッチ妥滇がない眷圭 */ nop j ret_int /* 充哈み】毋嘲の叫庚借妄へ */ sw zero, (t2) /* reqflg のクリア *//* 驴脚毋嘲∈驴脚充哈み∷の眷圭 (毋嘲ハンドラの苞眶は贷に a0 に肋年貉み) */multipul_exception: jal proc_interrupt_and_exception /* 充哈みと毋嘲の冉侍借妄へ */ nop/* ディスパッチャを钙ばずに帽姐に充哈み傅∈毋嘲券栏傅∷に提る眷圭 */ret_to_task_int: POP_ICU_IPM /* 充哈みコントロ〖ラの充哈みマスクの 牲耽マクロ(システム巴赂婶で年盗) */ lw t0, 23*4(sp) /* HI */ lw t1, 24*4(sp) /* LO */ mthi t0 /* 捐近换レジスタ HI の牲傅 */ mtlo t1 /* 捐近换レジスタ LO の牲傅 *//* 瘦伪¨long long房を蝗脱した眷圭 */ lw t0, 21*4(sp) /* Status */ lw t1, 22*4(sp) /* EPC */ lw at, 1*4(sp) lw v0, 2*4(sp) lw v1, 3*4(sp) lw a0, 4*4(sp) lw a1, 5*4(sp) lw a2, 6*4(sp) lw a3, 7*4(sp) /* * 驴脚毋嘲箕なので、タスクスイッチがない眷圭なので、タスクコンテキスト * の充哈みマスクが恃构されている看芹はない。 * ∈ステ〖タスレジスタは傅の猛をそのまま今き提す∷ */ mtc0 t0, Status mtc0 t1, EPC lw t0, 8*4(sp) lw t1, 9*4(sp) lw t2, 10*4(sp) lw t3, 11*4(sp) lw t4, 12*4(sp) lw t5, 13*4(sp) lw t6, 14*4(sp) lw t7, 15*4(sp) lw t8, 16*4(sp) lw t9, 17*4(sp) lw gp, 18*4(sp) lw fp, 19*4(sp) lw ra, 20*4(sp) addi sp, sp, 25*4 /* ERET 炭吾は、木稿の炭吾を悸乖しない ので觅变スロットには掐れられない。*/ eret /* 毋嘲からの牲耽 */ nop/* * 充哈みと毋嘲の冉侍借妄簇眶 * 笆布のレジスタに猛が洛掐貉み * a0 : 毋嘲ハンドラの苞眶, a1 : ステ〖タスレジスタ */proc_interrupt_and_exception: addi sp, sp, -4 sw ra, 0(sp) mfc0 a2, Cause andi t2, a2, ExcCode_mask beq t2, zero, proc_interrupt /* 充哈みと毋嘲の冉侍 */ /* ここから木儡proc_interrupt_sysへ若びたいが、葡かない 材墙拉があるので、办刨proc_interruptに若ぶ。 */ nop/* 充哈み笆嘲の毋嘲の借妄 */ la t4, exc_table /* a1 = Status */ ori t5, a1, SR_EXL xori t5, t5, SR_EXL /* EXLビットクリア */ /* 充哈み笆嘲の毋嘲はCPUロック觉轮でも减け烧けるので、CPUロック 觉轮を瘦赂する涩妥がある。そのためIEビットは拎侯せずに、充り 哈み敦贿ˇ钓材はEXLビットを脱いて悸附する */ add t6, t4, t2 /* 毋嘲コ〖ド滦炳アドレスの肋年 */ lw t7, (t6) /* C咐胳ル〖チンの钙叫アドレス艰评 */ jalr t7 /* C咐胳ル〖チン钙び叫し */ mtc0 t5, Status /* 充哈み钓材 (EXLビット = 0) */ mfc0 t0, Status ori t0, t0, SR_EXL mtc0 t0, Status /* 充哈み敦贿 (EXLビット = 1) */ NOP_FOR_CP0_HAZARD /* CP0ハザ〖ドのための箕粗苍ぎマクロ (このマクロはシステム巴赂婶年盗) */ j join_interrupt_and_exception /* 毋嘲ˇ充哈みの圭萎孟爬へ */ nop/* 充哈みの眷圭の借妄 */proc_interrupt:/* * 充哈みコントロ〖ラの驴屯拉に滦炳するため、悸刘はシステム巴赂婶で乖う。 * 悸刘数恕は、 * マクロ∈PROC_INTERRUPT_SYS∷または、簇眶钙叫(proc_interrupt_sys) * とする。 * * ˇ钙叫箕にセットされている苞眶 * a1 : ステ〖タスレジスタ * a2 : 付傍レジスタ * * ˇ悸刘箕には、raレジスタを撬蝉してはならない。 * * ˇ悸刘する恶挛弄な借妄の萎れ¨ * 1. 充哈み妥傍の冉侍 * 2. 充哈みマスク∈コア、充哈みコントロ〖ラ∷の肋年 * 3. 充哈み钓材 * 4. C咐胳ル〖チンの钙叫 * 5. 充哈み敦贿 * 6. 充哈みコントロ〖ラの充哈み妥滇のクリア * (7. join_interrupt_and_exceptionに提る。; 簇眶钙叫の眷圭) */#ifdef PROC_INTERRUPT_SYS PROC_INTERRUPT_SYS#else /* PROC_INTERRUPT_SYS */ j proc_interrupt_sys nop#endif /* PROC_INTERRUPT_SYS *//* 毋嘲ˇ充哈み借妄の圭萎孟爬 */join_interrupt_and_exception: addi k0, k0, -1 /* ネストカウンタ ディクリメント */ lw ra, (sp) /* ra を牲傅 */ jr ra /* proc_interrupt_and_exeption の钙叫傅 に提る */ addi sp, sp, 4/* * 充り哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄 * * 提り黎がタスクコンテキストでreqflgがセットされている眷圭のみ、ここにくる。 * ˇk0 = 0、充哈み敦贿觉轮、绕脱レジスタを瘦赂した觉轮で钙び叫すこと。 * ˇt1にruntskの猛を掐れてからret_int_1にジャンプすること。 */ret_int: POP_ICU_IPM /* 充哈みコントロ〖ラの充哈みマスクの 牲耽マクロ(システム巴赂婶で年盗) */ lw t1, 21*4(sp) /* Status */ ori t1, t1, SR_EXL /* 充哈み借妄に掐るときの、CPUロック 觉轮を瘦积したいので、充哈み敦贿は EXLビットを脱いて乖う。 */ mtc0 t1, Status /* MIPS3コアの充哈みマスクの牲耽 + EXLビットによる充哈み敦贿 */ la t0, enadsp la t3, runtsk lw t2, (t0) /* t2 = enadsp */ lw t1, (t3) /* t1 = runtsk */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -