竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU ステータスレジスタ

<<   作成日時 : 2009/12/02 14:37   >>

ブログ気持玉 0 / トラックバック 0 / コメント 2

 以前のエントリステータスレジスタとロード・ストア命令で少しだけ触れたが、ステータスレジスタについてもう少し詳細を検討する。

32bit長、最大64本のステータスレジスタ。ビット幅は最小モデルの汎用レジスタのビット長に合わせた。本数はSR0〜SR63まで存在する。まだ具体的な番号と機能との対応付けはしないので、ピリオドを付けてSR.pswのように名前を付けて呼ぶ。
ステータスレジスタ内の機能を持つビットはさらにピリオドを付けてSR.psw.widthのように呼ぶ。
基本的にユーザーモードでは読み出しのみ、特権モードでは書き込み/読み出しができる。レジスタのビットごとに特権モードのみのアクセスをすることは許可しない。レジスタ丸ごと設定する。


SR.cpuid 自CPUのユニークなID。ユーザ読み出しのみ/特権読み書き可
SR.cpuid.core [15:0] チップ内の自コア番号。マルチスレッドをサポートする場合は下から必要なビット数を割当てる。2スレッドの場合 [15:1]コアID、[0]スレッドID。
SR.cpuid.chip [23:16] チップの番号。ボード上の実装位置を示す。チップの外部端子による設定が見える。
SR.cpuid.board [31:24] システム上のボードまたは筐体の位置。特権モードで書き込んで設定する。その他のビットは書き込んでも無視される。
 それぞれのビット幅は変わることがある。また、SR.cpuid.chipとSR.cpuid.boardは区別されないことがある。(ハードウェアで固定値に設定される場合)

SR.id チップ固有のID。かつてPentiumIIIで物議を醸したやつ。生産されるチップで完全にユニークな数値。
SR.id[31:0] ユーザ読み出しのみ
特権モードで"0"を書き込むとSR.idはall0になる。特権モードで"0"以外を書き込むとユニークIDが見えるようになる。
実際はブート時に読み込むシリアルEEPROM内に書き込んだ値がセットされる。
これはチップ固有のIDなので、SR.cpuid.chip/SR.cpuid.threadと合わせるとチップ/スレッド固有のIDとなる。

SR.psw プロセッサ・ステータス・ワード 読み出しのみ 現在のビット幅や本数の設定は特権モードで。このレジスタに書き込むか他の方法にするか未定。
SR.psw.width [1:0] 汎用レジスタの現在のビット幅 00.. 32bit 01.. 64bit 10..128bit 11..256bit
SR.psw.mwidth [3:2] 汎用レジスタの最大ビット幅 SR.psw.widthと同じ。固定値。
SR.psw.nums [5:4] 汎用レジスタの現在の本数 00..64本 01..128本 10..256本
SR.psw.mnums [7:6] 汎用レジスタの最大の本数 00..64本 01..128本 10..256本 固定値。
SR.psw.fwidth [9:8] 浮動小数点レジスタの現在のビット幅 00.. 32bit 01.. 64bit 10..128bit 11..256bit
SR.psw.mfwidth [11:10] 浮動小数点レジスタの最大ビット幅 SR.psw.fwidthと同じ。固定値。
SR.psw.fnums [13:12] 浮動小数点レジスタの現在の本数 00..64本 01..128本 10..256本 11..512本
SR.psw.mfnums [15:14] 浮動小数点レジスタの最大の本数 00..64本 01..128本 10..256本 11..512本 固定値。
SR.psw.ver[23:16] プロセッサバージョン
SR.psw.bcd [?] BCD演算命令が存在するか
SR.psw.cop [?:?] 拡張演算命令が存在するか、そのバージョン
SR.psw.thread [?:?] マルチスレッドに対応しているか、スレッド数
※増えすぎたら別のSRに定義すればよい。

SR.fpu 浮動小数点演算器の機能、モード
SR.fpu.r [2:0]丸めモード 011...偶数方向丸め 100...切り捨て 101...負の無限大 110...標準 111...正の無限大
SR.fpu.i [?:?] 割り込みモードの定義
SR.fpu.ver [?:?] 浮動小数点演算ユニットが存在するか 0..存在せず 1以上 浮動小数点演算機能バージョン

SR.rand 乱数 ユーザモード読み書き可
読み出すたびに32bitの乱数が読み出される。ただしall0はない。
0書き込みでよみ出したら0が読める→疑似乱数 この時、0以外の値を書き込みはseed値とみなす。
0書き込みでよみ出したら0以外→真性乱数 熱雑音などによるハードウェア乱数発生装置がある。

SR.tick CPUクロックに同期して+1されるカウンタ。各コアごとに持つ。同一コア内のスレッドでは違いはない。コアごとの周波数制御を意識している。

SR.stick チップ共通の、外部クロック(32768Hz)に同期して+1されるカウンタ。
SR.wdt ウォッチドッグタイマ。SR.stickと同じタイミングで+1され、コアが動作しているとクリアされる。設定値になるとWDTリセット発生。
SR.wdt.count [15:0] カウンタ値
SR.wdt.limit [31:16] 設定値。SR.wdt.countがこの値になるとWDTリセット発生。
※このままだと最大値は2秒なのでオフセットなど付ける必要がある。

SR.int 割り込み制御。特権のみ書き込み可。
SR.int.event[3:0] 発生した割り込みのレベル。
SR.int.level[7:4] 外部割り込みマスクのレベル。
 その他未検討。

SR.tvect (〜4GB) トラップベクタテーブル先頭位置。
SR.ivect (〜4GB) インタラプトベクターテーブル先頭位置。
SR.send インタラプト送信メッセージ
SR.recv インタラプト受信メッセージ SR.sendと合わせてCPU間割り込みを考えているが詳細未検討。

SR.mmu ページテーブル、TLB関連のレジスタ。まだ決めてない。
SR.pte (〜4GB) ページテーブル先頭位置。

※トラップベクタテーブル、ページテーブルなどの存在する位置は32ビットの範囲内でいまのところ考えている。(〜4GB)

SR.mc メモリコンシステンシ制御。SR.pswに入れるかもしれない。RMO/TSOなど。

SR.ras RAS機能のサマリ。詳細は実装依存になるのでASI空間にアクセスして確認する。
SR.ras.retry [0] ロジック系でリトライがあったか(パリティ、ECCエラーなど)
SR.ras.deg [1] ロジック系で縮退があったか(演算器の片側がdisable)
SR.ras.fatal [2] ロジック系で回復不能なエラーがあったか
SR.ras.mretry [4] メモリ系でリトライがあったか(パリティ、ECCエラーなど)
SR.ras.mdeg [5] メモリ系で縮退があったか(キャッシュメモリのway縮退など)
SR.ras.mfatal [6] メモリ系で回復不能なエラーがあったか
SR.ras.impl [31] RAS機能が実装されているかどうか
※回復不能なエラーはソフトからは参照できないことがある(もはや動いてないかもしれないから)。JTAGスキャンで原因調査をするときに読み取る。

SR.asi0 ASI空間#0の番号
SR.asi1 ASI空間#1の番号
SR.asi2 ASI空間#2の番号
SR.asi3 ASI空間#3の番号

asi#0〜#3はasiを参照するロード・ストア命令で指定する。

asi空間の例(まだ決定してない)
asi.vr 論理アドレスと物理アドレスが同じ
asi.flag_c 汎用レジスタのキャリーフラグ一式
asi.flag_v 汎用レジスタのオーバーフローフラグ一式
asi.flag_n 汎用レジスタのネガティブフラグ一式
asi.flag_z 汎用レジスタのゼロフラグ一式
asi.flag_l 汎用レジスタのライフフラグ一式
asi.flag_fl 浮動小数点レジスタのライフフラグ一式
・・・
上記の様に共通のものから、実装依存のものまである。以下は実装依存の例。

・パフォーマンス測定
・電源管理
・デバック/診断機能
・RAS詳細

 SRはこれでもまだ20本程度しか使っていない。64本まで使えるので余裕を持った割当てをしたい。特にASIアクセスよりも早いアクセスが可能なので、応答時間が重要な割り込みなどに積極的に使いたい。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(2件)

内 容 ニックネーム/日時
全部ユーザー権限において読み出し可能というのが、まずいケースがありそうな気がします。
(普通必要なさそうなものはユーザー読み出しも禁止しておいて、必要に応じてソフトはシステムコールなどを通して分かるようにしておけば十分のような)

あと、tick レジスタは32ビットだと数秒以内に1周してしまうと思います(使い勝手に難)。

>回復不能なエラーはソフトからは参照できないことが

リセット〜再起動後にログとして残っている、という方式は考えられると思います。

>ASIアクセスよりも早いアクセスが可能

相対的にはそうかもしれませんが、(固定値のものは別として)状態レジスタのアクセスは投機実行に向かないので、汎用レジスタ並のアクセス速度は期待できません。
m.ukai
2009/12/03 11:32
ユーザでよみ出すことが必要なもの(乱数など)とその他ユーザモードで読まれるとまずいものは今後検討します。また、未着手ですが今後は1チップで多数のコア、コアごとにスレッドがあるでしょうから、チップで共通かコア/スレッドごとに必要なリソースかも分ける必要があります。

stickだと遅いので32bitでも充分ですが、それですらオフセットを付けて時間を稼ごうかと思っています。CPUクロック数であるtickはGHzのオーダーで、かつ細かい桁も必要なので、確かに32bitでは不足でした。2本64bitに分ける方向で考えます。(SPARC V9もたしか62bitか63bitでした)

>回復不能なエラーはソフトからは参照できないことが
リセットしても保存する設定にして、リセット後よみ出せればOK、リセットすらできなければ他のコアによみだしてもらうかJTAGで、という風にします。リセット(POR,XIR,SIR)後のレジスタ値の保存についても検討してませんでした。

>ASIアクセスよりも早いアクセスが可能
ご指摘ありがとうございます。割り込みやTLBミスに関して言えば、ソフトの作りやすさ(要因切り分けのやりやすさ)を考え、SRアクセスとASIアクセスを分けようと思っています。

houmei
2009/12/03 18:40

コメントする help

ニックネーム
URL(任意)
本 文




ぼくのかんがえたさいきょうCPU ステータスレジスタ 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる