📄 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.37 2005/08/22 16:57:25 honda Exp $ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include <t_config.h> /* * 毋嘲/充り哈み叫掐り庚借妄ル〖チン * SH3はベクタテ〖ブルを积たず、毋嘲,TRAPAが券栏するとVBR+0x100戎孟を、 * 柒婶/嘲婶/NMI充り哈みが券栏すると、VBR+0x600戎孟を悸乖する。 */ /* * VBR に肋年する猛 */ .section .text .align 2 .global _BASE_VBR_BASE_VBR: nop nop nop/* * Exception 100 vector * アドレスエラ〖,スロット稍碰炭吾毋嘲、Trapa毋嘲霹が券栏すると悸乖される。 * * CPU毋嘲ハンドラは、润タスクコンテキストで悸乖する、そのため、CPU毋嘲ハン * ドラを钙び叫す涟に毋嘲/充り哈みを绩すレジスタバンク1の r7 レジスタをイン * クメントし、リタ〖ンしてきた稿にデクリメントする。CPU毋嘲がタスクコンテキ * ストで券栏し、regflg が TRUE になった箕に、 ret_exc へ尸呆する。 * regflg をチェックする涟に充り哈みを敦贿しないと、reqflg をチェック稿に弹 * 瓢された充り哈みハンドラ柒でディスパッチが妥滇された眷圭に、ディスパッチ * されない。 * * * 毋嘲が券栏すると、毋嘲券栏傅のコンテキストであるspc,pr,ssr,r0×r7を锣闰 * する。毋嘲が券栏した箕爬でのコンテキストを拇べ润タスクコンテキストなら * _exception_from_intから悸乖を倡幌する。毋嘲の妥傍はEXPEVTレジスタ粕み、 * exc_tableからCPU毋嘲ハンドラの倡幌戎孟を粕み哈む。券栏した毋嘲に滦して * CPU毋嘲ハンドラが判峡されていなければ、_no_reg_exceptionにブランチして、 * ssr,sr,spc,prの柒推を叫蜗して匿贿する。CPU毋嘲ハンドラからリタ〖ンして * きたら、reqflgを拇べ0笆嘲ならrec_exc()に若び、0なら傅の借妄にリタ〖ンす * る。 * * * BLビットの胺いについて * ssr,spc に提り黎のコンテキストを提して rte を券乖する狠には·充哈み∈NMI * も崔む∷を减け烧けないように BL ビットを1にする涩妥があるˉ毋嘲/充哈みハ * ンドラ姜位箕には BL をビットを1にせず IPM を MAX_IPM に肋年するˉこれは· * BL ビットが1の眷圭に毋嘲が券栏すると CPU がリセットされることを雇胃して· * 奥链のため·ssr,spcを牲耽する木涟でBLを1に肋年しているˉ * */ .org 0x0100 /* _BASE_VBR + 0x0100戎孟に芹弥 */ .align 2 .global _general_exception_general_exception: stc.l spc,@-r15 /* spc,pr,ssr をスタックに瘦赂する */ sts.l pr,@-r15 stc.l ssr,@-r15 stc.l gbr,@-r15 sts.l macl,@-r15 sts.l mach,@-r15 stc.l r0_bank,@-r15 /* 毋嘲券栏箕のr0×r7を瘦赂 */ stc.l r1_bank,@-r15 stc.l r2_bank,@-r15 stc.l r3_bank,@-r15 stc.l r4_bank,@-r15 stc.l r5_bank,@-r15 stc.l r6_bank,@-r15 stc.l r7_bank,@-r15 tst r7,r7 /* 毋嘲券栏傅のコンテキストを冉年 */ bf/s _exception_from_exc /* 券栏傅が毋嘲/充り哈みハンドラならジャンプ */ add #0x01,r7 /* 毋嘲/充り哈みネスト搀眶をインクリメント */ mov r15,r1 /* 提り黎が充り哈みハンドラでないのでスタッ */ mov.l _stacktop_exc,r15 /* クを掐れ仑え傅のスタックポインタを瘦赂 */ mov.l r1,@-r15 mov.l _expevt,r0 /* 毋嘲を钓材すると久えるレジスタを瘦赂 */ mov.l @r0,r5 /* EXPEVTレジスタを艰评 */ ldc r1,r4_bank /* CPU毋嘲ハンドラへの苞眶 */ ldc r5,r5_bank mov.l _unmak_rb_bl_exc,r2 /* BLビットを0に·レジスタバンクを磊り仑え */ stc sr,r3 and r3,r2 ldc r2,sr shlr2 r5 /* EXPEVTを3ビット宝シフト */ shlr r5 mov.l _exc_table_exc,r0 /* exc_tableのアドレスをr0に */ mov.l @(r0,r5),r2 /* ハンドラのアドレスを艰评 */ tst r2,r2 /* ハンドラが判峡されていない毋嘲なら */ bt _no_reg_exception /* no_reg_exceptionへジャンプ */ jsr @r2 /* CPU毋嘲ハンドラへ */ nop mov.l _mask_md_ipm_exc,r0 ldc r0,sr /* 充り哈み敦贿 */ stc r7_bank,r7 /* 毋嘲/充り哈みのネスト搀眶をデクリメント */ dt r7 ldc r7,r7_bank mov.l _reqflg_exc,r2 /* reqflgのチェック */ mov.l @r2,r1 tst r1,r1 /* reqflgがFALSEならret_to_task_excに若び */ bt/s _ret_to_task_exc /* タスクに提る */ mov.l @r15,r15 /* 提り黎がタスクなのでスタックを提す */ xor r0,r0 bra ret_exc mov.l r0,@r2 /* reqflgをクリア *//* * exception_from_int * CPU毋嘲券栏箕のコンテキストが润タスクコンテキストの眷圭の借妄 * タスクコンテキストの眷圭との借妄の般いは、とCPU毋嘲ハンドラの * 借妄が姜位すると涩ず傅の借妄に提ることである。 */ _exception_from_exc: mov.l _expevt,r0 /* 毋嘲を钓材すると久えるレジスタを瘦赂 */ mov.l @r0,r5 /* EXPEVTレジスタを艰评 */ ldc r15,r4_bank /* CPU毋嘲ハンドラへの苞眶 */ ldc r5,r5_bank mov.l _unmak_rb_bl_exc,r2 /* BLビットを0に·レジスタバンクを磊り仑え */ stc sr,r3 and r3,r2 ldc r2,sr shlr2 r5 /* EXPECTを3ビット宝シフト */ shlr r5 mov.l _exc_table_exc,r0 /* exc_tableのアドレスをr0に */ mov.l @(r0,r5),r2 /* ハンドラのアドレスを艰评 */ tst r2,r2 /* ハンドラが判峡されていない毋嘲なら */ bt _no_reg_exception /* no_reg_exceptionへジャンプ */ jsr @r2 /* CPU毋嘲ハンドラへ */ nop mov.l _mask_md_ipm_exc,r0 ldc r0,sr /* BL=1,充り哈み敦贿 */ stc r7_bank,r7 /* 毋嘲/充り哈みのネスト搀眶をデクリメント */ dt r7 ldc r7,r7_bank_ret_to_task_exc: mov.l @r15+,r7 /* r0×r1,ssr,pr,spcを牲耽しタスクに提る */ mov.l @r15+,r6 mov.l @r15+,r5 mov.l @r15+,r4 mov.l @r15+,r3 mov.l @r15+,r2 mov.l @r15+,r1 mov.l _mask_md_bl_exc,r0 ldc r0,sr /* BLを1に */ mov.l @r15+,r0 lds.l @r15+,mach lds.l @r15+,macl ldc.l @r15+,gbr ldc.l @r15+,ssr lds.l @r15+,pr ldc.l @r15+,spc rte nop/* * no_reg_exception() * CPU毋嘲として判峡されていない毋嘲が券栏すると钙び叫される * 毋嘲コ〖ド、毋嘲が券栏した箕爬のpc,sr,prを叫蜗してカ〖ネル * を匿贿する。 */ _no_reg_exception: mov.l _expevt,r5 mov.l @r5,r4 stc spc,r5 stc ssr,r6 sts pr,r7 mov.l _cpu_expevt_k,r1 jsr @r1 nop .align 4_stacktop_exc: .long STACKTOP /* タスク迫惟婶のスタックの介袋猛 */_expevt: .long EXPEVT_exc_table_exc: .long _exc_table_unmak_rb_bl_exc: .long 0x4fffffff_mask_md_ipm_exc: .long 0x40000000 + MAX_IPM << 4 _reqflg_exc: .long _reqflg_cpu_expevt_k: .long _cpu_expevt _mask_md_bl_exc: .long 0x50000000 + MAX_IPM << 4 /* * タスクディスパッチャ * * _dispatch は、r7_bank1 = 0,充哈み敦贿觉轮で钙び叫さなければならな * いˉ_exit_and_dispatch も·r7_bank1 = 0ˇ充哈み敦贿觉轮で钙び叫す * のが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·r7_bank1 = 1で钙び * 叫した眷圭にも滦炳しているˉ */ .text .align 2 .global _dispatch_dispatch: sts.l pr,@-r15 /* pr,r8×r15 をスタックに瘦赂 */ mov.l r14,@-r15 /* r0×r7は钙び叫し傅で瘦赂しているため */ mov.l r13,@-r15 /* 瘦赂する涩妥が痰い */ mov.l r12,@-r15 mov.l r11,@-r15 mov.l r10,@-r15 mov.l r9, @-r15 mov.l r8, @-r15 mov.l _runtsk_dis,r2 /* r0 <- runtsk */ mov.l @r2,r0 mov.l r15,@(TCB_sp,r0) /* タスクスタックをTCBに瘦赂 60笆布ならOK*/ mov.l dispatch_r_k,r1 /* 悸乖浩倡戎孟を瘦赂 */ mov.l r1,@(TCB_pc,r0) /* 悸乖浩倡戎孟をTCBに瘦赂 60笆布ならOK */ bra dispatcher nopdispatch_r: mov.l @r15+,r8 /* レジスタを牲耽 */ mov.l @r15+,r9 mov.l @r15+,r10 mov.l @r15+,r11 mov.l @r15+,r12 mov.l @r15+,r13 mov.l @r15+,r14 lds.l @r15+,pr /* * タスク毋嘲借妄ル〖チンの弹瓢 * dispatch_rはdispatcherから钙び叫されるため· * tcbのアドレスはr0に掐っているˉ */ mov.l @(TCB_enatex,r0),r1 mov.l _enatex_mask_dis,r2 tst r1,r2 bt dispatch_r_1 /* enatex が FALSE ならリタ〖ン */ mov.l @(TCB_texptn,r0),r1 /* texptnをロ〖ド */ tst r1,r1 bt dispatch_r_1 /* texptn が 0で痰ければ */ mov.l _call_texrtn_dis,r1 /* タスク毋嘲ル〖チンの钙び叫し */ jmp @r1 nop dispatch_r_1: rts nop .global _exit_and_dispatch_exit_and_dispatch: xor r1,r1 /* r7_bank1を0クリア */ ldc r1,r7_bankdispatcher: /* * ここには充り哈み敦贿で丸ること */ mov.l _schedtsk_dis,r12 /* r0 <- schedtsk */ mov.l @r12,r0 mov.l _runtsk_dis,r2 mov.l r0,@r2 /* schedtskをruntskに */ cmp/eq #0,r0 /* schedtsk があるか々 */ bt dispatcher_1 /* 痰ければジャンプ */ mov.l @(TCB_sp,r0),r15 /* TCBからタスクスタックを牲耽 */ mov.l @(TCB_pc,r0),r1 /* TCBから悸乖浩倡戎孟を牲耽 */ jmp @r1 nopdispatcher_1: /* イミディエイト猛を髓搀粕み哈むのは跟唯が碍いので祸涟に脱罢する * r8 : 充り哈み敦贿のためのSRの猛 * r9 : 充り哈み略ち面のSRの猛 * r10 : reqflgの戎孟 * r11 : 0x01 * r12 : 0x00 * r13 : sleep面のSRの觉轮 */ mov.l _mask_md_ipm_dis,r8 /* 充り哈み敦贿のSRの猛 */#ifdef NO_SLEEP mov.l _mask_md_dis,r9 /* 充り哈み略ち面のSRの猛 */ #else mov.l _mask_bl_md_dis,r9 /* 充り哈み略ち面のSRの猛 */#endif #ifdef SUPPORT_CHG_IPM mov.l _task_intmask_k,r2 mov.l @r2,r3 or r3,r9#endif mov.l _reqflg_dis,r10 mov #0x01,r11 xor r12,r12 mov.l _stacktop_dis,r15 /* スタックを充り哈みスタックに */ ldc r11,r7_bank /* r7_bank1 を1にして充り哈み觉轮に */ dispatcher_2: /* * ここで充哈みモ〖ドに磊り垂えるのは·ここで券栏する充哈み借妄 * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で * のタスクディスパッチの松贿という企つの罢蹋があるˉ */ /* * 充哈み钓材稿にsleep炭吾を悸乖すると·充哈み钓材炭吾の悸乖涟に * 充哈み妥滇が掐っている眷圭·充哈み钓材炭吾の悸乖と鼎に充哈みが * 减け烧けられその牲耽稿に·reqflgのチェックではなく sleep 觉轮 * に掐ってしまうˉ * この啼玛は·充哈みの钓材と sleep 觉轮への败乖がアトミックに悸 * 乖できないことに弹傍するˉ * そのため·sleep 悸乖木涟の SR 恃构では BL ビットを'1'に肋年す * ることで·充哈みの钓材と sleep 觉轮への笆惯をアトミックに悸乖 * するˉ * ldc r9,sr ではBLビットがセットされるため·充哈みは减け烧けずス * リ〖プモ〖ドに败乖するˉスリ〖プモ〖ド面は·BLビットが1でも充 * 哈みを减け烧けるため(SH7709ハ〖ドウェアマニュアル 8-10)·スリ〖 * プモ〖ドへの败乖木稿に充哈みを减烧スリ〖プモ〖ドから牲耽するˉ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -