ZRouterのKERNCONF_MAKEOPTIONSでCONF_CFLAGSに-mdspを設定してカーネルをビルドすると起動しなくなります。
gcc 4.2.1にはdspのサポートが入っていますが、あまり安定してなかったのかもしれません。
回避策としてビルド全体の設定ではなく、dsp命令を使用するアセンブラソースコード中で以下を設定します。
.set dsp
退避復旧のコードはswitch.S同様にアセンブラで書き、dsp.Sと別ファイルにしました。
ソースのヘッダーはswitch.Sのものを入れてあります。
とりあえずビルドできてカーネルは起動するのですがinitさんが起動できません。カーネルのframeにdsp関連のレジスタを追加したことが原因のようです。
ユーザーランドのほうにもdsp関連のレジスタを追加すればよいのですが、方法がわかりません。いろいろ考えてみてFPのレジスタはありますが、使われてないので、unionにしてそこにdsp関連のレジスタを保存する事にしました。
復元はdsp命令をユーザーランドで実行するとtrapが発生して、処理されるようになりました。
KERNCONF_MAKEOPTIONSでCONF_CFLAGSでMIPS_DSP_SUPPORTを定義するとDSPサポートが有効になります。DSPを使うのはごく限られるのでZRouterのsocsではなくvendorのmkで設定するようにします。
コンテキストスイッチで保存されるケースの確認方法を考えなければいけません。
mpg123のmips dspコードを誰か書いてくれませんか?
プロトタイプで全プロセスで保存を実行して、例外で復旧するようにしてみました。DSP命令を使用したプロセスのみで保存するのが正しいですし、領域のクリアもしてません。またきが向いたら考えます。