(toppers-users 1659) Re: JSP1.4のarmv4について質問です

Shinya Honda honda @ ertl.jp
2004年 9月 15日 (水) 01:06:45 JST


鈴木さん
酔漢さん

armv4依存部を担当しております本田です.

- seiichi_horie <seiichi_horie @ yahoo.co.jp>-san writes ---
>1. exit_and_dispatch
>ご指摘のとおりだと思います。割り込み待ちを正しく行うために、
>
>ldr r0, =schedtsk /* schedtsk を読み込む */
>ldr r1, [r0]
>cmp r1, #0
>beq dispatcher_2 /* <<== */
>ldr r2, =runtsk /* schedtsk を runtskに */
>str r1, [r2]
>

** Cut quoted 10 lines by the mail filter. **

ご指摘ありがとうございます.以前SH3で同様の問題を指摘いただいた時に
armv4もチェックするべきでした.以下の用に修正しました.

   ldr   r0, =schedtsk   /* schedtsk を読み込む */
   ldr   r1, [r0]
   ldr   r2, =runtsk     /* schedtsk を runtskに */
   str   r1, [r2]        /* schedtsk がいない場合はruntskをNULLに */
   cmp   r1, #0
   beq   dispatcher_2



> >
> >cpu_lock状態の例外ですが、現状のままだと、
> >「μITRON4.0検定仕様書(案)」のSPC10のテストケースは通らないと思います。
> >問題ないのでしょうか?
> >
> >  
> >
> テストケースは通りませんね。少し考え直してみましたが、やはりこれは問題の
> ように思います。修正するか、文書で割り込み以外の例外は管理外であると明示
> したほうがよいようです。

** Cut quoted 1 lines by the mail filter. **

仕様書の66ページを見ますと
 
 「CPU例外ハンドラ実行開始直後は,CPU例外がCPUロック状態で発生した場合
 にはCPUロック状態,CPUロック解除状態で発生した場合にはCPUロック解除状
 態になっている.........」

とありますので,無条件で割込み許可(CPUロック解除状態)にしているのはバ
グです.CPU例外の入り口で例外発生時のCPUロック状態を引き継ぐよう修正し
ました.r1にspsrを保存して,0x80でandを行いロック状態, 0x13でorを取った

#define __EXCHDR_ENTRY(exchdr, stacktop)    \
extern void exchdr##_entry(VP sp);          \
asm(".text                             \n"  \
#exchdr "_entry:                       \n"  \
"       ldr   sp,.int_stack_"#exchdr"  \n"  /* スタックの切り替え*/\
"       sub   lr,lr,#4                 \n"  /* undefでもこれでいいか?*/\
"       stmfd sp!, {r0 - r2,lr}        \n"  /* 一時的にint_stackに待避*/ \
"       mrs   r1, spsr                 \n"  /* SVCモードに切り替えるため */ \
"       mov   r0, sp                   \n"  /* 保存する*/ \
"       mov   r2,#0xd3                 \n"  /* CPSRの書き換え(SVCモードへ)*/ \
"       msr   cpsr,r2                  \n" \
"       ldr   r2,[r0,#0x0C]            \n"     /* load  PC*/\
"       stmfd sp!,{r2}                 \n"     /* Store PC*/\
"       stmfd sp!,{r3,ip,lr}           \n"     /* Store r3,ip,lr*/\
"       ldmfd r0!,{r2,ip,lr}           \n"     /* load  r0,r1,r2*/\
"       stmfd sp!,{r1,r2,ip,lr}        \n"     /* SPSR,Store r0,r1,r2*/\
"       ldr   r2, .interrupt_count_"#exchdr"\n" /* 多重割り込みか判定*/\
"       ldr   r3, [r2]                 \n" \
"       add   r0,r3,#1                 \n" \
"       str   r0, [r2]                 \n" \
"       mov   r0,sp                    \n" /* 例外ハンドラへの引数 */\
"       cmp   r3, #0x00                \n" \
"       ldreq   sp,stack_"#exchdr"     \n" /* スタックの変更       */\
"       stmeqfd sp!,{r0}               \n" /* タスクスタックの保存 */\
"       and   r2, r1, #0x80            \n" /* 例外発生時のCPUロック状態 */\
"       orr   r2, r2, #0x13            \n" /* を継承. SVCモード */\
"       msr   cpsr,r2                  \n" \
"       bl    "#exchdr"                \n" /* ハンドラ呼び出し     */\


現在 JSP 1.4.1 のリリース作業を行っておりますので,バグや要望等があり
ましたらお知らせ下さい.
#あまり大きな変更には対応できないと思いますが.....

-------------------------------------------------------
本田 晋也(Shinya Honda)
豊橋技術科学大学大学院 工学研究科 電子情報工学専攻  
名古屋大学大学院 情報科学研究科 情報システム学専攻 高田・冨山研究室
E-mail  honda @ ertl.jp               
WWW     http://www.ertl.jp/~honda