あまりやることがないので、久しぶりにDSPを見てみました。
前までにDSPで追加された64Bitレジスタ4本の保存はできていましたが、復帰が出来ているか確認していませんでした。
コンテキストスイッチ後にDSP命令を実行すると毎回トラップが発生するのかと思っていたのですが、デバッグライト入れたところ、初回しかトラップは発生しません。
どうもどこかでステータスレジスタを保存して復元しているようなのですが、いろいろいじってみたのですが、どこか分かりませんでした。
なのでトラップでDSP固有のレジスタをリストアすることは出来ないようです。
正統方でアセンブラのcpu_switchの最後にレジスタを戻すところの直前にDSPレジスタの復帰を追加してみました。
復帰させるステータスレジスタのMIPS_SR_MXが立っていたら復帰させるようにしました。
テストプログラムを書いて見ました。qemuのテストプログラムをベースにしています。
#include<stdio.h>
#include<assert.h>
int main(int argc, char *argv[])
{
int acli, aclo;
int result;
acli = atoi(argv[1]);
result = acli;
for(;;) {
__asm
("mtlo %1, $ac1\n\t"
: "=r"(aclo)
: "r"(acli)
);
sleep(1);
__asm
("mflo %0, $ac1\n\t"
: "=r"(aclo)
);
printf("%x %x\n", result, aclo);
if(result != aclo) {
printf("error\n");
break;
}
}
return 0;
}
これを引数を変えて二つ動かしてerrorが発生しないことを確認しました。(この修正を行う前はちゃんとエラーが出る事も確認しました)
インラインアセンブラがよく分からずmtloのところの引数にダミーの返り値を書かないとコンパイルが通りません。
トラップのコードは意味がないコードがあるので、いつか直します。