📄 cpu_support.s
字号:
beq t2, zero, ret_int_1 /* ディスパッチ敦贿ならジャンプ */ nop la t4, schedtsk lw t5, (t4) /* t5 = schedtsk */ beq t1, t5, ret_int_1 /* runtsk = schedtsk ならジャンプ */ nop/* ディスパッチャを沸统する眷圭の借妄 (t1 = runtsk に庙罢) */ /* ここから、充哈み敦贿】钓材を、EXLビットを脱いて悸附する数恕に恃构 */ mfc0 t0, Status ori t0, t0, SR_EXL_IE xori t0, t0, SR_EXL_IE /* lock_cpu 陵碰 (充哈み敦贿) + EXLビットクリア (充哈み钓材) */ mtc0 t0, Status addi sp, sp, -8*4 /* スクラッチレジスタの瘦赂 */ sw s0, 0*4(sp) sw s1, 1*4(sp) sw s2, 2*4(sp) sw s3, 3*4(sp) sw s4, 4*4(sp) sw s5, 5*4(sp) sw s6, 6*4(sp) sw s7, 7*4(sp) /* t1 = runtsk に庙罢 */ sw sp, TCB_sp(t1) /* runtsk->sp = sp (タスクスタックポインタの瘦赂) */ la t2, ret_int_r j dispatcher /* ディスパッチャ钙び叫し */ sw t2, TCB_pc(t1) /* runtsk->pc = ret_int_r (悸乖浩倡戎孟の瘦赂) *//* * 充哈みˇ毋嘲の叫庚借妄 * ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 * ˇスタックポインタも肋年貉み *//* ディスパッチャ钙び叫し稿のタスクコンテキストからの圭萎孟爬 */ret_int_r: lw s0, 0*4(sp) /* スクラッチレジスタの牲傅 */ lw s1, 1*4(sp) lw s2, 2*4(sp) lw s3, 3*4(sp) lw s4, 4*4(sp) lw s5, 5*4(sp) lw s6, 6*4(sp) lw s7, 7*4(sp) addi sp, sp, 8*4 mfc0 t0, Status ori t0, t0, SR_EXL_IE /* unlock_cpu 陵碰 (充哈み钓材) + EXLビットセット (充哈み敦贿) */ mtc0 t0, Status/* ディスパッチャを沸统しない眷圭の圭萎孟爬 (t1 = runtsk に庙罢) */ret_int_1: /* タスク毋嘲借妄妥滇のチェック */ lb t2, TCB_enatex(t1) andi t4, t2, TCB_enatex_mask /* t3 = runtsk->enatex */ beq t4, zero, ret_int_2 /* タスク毋嘲借妄敦贿の箕、ジャンプ */ nop lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */ beq t5, zero, ret_int_2 /* タスク毋嘲妥滇が痰い箕、ジャンプ */ nop mfc0 t0, Status ori t0, t0, SR_EXL_IE xori t0, t0, SR_EXL_IE /* lock_cpu陵碰 (充哈み敦贿) + EXLビットクリア (充哈み钓材) */ mtc0 t0, Status jal call_texrtn /* タスク毋嘲借妄ル〖チン(タ〖ゲット润 巴赂婶年盗)の钙び叫し */ nop /* call_texrtn()(task.c)では、悸狠のタスク毋嘲借妄ル〖チン钙び 叫し涟稿で、unlock_cpu、lock_cpu借妄を乖っているので、觉轮は 瘦积される。 */ mfc0 t0, Status ori t0, t0, SR_EXL_IE /* unlock_cpu 陵碰 (充哈み钓材) + EXLビットセット (充哈み敦贿) */ mtc0 t0, Status /* ここまでが、充哈み敦贿】钓材を、EXLビットを脱いて悸附する数恕 */ret_int_2: /* レジスタの牲耽 (Statusレジスタは、贷に牲傅貉み) */ lw t1, 22*4(sp) /* EPC */ mtc0 t1, EPC lw t2, 23*4(sp) /* HI */ lw t3, 24*4(sp) /* LO */ mthi t2 /* 捐近换レジスタ HI の牲傅 */ mtlo t3 /* 捐近换レジスタ LO の牲傅 */ 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) 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 /* 充哈み/毋嘲借妄からの牲耽 */ nop/* * タスクディスパッチャ * ˇdispatch は、k0 = 0、CPUロック(充哈み敦贿)觉轮で钙び叫さなければならない。 * ˇexit_and_dispatch は·k0 = 0、CPUロック(充哈み敦贿)觉轮で钙び叫すのが付搂 * しかし、カ〖ネル弹瓢借妄のため·k0 = 1で钙び叫した眷圭にも滦炳している。 */ .global dispatch .global exit_and_dispatch/* タスクディスパッチャを汤绩弄に钙び叫す箕 */dispatch: addi sp, sp, -13*4 sw at, 1*4(sp) /* スクラッチレジスタの略闰 */ sw s0, 2*4(sp) sw s1, 3*4(sp) sw s2, 4*4(sp) sw s3, 5*4(sp) sw s4, 6*4(sp) sw s5, 7*4(sp) sw s6, 8*4(sp) sw s7, 9*4(sp) sw gp, 10*4(sp) sw fp, 11*4(sp) sw ra, 12*4(sp) la t0, runtsk la t2, dispatch_r lw t1, (t0) /* t1 = runtsk */ sw sp, TCB_sp(t1) /* runtsk->sp = sp */ j dispatcher sw t2, TCB_pc(t1) /* runtsk->pc = dispatch_r *//* 附哼悸乖面のコンテキストを嘉てて、タスクディスパッチャを钙び叫す箕 */exit_and_dispatch: move k0, zero /* ネストカウンタをクリア */dispatcher: /* ここには CPUロック∈充り哈み敦贿∷で丸ること */ la t0, schedtsk lw t1, (t0) /* t1 = schedtsk */ beq t1, zero, dispatcher_2 /* schedtsk が痰ければ充哈み略ちへ */ nopdispatcher_1: la t0, runtsk sw t1, (t0) /* runtsk = t1 (= schedtsk) (タスクスイッチの悸乖) */ lw t2, TCB_pc(t1) /* 悸乖浩倡戎孟を艰评する。 悸乖浩倡戎孟は笆布の3奶り ˇディスパッチャの叫庚 dispatch_r ˇ充哈み】毋嘲の叫庚 ret_int_r ˇタスク弹瓢木稿 activate_r いずれの眷圭も t1=runtsk として钙び 叫していることに庙罢。 */ jr t2 /* 悸乖浩倡戎孟へジャンプ */ lw sp, TCB_sp(t1) /* スタックポインタを牲傅 */ /* * 悸乖すべきタスクが附れるまで略つ借妄 * * ここでコンテキストを磊り垂えるのは· * ˇここで券栏する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯 * ˇ充哈みハンドラ柒でのタスクディスパッチの松贿 * という企つの罢蹋があるˉ */ dispatcher_2: la t2, runtsk sw zero, (t2) /* runtsk = NULL これは、iget_id が、TSK_NONEを手す 眷圭に滦炳するため。*/ la sp, _stack_top /* スタック磊り仑え */ /* _stack_top は、システム巴赂婶 (リンカスクリプト夸京)年盗 */ li k0, 1 /* ネストカウンタ♂1 */ /* ル〖プ柒で蝗う年眶の洁洒 */ la t2, reqflg /* reqflg のアドレス */ li t3, ~SR_ERL_EXL /* Status の充哈み簇息ビット */ li t4, ~SR_IE /* Status の充哈み钓材ビット */dispatcher_3: mfc0 t1, Status and t1, t1, t3 /* ERL, EXL ビットクリア */ ori t1, t1, SR_IE /* IEビットセット */ mtc0 t1, Status /* 充哈み钓材 : unlock_cpu 陵碰 */ and t1, t1, t4 /* IEビットリセット */ mtc0 t1, Status /* 充哈み敦贿 : lock_cpu 陵碰 */ NOP_FOR_CP0_HAZARD /* CP0ハザ〖ドのための箕粗苍ぎマクロ (このマクロはシステム巴赂婶年盗) */ lw t5, (t2) /* t5 = reqflg */ beq t5, zero, dispatcher_3 /* ディスパッチ妥滇がなければル〖プの 黎片へ */ nop sw zero, (t2) /* reqflg = NULL (reqflgをクリア) */ j dispatcher /* 悸乖浩倡戎孟の艰评借妄へジャンプ */ move k0, zero /* ネストカウンタをクリア *//* * ディスパッチャ叫庚借妄 * ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 * ˇスタックポインタも肋年貉み */dispatch_r: lw at, 1*4(sp) /* スクラッチレジスタを牲耽 */ lw s0, 2*4(sp) lw s1, 3*4(sp) lw s2, 4*4(sp) lw s3, 5*4(sp) lw s4, 6*4(sp) lw s5, 7*4(sp) lw s6, 8*4(sp) lw s7, 9*4(sp) lw gp, 10*4(sp) lw fp, 11*4(sp) lw ra, 12*4(sp) addi sp, sp, 13*4 /* タスク毋嘲借妄妥滇のチェック */ lb t2, TCB_enatex(t1) andi t4, t2, TCB_enatex_mask /* t4 = runtsk->enatex */ beq t4, zero, dispatch_r_1 /* タスク毋嘲借妄敦贿の箕、ジャンプ */ nop lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */ beq t5, zero, dispatch_r_1 /* タスク毋嘲妥滇が痰い箕、ジャンプ */ nop j call_texrtn /* タスク毋嘲借妄ル〖チン(タ〖ゲット润 巴赂婶年盗)の钙び叫し */ nop /* call_texrtn()(task.c)では、悸狠のタスク毋嘲借妄ル〖チン钙び 叫し涟稿で、unlock_cpu、lock_cpu借妄を乖っているので、觉轮は 瘦积される。 */dispatch_r_1: jr ra /* dispatch 钙び叫し傅へ提る */ nop/* * タスク弹瓢借妄 * ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 * ˇスタックポインタも肋年貉み */ .globl activate_ractivate_r: /* ここに丸るときは、CPUロックになっている∈IEビット = 0) */ /* 充り哈み钓材の洁洒 */ mfc0 t0, Status ori t0, t0, SR_ERL_EXL_IE /* xorを蝗うため、1刨ビットセットする */ xori t0, t0, SR_ERL_EXL /* ERL, EXLビットをクリア (IEビットは荒す) */ /* タスク簇犯の肋年洁洒 */ /* t1 = runtsk (ディスパッチャで肋年) */ lw t2, TCB_tinib(t1) /* t2 = runtsk->tinib */ /* タスク弹瓢戎孟の肋年 */ lw t3, TINIB_task(t2) /* t3 = runtsk->tinib->task */ /* タスクへの苞眶∈橙磨攫鼠∷肋年 */ lw a0, TINIB_exinf(t2) /* a0 = runtsk->tinib->exinf */ mtc0 t0, Status /* unlock_cpu 陵碰 (充哈み钓材) */ la ra, ext_tsk /* タスクからの提り戎孟を肋年 */ j t3 /* タスク弹瓢 */ nop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -