📄 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 * * 惧淡螟侯涪荚は·笆布の (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.16 2005/11/12 14:58:46 hiro Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M68040脱∷ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"/* * タスクディスパッチャ * * dispatch は·マスタモ〖ドˇ充哈み敦贿觉轮で钙び叫さなければならな * いˉexit_and_dispatch も·マスタモ〖ドˇ充哈み敦贿觉轮で钙び叫すの * が付搂であるが·カ〖ネル弹瓢箕に滦炳するため·充哈みモ〖ドで钙び叫 * した眷圭にも滦炳しているˉ */ .text .globl dispatch .globl exit_and_dispatchdispatch: movem.l %d2-%d7/%a2-%a6, -(%sp) /* レジスタを瘦赂 */ move.l runtsk, %a0 /* A0 を runtsk に */ move.l %sp, TCB_msp(%a0) /* タスクスタックを瘦赂 */ move.l #dispatch_r, TCB_pc(%a0) /* 悸乖浩倡戎孟を瘦赂 */ jbra dispatcherdispatch_r: movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを牲耽 */ btst.b #TCB_enatex_bit, TCB_enatex(%a0) jbeq dispatch_r_1 /* enatex が FALSE ならリタ〖ン */ tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */ jbne call_texrtn /* タスク毋嘲借妄ル〖チンの钙叫し */dispatch_r_1: rtsexit_and_dispatch: or.w #0x1000, %sr /* マスタモ〖ド */dispatcher: /* * ここではマスタモ〖ドˇ充哈み敦贿觉轮でなければならないˉ */ move.l schedtsk, %a0 move.l %a0, runtsk /* schedtsk を runtsk に */ jbeq dispatcher_1 /* runtsk があるか々 */ move.l TCB_msp(%a0), %sp /* タスクスタックを牲耽 */ move.l TCB_pc(%a0), %a1 /* 悸乖浩倡戎孟を牲耽 */ jmp (%a1)dispatcher_1: stop #0x2000 /* 充哈み略ち∈充哈みモ〖ド∷ */ /* * ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という2つの罢蹋があるˉ * * この stop炭吾は·IPM を 0 にするが·塑丸は task_intmask に * 肋年すべきであるˉM68040 では·stop 炭吾のパラメ〖タに年眶 * しかとれないため·やむをえず 0 にしている∈stop 炭吾を 8つ * 事べて·task_intmask の猛で若び尸ける缄はあるが·そこまで * やる罢盗はないと雇えた∷ˉ * * プロセッサを略ちモ〖ドに败乖させる借妄と·充哈み钓材とは· * 稍材尸に乖なう涩妥がある∈M68040 では stop炭吾で尉数乖なう * ので啼玛ない∷ˉこれを稍材尸に乖なわない眷圭·充哈みを钓材 * した木稿に充哈みが掐り·その面でタスクが悸乖材墙觉轮になる * と·悸乖すべきタスクがあるにもかかわらずプロセッサが略ちモ〖 * ドになってしまうˉ * * 充哈みを略つ粗は·runtsk を NULL∈=0∷に肋年しなければなら * ないˉこのように肋年しないと·充哈みハンドラから iget_tid * を钙び叫した狠の瓢侯が慌屯に圭米しなくなるˉ */ or.w #0x1700, %sr /* マスタモ〖ドˇ充哈み敦贿 */ tst.l reqflg /* reqflg が FALSE なら */ jbeq dispatcher_1 /* dispatcher_1 へ */ clr.l reqflg /* reqflg を FALSE に */ jbra dispatcher /* * タスク弹瓢箕借妄 */ .text .globl activate_ractivate_r: /* * タスク弹瓢木稿はタスク毋嘲借妄が敦贿されているため·ここでタ * スク毋嘲借妄ル〖チンを钙び叫す掘凤は喇り惟たないˉ */#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 陵碰の借妄 */ move.w %sr, %d0 /* 充哈みマスクを task_intmask に */ and.w #~0x0700, %d0 or.w task_intmask, %d0 move.w %d0, %sr#else /* SUPPORT_CHG_IPM */ and.w #~0x0700, %sr /* 充哈み钓材 */#endif /* SUPPORT_CHG_IPM */ move.l (%sp)+, %a0 /* タスクの弹瓢戎孟を a0 に */ jmp (%a0)/* * 充哈みハンドラ】CPU毋嘲ハンドラ叫庚借妄 * * ret_int は充哈みモ〖ドˇ充哈み敦贿觉轮で·ret_exc はマスタモ〖ドˇ * 充哈み敦贿觉轮で钙び叫さなければならないˉまた ret_exc は·スクラッ * チレジスタを瘦赂した觉轮で钙び叫すことˉ */ .text .globl ret_int .globl ret_excret_int: addq.l #8, %sp /* スロ〖アウェイフレ〖ムを嘉てる */ or.w #0x1000, %sr /* マスタモ〖ド */ movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを瘦赂 */ret_exc: clr.l reqflg /* reqflg を FALSE に */ move.l runtsk, %a0 /* A0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -