📄 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 * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: cpu_support.S,v 1.2 2002/04/05 09:01:40 takayuki Exp $ *//* * プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈M32R脱∷ */#define _MACRO_ONLY#include "m32rasm.inc"#include "sys_defs.h"#include "cpu_defs.h"#include "sys_config.h"#include "offset.h"/**************************************************************************悸刘メモˇ32ビットの篓猛ロ〖ドM3A-2131G50は0x01000000から16MBのSDRAMがマップされているˉここにカ〖ネルデ〖タを充り烧けた眷圭·ld24炭吾でアドレスを艰ると惧8ビットが艰れないˉ办数·ldi炭吾では≈踏豺疯シンボル∽でエラ〖になるため·シフトで粕み哈むこともできないˉそこで·プログラム面に篓猛を虽めてblで若び臂え·R14を蝗った粗儡アドレッシングでアクセスすることにしたˉプログラム面に叫てくる"bl 1f" ".long xxxx" "1:" という寥は·この搀闰ル〖チンであるˉV850のgasには·hi()とlo()という导击マクロがあるのだが... #そのうちV850のgasから败竣しよう **************************************************************************//***************************//* EITベクタエントリの年盗 *//***************************//* .vectorセクションはROM鄂粗の黎片に芹弥される */ .section ".vector","ax" .extern _start .balign 0x10Label _reset //リセット毋嘲 bra _start .balign 0x10Label vector_entry_SBI stmdb "r0,r1,r2,r14" ldi r1, #(EXC_SBI*4-4) bra _exception_handler .balign 0x10Label vector_entry_RIE stmdb "r0,r1,r2,r14" ldi r1, #(EXC_RIE*4-4) bra _exception_handler .balign 0x10Label vector_entry_AE stmdb "r0,r1,r2,r14" ldi r1, #(EXC_AE*4-4) bra _exception_handler/* * トラップベクタエントリ * 妥傍戎规を艰りたいので、办枚リンクレジスタを锣闰してサブル〖チンコ〖ル */ .balign 0x10Label vector_entry_trap bra _trap_handler_0 bra _trap_handler_1 bra _trap_handler_2 bra _trap_handler_3 bra _trap_handler_4 bra _trap_handler_5 bra _trap_handler_6 bra _trap_handler_7 bra _trap_handler_8 bra _trap_handler_9 bra _trap_handler_10 bra _trap_handler_11 bra _trap_handler_12 bra _trap_handler_13 bra _trap_handler_14 bra _trap_handler_15/**************************************************************************//* * 充哈みベクタエントリ と 充哈みハンドラ弹瓢/牲耽借妄婶 *//* * レジスタの姥み数 * R0,R1,R14,ICUISTS,R2-R7,ACC(HI/LO),BPC,[ICUIMASK|PSW],R8-R13 */ .balign 0x10 .extern InterruptHandlerEntry .extern _unhandled_interrupt_handlerLabel interrupt_handler /* 侯度挝拌の侯喇 */ stmdb "r0,r1" /* タスクコンテキストからの充哈みかな々 */ mvfc r0, psw and3 r1, r0, 0x8000 beqz r1, 1f /* タスクからならタスクスタックへ磊仑 & R1に充哈みスタック疤弥をコピ〖 */ or3 r0, r0, 0x80 mv r1, r15 mvtc r0, psw /* 充哈みスタックに锣闰したものをタスクスタックにコピ〖 */ ld r0, @(4,r1) st r0, @-r15 ld r0, @r1 st r0, @-r15 addi r1, 8 mvtc r1, spi mvfc r0, psw1: stmdb "r14" bl 1f .long InterruptHandlerEntry .long _unhandled_interrupt_handler .long interrupt_handler_r1: /* 充哈み妥傍戎规の艰叫し */ ld24 r1, ICUISTS ld r0, @r1 st r0, @-r15 /* ハンドラ弹瓢戎孟艰叫し */ ld r1, @r14+ //InterruptHandlerEntry srli r0, 20 add r1, r0 addi r1, -4 ld r1, @r1 srli r0, 2 /* ハンドラの判峡澄千 */ bnez r1, 1f /* ハンドラ踏判峡の充哈み */ ld r1, @r14 //_unhandled_interrupt_handler beqz r1, exit_interrupt_handler1: /* スクラッチ+BPCを锣闰してハンドラ弹瓢 */ stmdb "r2,r3,r4,r5,r6,r7" mvfachi r2 st r2, @-r15 mvfaclo r2 st r2, @-r15 mvfc r2, bpc st r2, @-r15 /* 充哈みスタックモ〖ド, 充哈み钓材, PSW瘦赂 */ mvfc r2, psw or3 r3, r2, 0x40 and3 r3, r3, 0xff7f mvtc r3, psw st r2, @-r15 ld r14, @(r14,4) //interrupt_handler_r jmp r1 /* * 充哈みハンドラ 牲耽ポイント */ .text .align 4interrupt_handler_r: /* 充哈み敦贿, スタックモ〖ド牲耽 */ ld r0, @r15+ mvtc r0, psw /* 提り黎のチェック (BSMがユ〖ザスタック -> タスクへ)*/ and3 r0, r0, 0x8000 beqz r0, recover_int /* タスクコンテキストからの充哈み - 牲耽ル〖チン */ bl 1f .long _kernel_reqflg .long _kernel_runtsk .long recover_task_r1: /* reqflgのチェック */ ld r0, @r14+ //_kernel_reqflg ld r1, @r0 beqz r1, recover_task /* ハンドラ柒でのディスパッチ券栏痰し */ /* reqflg = 0 */ ldi r1, #0 st r1, @r0 /* タスクディスパッチの券栏 */ stmdb "r8,r9,r10,r11,r12,r13" ld r0, @r14+ //_kernel_runtsk ld r0, @r0 ld r1, @r14+ //recover_task_r st r1, @(TCB_pc, r0) ld24 r1, ICUIMASK ld r2, @r1 mvfc r1, psw or r1, r2 st r1, @(TCB_psw, r0) st r15, @(TCB_sp, r0) bra _kernel_exit_and_dispatchrecover_task_r: ldmia "r13,r12,r11,r10,r9,r8" /* タスク毋嘲弹瓢 */recover_task: bl _kernel_calltex /* 鼎奶牲耽借妄 */recover_int: ld r0, @r15+ mvtc r0, bpc ld r0, @r15+ mvtaclo r0 ld r0, @r15+ mvtachi r0 ldmia "r7,r6,r5,r4,r3,r2"exit_interrupt_handler: /* 充哈みマスク牲耽 */ ld r0, @r15+ srli r0, 16 ld24 r1, ICUIMASK+1 stb r0, @r1 ldmia "r14,r1,r0" rte/**************************************************************************/ .section ".vector","ax"/* * トラップのエントリ婶 : トラップ戎规の呈羌 */ .irp num,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .align 4 _trap_handler_\num: stmdb "r0,r1,r2,r14" ldi r1, #((\num + EXC_TRAP00 -1) * 4) bra _exception_handler .endr/* * 毋嘲/トラップハンドラ *//* * レジスタの姥み数 * R0-R7,R14,ACC(HI/LO),BPC,[ICUIMASK|PSW],R8-R13 */ .extern ExceptionHandlerEntry_exception_handler: bl 1f .long ExceptionHandlerEntry .long _unhandled_interrupt_handler1: /* ハンドラ粕み叫し */ ld r0, @r14+ //ExceptionHandlerEntry add r0, r1 ld r0, @r0 bnez r0, 1f /* ハンドラ踏判峡の充哈み */ ld r1, @r14+ //_unhandled_interrupt_handler beqz r1, exit_exception_handler //ハンドラ踏判峡なら篓姜位 /* ハンドラ弹瓢 & スタック磊仑 */1: stmdb "r3,r4,r5,r6,r7" mvfachi r1 st r1, @-r15 mvfaclo r1 st r1, @-r15 mvfc r1, bpc st r1, @-r15 mvfc r2, psw and3 r2, r2, 0xff7f mvtc r2, psw ld24 r14, exception_handler_r jmp r0 .text .align 4exception_handler_r: bl 1f .long _kernel_reqflg .long _kernel_runtsk .long recover_exception_exc_task_r .long _kernel_exit_and_dispatch1: /* 提り黎はどこ々 (BSM=1->タスク)*/ mvfc r0, psw and3 r1, r0, 0x8000 beqz r1, 1f /* タスクスタックへ磊り仑える */ or3 r1, r0, 0x80 mvtc r1, psw /* CPU毋嘲面にディスパッチがあるか? */ ld r0, @r14+ //_kernel_reqflg ld r1, @r0 beqz r1, 2f /* ディスパッチの券栏 */ stmdb "r8,r9,r10,r11,r12,r13" ld24 r0, ICUIMASK ld r0, @r0 mvfc r1, psw srli r1, 8 //IE,SM,C <= BIE,BSM,BC or r0, r1 ld r2, @r14+ //_kernel_runtsk ld r2, @r2 st r0, @(TCB_psw, r2) ld r3, @r14+ //recover_exception_exc_task_r st r0, @(TCB_pc, r2) st r15, @(TCB_sp, r2) /* ディスパッチル〖チンへ若ばす */ ld r0, @r14+ //_kernel_exit_and_dispatch mvtc r0, bpc xor r0, r0 mvtc r0, psw rte .align 4recover_exception_exc_task_r: ldmia "r13,r12,r11,r10,r9,r8" /* タスク毋嘲の弹瓢 */2: bl _kernel_calltex /* スクラッチ牲耽 */1: ld r0, @r15+ mvtc r0, bpc ld r0, @r15+ mvtachi r0 ld r0, @r15+ mvtaclo r0 ldmia "r7,r6,r5,r4,r3"exit_exception_handler: ldmia "r14,r2,r1,r0" rte/**************************************************************************//* * タスクディスパッチャ * extern void dispatch(void); * extern void exit_and_dispatch(void); */Function _kernel_dispatch /* * レジスタ锣闰 */ stmdb "r8,r9,r10,r11,r12,r13,r14" bl 1f .long _kernel_runtsk .long dispatch_r1: /* * TCBにスタックと浩弹瓢戎孟を瘦赂 */ ld r0, @r14+ //_kernel_runtsk ld r1, @r14+ //dispatch_r ld r0, @r0 st r1, @(TCB_pc, r0) // runtsk->tskctxb->pc = dispatch_r; st r15,@(TCB_sp, r0) // runtsk->tskctxb->sp = r15; /* * PSW[12:15]に充哈みマスクビットを仆っ哈んでTCBに瘦赂 */ ld24 r2, ICUIMASK mvfc r1, psw ld r3, @r2 or r1, r3 st r1, @(TCB_psw, r0) //runtsk->tskctxb->psw = PSW|*(ICUIMASK); /* * 庙罢 : この眷疥は.alignを蝗わずに32ビット董肠であることを * 瘦俱すること。そうでないとexit_and_dispatchへの尸呆 * で木涟の16ビット炭吾が悸乖されてしまう。 */Label _kernel_exit_and_dispatch bl 1f .long _kernel_schedtsk .long _kernel_runtsk1: /* スタックモ〖ド磊仑 */ xor r0, r0 mvtc r0, psw /* 肌に弹瓢すべきタスクを玫す */ ld r1, @r14+ //_kernel_schedtsk1: ld r0, @r1 bnez r0, 1f /* 弹瓢すべきタスクがないので、充哈み钓材して略怠 */ ld24 r2, (ICUIMASK+1) ldi r3, #7 stb r3, @r2 //IMASK = 链钓材 ldi r0, 0x40 mvtc r0, psw //ei/* ldi r0, #1 ld24 r2, CLKMOD+3 stb r0, @r2 ldb r0, @r2 .rept 8 nop .endr*/ xor r0, r0 mvtc r0, psw //di bra 1b1: /* R0 = schedtsk, R1 = &schedtsk */ /* runtsk = schedtsk; */ ld r2, @r14+ //_kernel_runtsk st r0, @r2 /* PSWと充哈みマスクを牲耽 (スタックモ〖ドも磊仑) */ ld r1, @(TCB_psw, r0) and3 r2, r1, 0xffff mvtc r2, psw srli r1, 16 ld24 r2, ICUIMASK+1 stb r1, @r2 /* スタックポインタとプログラムカウンタを牲耽 */ ld r15, @(TCB_sp, r0) ld r0, @(TCB_pc, r0) jmp r0 /* * 庙罢 : この眷疥は.alignを蝗わずに32ビット董肠であることを * 瘦俱すること。 */ /* ディスパッチ牲耽婶 */dispatch_r: /* タスク毋嘲の钙叫 */ bl _kernel_calltex ldmia "r14,r13,r12,r11,r10,r9,r8" rts/**************************************************************************/ /* * タスクの弹瓢倡幌(タスクスタ〖トアップル〖チン) * extern void activate_r(void); */ .extern _kernel_runtsk .extern ext_tskFunction _kernel_activate_r bl 1f .long _kernel_runtsk .long ext_tsk1: /* タスク弹瓢洁洒 */ ld r2, @r14+ //_kernel_runtsk ld r2, @r2 ld r2, @(TCB_tinib, r2) // r2 = runtsk->tinib ld r0, @(TINIB_exinf, r2) ld r1, @(TINIB_task, r2) /* タスクから提ろうとしたらext_tskへ */ ld r14, @r14 //ext_tsk jmp r1/**************************************************************************/ /* * 称硷 花驴なモジュ〖ル * extern ER get_ipm(IPM * ipm); * extern ER chg_ipm(IPM ipm); */Function get_ipm ld24 r1, ICUIMASK+1 ldub r2, @r1 st r2, @r0 xor r0, r0 rtsFunction chg_ipm ld24 r1, ICUIMASK+1 and3 r0, r0, 0xf st r0, @r1 xor r0, r0 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -