📄 cpu_support.s
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * Copyright (C) 2005 by Freelines CO.,Ltd * * 惧淡螟侯涪荚は·笆布の (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.8 2005/12/12 09:08:16 honda Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈V850ES脱∷ */#define _MACRO_ONLY#include "v850asm.inc"#include "jsp_kernel.h"#include "offset.h"/* * タスクディスパッチャ */Function __kernel_dispatch /* * コンテキストの锣闰 * 30 20 21 22 23 24 25 26 27 28 29 31 */ Push ep /* 瘦赂滦据レジスタの瘦赂 */ addi -44, sp, sp mov sp, ep sst.w r20, 40[ep] sst.w r21, 36[ep] sst.w r22, 32[ep] sst.w r23, 28[ep] sst.w r24, 24[ep] sst.w r25, 20[ep] sst.w r26, 16[ep] sst.w r27, 12[ep] sst.w r28, 8[ep] sst.w r29, 4[ep] sst.w r31, 0[ep] /* スタックと肌の弹瓢戎孟を瘦赂 */ Lea __kernel_runtsk, ep sld.w 0[ep], ep sst.w sp, TCB_sp[ep] Lea dispatch_r, r10 sst.w r10, TCB_pc[ep] stsr psw, r10 sst.w r10, TCB_psw[ep] /* * 肌のタスクの洁洒 __kernel_exit_and_dispatch * * 泼にexit盖铜の借妄はしてないので 动扩ディスパッチにも蝗ってる */Label __kernel_exit_and_dispatch /* intnestをクリア */ Lea _intnest, r10 st.w r0, 0[r10] /* 充哈みスタックの锣闰 */ cmp r2, r0 bnz 1f mov r3, r2 /* 肌に弹瓢すべきタスクの粕み叫し */1: Lea __kernel_schedtsk, r10 ld.w 0[r10], r10 cmp r10,r0 bne 1f /* 肌に弹瓢すべきタスクがない */ mov r2, r3 /* intnestを1にする */ mov r0, r10 add 1, r10 Lea _intnest, r11 st.w r10, 0[r11] /* 充り哈み略ち */ ei nop nop nop nop nop di /* intnestをクリアする */ Lea _intnest, r10 st.w r0, 0[r10] jr 1b1: /* runtsk = schedtsk; */ Lea __kernel_runtsk, r11 st.w r10, 0[r11] /* スタックと肌の弹瓢戎孟を牲耽 */ mov r10, ep sld.w TCB_pc[ep], r31 sld.w TCB_sp[ep], r3 sld.w TCB_psw[ep], r10 ldsr r10, psw jmp r31 /* ディスパッチャの牲耽ル〖チン */Label dispatch_r /* タスク毋嘲 */ jarl __kernel_calltex, r31 /* 锣闰したコンテキストの牲耽 */ mov sp, ep sld.w 40[ep],r20 sld.w 36[ep],r21 sld.w 32[ep],r22 sld.w 28[ep],r23 sld.w 24[ep],r24 sld.w 20[ep],r25 sld.w 16[ep],r26 sld.w 12[ep],r27 sld.w 8[ep],r28 sld.w 4[ep],r29 sld.w 0[ep],r31 addi 44, sp, sp Pop ep jmp r31/* * タスク弹瓢箕借妄 */Function __kernel_activate_r Lea __kernel_runtsk, ep ld.w 0[ep], ep ld.w TCB_tinib[ep], ep ld.w TINIB_exinf[ep], r6 ld.w TINIB_task[ep], r10 Lea _ext_tsk, r31 ei jmp r10/* * 充哈みハンドラ】CPU毋嘲ハンドラ叫庚借妄 * * ret_int は充哈みモ〖ドˇ充哈み敦贿觉轮で·ret_exc はマスタモ〖ドˇ * 充哈み敦贿觉轮で钙び叫さなければならないˉまた ret_exc は·スクラッ * チレジスタを瘦赂した觉轮で钙び叫すことˉ */.extern _InterruptHandlerEntry.extern __kernel_runtsk.extern __kernel_calltex/* * 充哈みハンドラ * * ハンドラ弹瓢涟に手笛猛呈羌レジスタとスクラッチレジスタを锣闰するˉ * 充哈みハンドラ柒でタスクスイッチが券栏したときのみ链てのレジスタ * を锣闰するˉ * * それぞれ觉斗に炳じて肌のような借妄を乖う * ˇハンドラがない眷圭 * 侯度拌侯喇 -> ハンドラ粕叫 -> 侯度拌撬逮 * * ˇハンドラがあり、驴脚充哈みである眷圭 * 侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> ハンドラ弹瓢 * -> レジスタA凡牲耽 -> 侯度拌撬逮 * * ˇハンドラがあり、タスクから充哈みがかかり、ハンドラ柒で磊仑がない眷圭 * 侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> スタック磊仑 * -> ハンドラ弹瓢 -> タスク毋嘲弹瓢 -> レジスタA凡锣闰 * -> 侯度拌撬逮 * * ˇハンドラがあり、タスクから充哈みがかかり、ハンドラ柒で磊仑がある眷圭 * 侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> スタック磊仑 * -> ハンドラ弹瓢 -> レジスタB凡锣闰 -> ディスパッチャ * -> レジスタB凡牲耽 -> タスク毋嘲弹瓢 -> レジスタA凡锣闰 * -> 侯度拌撬逮 * * 锣闰レジスタ呈羌界进 (アドレス惧疤から界) * R10 R11 * R1-R9 * R11-R19 * R31 * EIPC EIPSW */ .data .align 4__intcount: .long 0 Function vector_handler /* 侯度挝拌の侯喇 */ add -8, sp st.w r10, 4[sp] st.w r11, 0[sp] /* intnestをインクリメント */ Lea _intnest, r11 ld.w 0[r11], r10 add 1, r10 st.w r10, 0[r11] /* * ハンドラ弹瓢戎孟の粕み叫し * R10 : ハンドラの戎孟 */ stsr ecr, r10 shr 2, r10 add -4, r10 Lea _InterruptHandlerEntry, r11 add r10, r11 ld.w 0[r11], r10 /* ハンドラが痰ければ篓姜位 */ cmp 0,r10 bne 1f stsr ecr, r6 jarl _cpu_experr, r31 be end_handler1: /* * レジスタ锣闰 * * 呈羌界进 : (10 11) ^ 12..19 6..9 31 eipc eipsw | (sp) */ mov r30, r11 /* epを蝗いたいのでちょっと锣闰 */ addi -80, r3, r30 mov r30, r3 /* スタックに瓤鼻 */ sst.w r1, 76[ep] sst.w r2, 72[ep] sst.w r3, 68[ep] sst.w r4, 64[ep] sst.w r5, 60[ep] sst.w r6, 56[ep] sst.w r7, 52[ep] sst.w r8, 48[ep] sst.w r9, 44[ep] sst.w r12, 40[ep] sst.w r13, 36[ep] sst.w r14, 32[ep] sst.w r15, 28[ep] sst.w r16, 24[ep] sst.w r17, 20[ep] sst.w r18, 16[ep] sst.w r19, 12[ep] sst.w r31, 8[ep] stsr eipc, r6 /* 驴脚充哈み滦忽 */ sst.w r6 , 4[ep] stsr eipsw, r6 sst.w r6 , 0[ep] mov r11, r30 /* ep牲耽 */ /* * コンテキストチェックとスタック磊り仑え */ /* 驴脚充り哈みチェック */ Lea _intnest, r11 ld.w 0[r11], r11 cmp 1, r11 ble 1f /* 驴脚充哈み */ st.w r3, -4[r3] add -4, r3 jr 2f1: /* タスクコンテキスト惧での充哈み */ /* 附哼のスタック疤弥を充り哈みスタック惧に瘦赂 */ st.w r3, -4[r2] /* スタック磊り仑え */ addi -4,r2, r32: /* * ハンドラ弹瓢 */ Lea ret_int, r31 ei jmp r10 /* * 充り哈みからの牲耽借妄 */Label ret_int di /* intnestをディクリメント */ Lea _intnest, r11 ld.w 0[r11], r10 mov 1, r11 sub r11, r10 Lea _intnest, r11 st.w r10, 0[r11] /* スタックの牲耽 */ ld.w 0[r3],sp /* どこへ若んでくのかチェック */ Lea _intnest, r11 ld.w 0[r11], r10 cmp r0, r10 bne recover_from_int /* * タスクへ若んでく眷圭ならreqflgをチェック * 妥滇があれば链レジスタを瘦赂してタスクディスパッチャへ */ Lea __kernel_reqflg, r10 ld.w 0[r10], r11 cmp r0, r11 bnz getting_ready_for_contextswitchrecover_from_int_with_tskctx: /* タスクに若んでいく涟にタスク毋嘲 */ jarl __kernel_calltex, r31recover_from_int: /* * レジスタ牲耽 * * 呈羌界进 : (10 11) 12..19 6..9 31 eipc eipsw ^ | (sp) */ mov r30, r11 /* epを蝗いたいのでちょっと锣闰 */ mov r3, r30 sld.w 4[ep],r10 ldsr r10, eipc sld.w 0[ep],r10 ldsr r10, eipsw sld.w 76[ep], r1 sld.w 72[ep], r2 sld.w 68[ep], r3 sld.w 64[ep], r4 sld.w 60[ep], r5 sld.w 56[ep], r6 sld.w 52[ep], r7 sld.w 48[ep], r8 sld.w 44[ep], r9 sld.w 40[ep], r12 sld.w 36[ep], r13 sld.w 32[ep], r14 sld.w 28[ep], r15 sld.w 24[ep], r16 sld.w 20[ep], r17 sld.w 16[ep], r18 sld.w 12[ep], r19 sld.w 8[ep], r31 addi 80, r30, r3 mov r11, r30end_handler: /* * 侯度挝拌の牲耽 * * 呈羌界进 : 10 11 ^ (12..19 6..9 31 eipc eipsw | sp) */ add 8, sp ld.w -4[sp], r10 ld.w -8[sp], r11 reti /* * タスクスイッチ券栏に燃う链レジスタ锣闰 * * 呈羌界进 : (10 11 12..19 6..9 31 eipc eipsw | sp) ^ * 30 20..29 1 4..9 */getting_ready_for_contextswitch: /* reqflg = 0 */ st.w r0, 0[r10] st.w ep, -4[sp] /*epを蝗いたいので靠っ黎に锣闰 */ addi -68, sp, ep sst.w r20, 64[ep] sst.w r21, 60[ep] sst.w r22, 56[ep] sst.w r23, 52[ep] sst.w r24, 48[ep] sst.w r25, 44[ep] sst.w r26, 40[ep] sst.w r27, 36[ep] sst.w r28, 32[ep] sst.w r29, 28[ep] sst.w r1, 24[ep] sst.w r4, 20[ep] sst.w r5, 16[ep] sst.w r6, 12[ep] sst.w r7, 8[ep] sst.w r8, 4[ep] sst.w r9, 0[ep] mov ep, sp /* TCBの面咳を饯赖して牲耽攫鼠を肋年 */ Lea __kernel_runtsk, ep sld.w 0[ep], ep /* ep = _kernel_runtsk */ sst.w r3, TCB_sp[ep] Lea recover_from_contextswitch, r10 sst.w r10, TCB_pc[ep] stsr psw, r10 sst.w r10, TCB_psw[ep] /* タスクディスパッチャへ */ Lea __kernel_exit_and_dispatch, r10 ldsr r10, eipc /* カ〖ネル柒で充哈み敦贿にすべきなのに充哈み钓材になっている */ /* 舱疥があり、充哈みのタイミングによってはシステムが撬镁します。*/ stsr eipsw, r10 ori 0x20,r10,r10 ldsr r10, eipsw reti /* * 充哈み忙叫箕コンテキストスイッチの牲耽ル〖チン * * 呈羌界进 : (10 11 12..19 6..9 31 eipc eipsw | sp * 30 20..29 1 4..9) ^ */recover_from_contextswitch: di /* 锣闰したレジスタの办婶牲耽 */ mov sp, ep sld.w 64[ep], r20 sld.w 60[ep], r21 sld.w 56[ep], r22 sld.w 52[ep], r23 sld.w 48[ep], r24 sld.w 44[ep], r25 sld.w 40[ep], r26 sld.w 36[ep], r27 sld.w 32[ep], r28 sld.w 28[ep], r29 sld.w 24[ep], r1 sld.w 20[ep], r4 sld.w 16[ep], r5 sld.w 12[ep], r6 sld.w 8[ep], r7 sld.w 4[ep], r8 sld.w 0[ep], r9 addi 68, sp, sp /* おおもとの牲耽借妄へ若ばす */ jr recover_from_int_with_tskctx/* * CPUロック觉轮の艰评 * * 充哈み敦贿ならCPUロック觉轮 */Function _sense_lock stsr psw, r10 shr 5, r10 andi 1, r10, r10 jmp r31
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -