📄 cpu_config.h
字号:
: "r"(inhno),"r"(interrupt) : "r0", "r4", "r5");#endif}/* * CPU毋嘲ハンドラの肋年 */Inline voiddefine_exc(EXCNO excno, FP exchdr){ /* SH1は充哈みもCPU毋嘲も票じ妨及 */ define_inh(excno, exchdr);}/* * 充り哈みレベルの肋年 * ∈鼎奶婶からは钙び叫されない∷ */Inline voiddefine_int_plevel(HIOREG *reg, UW level, UINT shift){ *reg = (HIOREG)((*reg & ~(0xf << shift)) | (level << shift));}/* * 充哈みハンドラ】CPU毋嘲ハンドラの叫掐庚借妄 * *//* * 充哈みハンドラの叫掐庚借妄の栏喇マクロ * ∈肩に掐庚借妄∷ * * reqflg をチェックする涟に充哈みを敦贿しないと·reqflg をチェック稿 * に弹瓢された充哈みハンドラ柒でディスパッチが妥滇された眷圭に·ディ * スパッチされないˉ * * *//* C咐胳ル〖チンの簇眶叹から掐庚借妄のラベルを栏喇 */#define INT_ENTRY(inthdr) inthdr##_entry#define EXC_ENTRY(exchdr) exchdr##_entry/* * 充哈みハンドラ】CPU毋嘲ハンドラの掐庚借妄 * * SH1では、充哈みとCPU毋嘲の胺いがほとんど票じなので、 * 掐庚借妄のマクロも鼎奶に年盗している * 陵般爬 * ˇCPU毋嘲ハンドラに苞眶を涂える * ˇCPU毋嘲では、毋嘲券栏箕のIPMと票じ猛で充哈みを钓材する * ∈CPU毋嘲により、IPMを恃步させない∷ * * entry¨掐庚借妄のラベル * inthdr¨C咐胳ル〖チンの黎片アドレス * set_exchdr_arg1¨ * set_exchdr_arg2¨ * CPU毋嘲ハンドラの苞眶肋年脱の炭吾 * */#define _INTHDR_ENTRY(entry, inthdr, \ set_exchdr_arg1, set_exchdr_arg2) \asm(".text \n"\" .align 2 \n"\" .global _"#entry" \n"\"_"#entry ": \n"\ /* 涩妥呵井嘎のレジスタをスタックに略闰 */ \" mov.l r0,@-r15 \n"\ /* 充哈み敦贿とSR牲傅の洁洒 */ \ /* 充哈みハンドラの眷圭 */ \ /* 充哈み减烧箕にハ〖ドウェアがIPMを肋年する */ \ /* 充哈み钓材にはこのIPMの猛を脱いる */ \ /* CPU毋嘲ハンドラの眷圭 */ \ /* CPU毋嘲减烧箕にIPMの猛は恃步しない */ \ /* 充哈み钓材にはCPU毋嘲券栏箕のIPMの猛を脱いる */ \" mov.l r1,@-r15 \n"\ /* srをr1にコピ〖 */ \" stc sr,r1 \n"\ /* 充哈み敦贿 */ \" mov.l _mask_ipm_"#inthdr",r0 \n"\" ldc r0,sr \n"\ /* r2をスタックに略闰 */ \" mov.l r2,@-r15 \n"\ /* 充哈み】CPU毋嘲ネストカウンタのチェック */ \" mov.l _intnest_k_"#inthdr", r0 \n"\" mov.l @r0,r2 \n"\ /* 充哈み券栏箕のコンテキストを冉年 */ \" tst r2,r2 \n"\ /* 充哈みネストカウンタをインクリメント*/ \" add #0x1,r2 \n"\ /* add炭吾ではsrのTビットは恃步しない */ \" mov.l r2,@r0 \n"\ /* 驴脚充哈みならジャンプ */ \" bf _interrupt_from_int_"#inthdr" \n"\ /* 觅变スロットなし */ \ /* スタック掐れ仑え傅の */ \ /* タスクスタックポインタを瘦赂 */ \" mov r15,r2 \n"\ /* 充哈みスタックに磊り仑え */ \" mov.l _stacktop_k_"#inthdr",r15 \n"\ /* 充哈み钓材 */ \" ldc r1,sr \n"\ /* 荒りのスクラッチレジスタを瘦赂 */ \ /* r2:タスクスタックポインタ */ \" mov.l r3,@-r2 \n"\" mov.l r4,@-r2 \n"\" mov.l r5,@-r2 \n"\" mov.l r6,@-r2 \n"\" mov.l r7,@-r2 \n"\" sts.l pr,@-r2 \n"\ set_exchdr_arg1 /* CPU毋嘲の眷圭の苞眶肋年 */ \ /* C咐胳ル〖チン钙び叫し */ \" mov.l _c_routine_"#inthdr",r1 \n"\" jsr @r1 \n"\" mov.l r2,@-r15 \n" /* 觅变スロット */ \ /* タスクスタックポインタを */ \ /* 充哈みスタックに姥む */ \ \ /* 充哈み敦贿 */ \" mov.l _mask_ipm_"#inthdr",r0 \n"\" ldc r0,sr \n"\ /* 充哈み】CPU毋嘲ネストカウンタをクリア*/ \" mov.l _intnest_k_"#inthdr",r0 \n"\" mov #0x0,r1 \n"\" mov.l r1,@r0 \n"\ /* スタック磊仑え */ \" mov.l @r15,r15 \n"\ /* reqflgのチェック */ \" mov.l _reqflg_k_"#inthdr",r4 \n"\" mov.l @r4,r1 \n"\ /* reqflgがFALSEならret_to_task_intに若ぶ */ \" tst r1,r1 \n"\" bt _ret_to_task_int_"#inthdr" \n"\ /* 觅变スロットなし */ \" mov #0x0,r0 \n"\" mov.l ret_int_"#inthdr",r1 \n"\ /* ret_intへジャンプ */ \" jmp @r1 \n"\ /* 觅变スロット reqflgをクリア */ \" mov.l r0,@r4 \n"\ \ \/* 驴脚充哈みの借妄 */ \/* 充哈み券栏箕のコンテキストを冉侍稿、 */ \/* 充哈み敦贿 */ \/* r1¨充哈み减烧箕のsrのコピ〖 */ \/* の觉轮でここに若んでくる */ \/* ∈充哈みネストカウンタのインクリメントは貉んでいる∷ */ \ \"_interrupt_from_int_"#inthdr": \n"\ /* 充哈み钓材 */ \" ldc r1,sr \n"\ /* 荒りのスクラッチレジスタをスタックに姥む */ \" mov.l r3,@-r15 \n"\" mov.l r4,@-r15 \n"\" mov.l r5,@-r15 \n"\" mov.l r6,@-r15 \n"\" mov.l r7,@-r15 \n"\" sts.l pr,@-r15 \n"\ set_exchdr_arg2 /* CPU毋嘲の眷圭の苞眶肋年 */ \ /* C咐胳ル〖チン钙び叫し */ \" mov.l _c_routine_"#inthdr",r1 \n"\" jsr @r1 \n"\" nop \n" /* 觅变スロット */ \ \ /* 充哈み敦贿 */ \" mov.l _mask_ipm_"#inthdr",r0 \n"\" ldc r0,sr \n"\ /* 充哈み】CPU毋嘲ネストカウンタをディクリメント */ \" mov.l _intnest_k_"#inthdr",r0 \n"\" mov.l @r0,r2 \n"\" add #-1,r2 \n"\" mov.l r2,@r0 \n"\ \ \/* reqflgがFALSEの眷圭の借妄 */ \/* */ \/* ˇディスパッチもタスク毋嘲借妄も涩妥ない */ \/* ˇchg_ipm()の借妄は涩妥ない */ \/* ∈润タスクコンテキストでは、chg_ipm()は蝗脱稍材∷ */ \ \"_ret_to_task_int_"#inthdr": \n" \" lds.l @r15+,pr \n" /* レジスタ牲傅 */ \" mov.l @r15+,r7 \n" \" mov.l @r15+,r6 \n" \" mov.l @r15+,r5 \n" \" mov.l @r15+,r4 \n" \" mov.l @r15+,r3 \n" \" mov.l @r15+,r2 \n" \" mov.l @r15+,r1 \n" \" mov.l @r15+,r0 \n" \" rte \n" /* 充哈み傅に提る */ \" nop \n" \ \" .align 4 \n" \"_stacktop_k_"#inthdr": \n" /* タスク迫惟婶のスタックの介袋猛 */ \" .long "str_STACKTOP" \n" \"_intnest_k_"#inthdr": \n" /* 充哈み】CPU毋嘲ネストカウンタ */ \" .long "str_intnest" \n" \"_reqflg_k_"#inthdr": \n" \" .long "str_reqflg" \n" \"_mask_ipm_"#inthdr": \n" /* 充哈み敦贿脱マスク */ \" .long "str_MAX_IPM" << 4 \n" /* ipm笆嘲のビットはゼロで紊い */ \"_c_routine_"#inthdr": \n" \" .long _"#inthdr" \n" /* C咐胳ル〖チンの黎片アドレス */ \"ret_int_"#inthdr": \n" /* 叫庚借妄ret_intのアドレス */ \" .long "str_ret_int"\n" \)/* _INTHDR_ENTRY()マクロ ここまで *//* * 充哈みハンドラの叫掐庚借妄の栏喇マクロ * */#define INTHDR_ENTRY(inthdr) \ extern void inthdr##_entry(void); \ _INTHDR_ENTRY(inthdr##_entry, inthdr, "", "")/* * CPU毋嘲の眷圭の苞眶肋年脱マクロ * * タスクスタックポインタをコピ〖 * ∈スタック黎片から40バイト布にsrが姥まれている∷ */#define SET_EXCHDR_ARG(sp) \" mov "#sp",r4 \n"\" add #40,r4 \n"/* * CPU毋嘲ハンドラの叫掐庚借妄の栏喇マクロ * 庙罢 * 办忍稍碰炭吾の眷圭は提り戎孟を2バイト渴める涩妥があるが * 滦炳していない */#define EXCHDR_ENTRY(exchdr) \ extern void exchdr##_entry(VP sp); \ _INTHDR_ENTRY(exchdr##_entry, exchdr, \ SET_EXCHDR_ARG(r2), SET_EXCHDR_ARG(r15))/* * CPU毋嘲の券栏した箕のシステム觉轮の徊救 *//* * CPU毋嘲の券栏した箕のコンテキスト冉侍 */Inline BOOLexc_sense_context(VP p_excinf){ /* 1と孺秤するのは、附哼悸乖面のCPU毋嘲の尸 */ /* 充哈みネストカウンタがインクリメントされているため */ return(intnest > 1);}/* * CPU毋嘲の券栏した箕のCPUロック觉轮の徊救 */Inline BOOLexc_sense_lock(VP p_excinf){ return(((*(UW *)p_excinf) & 0x00000f0) == MAX_IPM << 4);}/* * ラベルの侍叹を年盗するためのマクロ */#define _LABEL_ALIAS(new_label, defined_label) \ asm(".globl _" #new_label "\n_" #new_label " = _" #defined_label);#define LABEL_ALIAS(x, y) _LABEL_ALIAS(x, y)/* * プロセッサ巴赂の介袋步 */extern void cpu_initialize(void);/* * プロセッサ巴赂の姜位箕借妄 */extern void cpu_terminate(void);/* * プロセッサ巴赂シリアル叫蜗 */extern void cpu_putc(char c);/* * 布淡のログ叫蜗箕のスタック菇陇の年盗 */typedef struct exc_stack { VW r0; VW r1; VW r2; VW r3; VW r4; VW r5; VW r6; VW r7; VW r8; VW r9; VW r10; VW r11; VW r12; VW r13; VW r14; VW r15; VW pr; /* プロシ〖ジャˇレジスタ */ VW pc; /* プログラムˇカウンタ */ VW sr; /* ステ〖タスˇレジスタ */} EXCSTACK;/* * 毋嘲券栏箕のログ叫蜗 (cpu_config.c, cpu_support.S) */extern void cpu_experr(EXCSTACK *);#endif /* _MACRO_ONLY_ */#endif /* _CPU_CONFIG_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -