Open Design Computer Project

オリジナルCPUから作る本格的自作コンピューター

ユーザ用ツール

サイト用ツール


hardware:mist32

目次

MIST32 Processor Architecture

MIST32アーキテクチャ

MIST32はアウトオブオーダ実行を行うことを前提としたプロセッサアーキテクチャです。命令セットレベルでアウトオブオーダ実行に必要となるハードウェアを極力小さくできるように配慮し、命令レベルの並列化を低消費電力で実現しようとするアーキテクチャです。主な特徴としてはwith Flag命令の廃止やフラグチェーンの廃止、があります。

このページではMIST32 ISA1.0についての詳細について記載しています。

With Flag命令の廃止

MIST32アーキテクチャでは基本的に従来のプロセッサで存在するADCなどの、1つ前のフラグを参照する命令は廃止しています。これにより、アウトオブオーダー実行において使用する、リザベーションステーションの待ち受け数を最低限に減らすことが可能となります。待ち受けや依存性解析は非常に大きなハードウェアを必要とするため、低消費電力で動作させるためには待ち受けユニットを減らすことが必要です。なお、条件ブランチ命令のみ、条件判定のために1つ前の命令のフラグを参照できるようになっています。

このような仕組みをとることにより、多倍長演算などのさい若干の性能低下が起こる可能性があります。しかしながら、このMIST32はモバイル端末~コンピュータなどの、オペレーティングシステムが搭載されることを前提としているアーキテクチャなので、With Flag命令の仕様は極端に少ないという考えを元にしています。通常C言語またはC++において、通常変数がオーバーフローしたとしても無視されるという点にあります。たとえばLinuxカーネル(x86)において、非With Flag命令であるADDと、With Flag命令であるADCの出現率は1/180程であるため,With Flag命令を許しハードウェア規模を増大させるコストよりも、他の命令に置き換えることで解決します。

命令セット

命令フォーマットと命令リストは MIST32 Instruction Set Architecture を参照。

タイプ一覧

MIST32アーキテクチャは、フルセットのType-Sアーキテクチャと、サブセットのType-Eアーキテクチャを定義しています。

Typenote
MIST32 Type-Sフルセットの定義。OSを必要とするモバイル環境向け。
MIST32 Type-Eサブセットの定義。組み込み・小規模ハードウェア向け。

レジスタセット

MIST32アーキテクチャは通常演算などで使用される汎用レジスタと、プロセッサの状態を示したり設定するためのシステムレジスタを持ちます。

RISCでありながらもこのように明確に分けることにより、アウトオブオーダー実行時、必要な待ち合わせユニットの大幅な削減が可能となり、結果的に回路規模を小さくすることができ、低消費電力化も可能となります。

汎用レジスタ(Type-S/Type-E)

レジスタ名
r0~r31

なお、以下汎用レジスタは、関数呼び出し規則により、以下名称で呼ばれることもあります。

r7rtmp
r29rglobl
r30rbase
r31rret

システムレジスタ(Type-S)

システムレジスタへのリード・ライトはそのレジスタ専用に設けられている命令を用いて実現が可能です。また、システムレジスタによっては、プログラムから一切アクセスが禁止されているものもあります。

CPUIDR(Processor ID Register)

プロセッサバージョン固有のIDを示します。1つのプロセッサ内に複数のコアを持つ場合においてもすべてのコアでこのIDは共通となります。このレジスタは正確にはレジスタではなくROMであり、いかなる場合においても書き込みを許しません。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~65~0
名称PIDPREV
機能MIST32に対応するプロセッサのIDプロセッサのリビジョン

COREIDR(Core ID Register)

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~2019~1615~87~0
名称CLKMANCLKEXPReservedCOREID
機能コアのクロック周波数を示す[仮数部]コアのクロック周波数を示す[指数部]予約コアのID

TIDR(Task ID Register)

現在実行中のタスクIDと、ASID(Address Space ID)を示します。TLBはASIDを参照してアドレス空間を認識します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド31~1817~1413~0
名称ASIDreserved[0b0000]TID

FLAGR(Flag Register)

ジャンプ命令のみリード可能でその他の命令では一切リード・ライト不可能となります。このレジスタを直接的にリード・ライトする専用命令も用意されていません。フラグ更新を行わない命令の直後、フラグレジスタはすべて0となります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド43210
名称SPOFCFPFZF
機能演算結果が負数の場合1演算結果がオーバーフローした際1演算結果に桁上げが生じた場合1演算結果が偶数なら1演算結果が0ならば1

PCR(Program Counter Register)

現在実行されている命令が格納されている、メモリのアドレスを挿します。すべての命令において、このレジスタを明示的に参照したり書き込みすることはできません。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド31~0
名称PC

SPR(Stack Point Register)

PUSH/POP系の命令にて2次的に操作されるレジスタです。SPRは次にPUSHされるべきメモリ上のアドレスを指します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
x
ビットフィールド31~0
名称SPR

PSR(Program Status Register)

現在実行中のプロセッサのシステムを設定または示すレジスタです。 多重割り込みを防止するためにIMは、割り込み時に自動的に0にセットされます。多重割り込みを許可する場合や再び割り込みを許可する場合はIMを書き換えるか、IB命令でPPSRに書き戻されることで可能となります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド31:109:76:54:321:0
名称予約MMUPSCMOD IMMMUMOD
機能予約MMU Page Size (MMU の項を参照)0:Kernel Mode
01:予約
10:予約
11:User Mode
予約0:Interrupt Mask
1:Interrupt Non Mask
00:Invalid Paging(Direct Access)
01:1Level Paging
10:2Level Paging
11:予約

IOSAR(IO Start Address Register)

メモリマップドIOにおいて、I/Oにマップされる開始アドレスを示します。このレジスタから0xFFFFFFFFまではIOにマップされることを示します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称IOSAR

PDTR(Page Directry Table Register)

現在参照しているページテーブルが格納されている物理アドレスを示すレジスタです。タスク切り替えの際に使用するレジスタで、特定の割り込み時にCPUが自動的に値を書き込みます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド31~0
名称PDTR

TISR(Task Information Structure Register)

カーネル空間にある現在実行中のタスクの、物理インデックスアドレスを示しています。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称TISPR

KPDTR(Kernel Page Directory Table Register)

カーネル空間が存在しているページの、ページテーブルが保持されている物理アドレスを示すレジスタです。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称KPDTR

IDTR(Interrupt Discriptor Table Register)

割り込みディスクリプタの開始アドレスを物理アドレスで持っているレジスタ。このレジスタはバイトアドレスで示している。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称IDTR

FI0R(Fault Infomation 0 Register)

フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称FI0R

FI1R(Fault Infomation 1 Register)

フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称FI1R

SRR0~n(System Reserved Register)

プロセッサコアで予約されているレジスタ。このレジスタはMIST32アーキテクチャに定義されませんが、コアの構成上用意される可能性があるレジスタです。全ての権限においてどのような場合においても利用不可能なレジスタです。プロセッサコアによって複数個予約される可能性があります。このレジスタはたとえばプロセッサ内部においてマイクロコードを実行するときや、ハードウェアコンテキストスイッチを行う際に利用されます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド31~0
名称不定

FRCR(Free Running Count Register)

このレジスタは64bitのシステムレジスタで、すべての命令において直接このレジスタの内容を参照したり書き込んだりすることはできません。以下に紹介するFRCLRとFRCHRをバッファとして、間接的に操作します。 このレジスタは常にプロセッサのコアクロックに同期してカウントアップするカウンタです。リセット時直後からカウントアップを始めます。このカウンタはフリーランニングカウンタなので、常にカウントアップし続け、64'hFFFFFFFFFFFFFFFFの次は0になり、またカウントアップし始めます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド63~0
名称FRCR
機能常にカウントアップするフリーランニングカウンタ

FRCLR(Free Running Count Low Register)

このレジスタはFRCHRと共にFRCRのバッファレジスタの1つとして使用されます。FRCRの値を読む場合、命令を発行することでFRCHRとFRCLRにそれぞれHigh32bit, Low32bitがコピーされます。FRCRに書き込む場合、FRCHRとFRCLRにそれぞれHigh32bit, Low32bitを書き込み、専用命令によりFRCRに書き込まれます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxx
ビットフィールド31~0
名称FRCLR
機能常にカウントアップするフリーランニングカウンタ

FRCHR(Free Running Count High Register)

このレジスタはFRCHRと共にFRCRのバッファレジスタの1つとして使用されます。FRCRの値を読む場合、命令を発行することでFRCHRとFRCLRにそれぞれHigh32bit, Low32bitがコピーされます。FRCRに書き込む場合、FRCHRとFRCLRにそれぞれHigh32bit, Low32bitを書き込み、専用命令によりFRCRに書き込まれます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxx
ビットフィールド31~0
名称FRCHR
機能常にカウントアップするフリーランニングカウンタ

システムレジスタ(Type-E)

システムレジスタへのリード・ライトはそのレジスタ専用に設けられている命令を用いて実現が可能です。また、システムレジスタによっては、プログラムから一切アクセスが禁止されているものもあります。

FLAGR(Flag Register)

ジャンプ命令のみリード可能でその他の命令では一切リード・ライト不可能となります。このレジスタを直接的にリード・ライトする専用命令も用意されていません。フラグ更新を行わない命令の直後、フラグレジスタはすべて0となります。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド43210
名称SPOFCFPFZF
機能演算結果が負数の場合1演算結果がオーバーフローした際1演算結果に桁上げが生じた場合1演算結果が偶数なら1演算結果が0ならば1

PCR(Program Counter Register)

現在実行されている命令が格納されている、メモリのアドレスを挿します。すべての命令において、このレジスタを明示的に参照したり書き込みすることはできません。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド31~0
名称PC

SPR(Stack Point Register)

PUSH/POP系の命令にて2次的に操作されるレジスタです。SPRは次にPUSHされるべきメモリ上のアドレスを指します。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
x
ビットフィールド31~0
名称SPR

PSR(Program Status Register)

現在実行中のプロセッサのシステムを設定または示すレジスタです。 多重割り込みを防止するためにIMは、割り込み時に自動的に0にセットされます。多重割り込みを許可する場合や再び割り込みを許可する場合はIMを書き換えるか、IB命令でPPSRに書き戻されることで可能となります。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xx
ビットフィールド31:321:0
名称予約IM予約
機能予約0:Interrupt Mask
1:Interrupt Non Mask
00:Invalid Paging(Direct Access)
01:1Level Paging
10:2Level Paging
11:予約

IDTR(Interrupt Discriptor Table Register)

割り込みディスクリプタの開始アドレスを物理アドレスで持っているレジスタ。このレジスタはバイトアドレスで示している。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxx
ビットフィールド31~0
名称IDTR

FI0R(Fault Infomation 0 Register)

フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxx
ビットフィールド31~0
名称FI0R

FRCR(Free Running Count Register)

このレジスタは64bitのシステムレジスタで、すべての命令において直接このレジスタの内容を参照したり書き込んだりすることはできません。以下に紹介するFRCLRとFRCHRをバッファとして、間接的に操作します。 このレジスタは常にプロセッサのコアクロックに同期してカウントアップするカウンタです。リセット時直後からカウントアップを始めます。このカウンタはフリーランニングカウンタなので、常にカウントアップし続け、64'hFFFFFFFFFFFFFFFFの次は0になり、またカウントアップし始めます。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド63~0
名称FRCR
機能常にカウントアップするフリーランニングカウンタ

FRCLR(Free Running Count Low Register)

このレジスタはFRCHRと共にFRCRのバッファレジスタの1つとして使用されます。FRCRの値を読む場合、命令を発行することでFRCHRとFRCLRにそれぞれHigh32bit, Low32bitがコピーされます。FRCRに書き込む場合、FRCHRとFRCLRにそれぞれHigh32bit, Low32bitを書き込み、専用命令によりFRCRに書き込まれます。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xx
ビットフィールド31~0
名称FRCLR
機能常にカウントアップするフリーランニングカウンタ

FRCHR(Free Running Count High Register)

このレジスタはFRCHRと共にFRCRのバッファレジスタの1つとして使用されます。FRCRの値を読む場合、命令を発行することでFRCHRとFRCLRにそれぞれHigh32bit, Low32bitがコピーされます。FRCRに書き込む場合、FRCHRとFRCLRにそれぞれHigh32bit, Low32bitを書き込み、専用命令によりFRCRに書き込まれます。

ReadWrite命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xx
ビットフィールド31~0
名称FRCHR
機能常にカウントアップするフリーランニングカウンタ

割り込み退避用システムレジスタ(Type-S)

システムレジスタはPreviousレジスタを持つものがあります。これは割り込みでコンテキストが切り替わる際に、今まで実行していたシステムレジスタのコンテキストをPreviousレジスタにコピーすることにより、以前のシステムレジスタの状態を取得できるようにします。また、Previousレジスタに変更を加えて ib命令を送出することで、割り込み終了時にコンテキストの変更や特権レベルの変更などを適用することができます。

PFLAGRやPPCRなど、各レジスタのプレフィックスにPが付きます。

PFLAGR(Previous Flag Register)

割り込みが発生すると自動的にFLAGRの値がPFLAGRにコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxxx
ビットフィールド43210
名称SPOFCFPFZF
機能演算結果が負数の場合1演算結果がオーバーフローした際1演算結果に桁上げが生じた場合1演算結果が偶数なら1演算結果が0ならば1

PPCR(Previous Program Counter Register)

割り込みが発生すると自動的にPCの値がPPCRにコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称PC

PPSR(Previous Program Status Register)

割り込みが発生すると自動的にPSRからPPSRにコピーされます。このレジスタは1つ前のタスクが実行されていた状態を示しています。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~76:54~321:0
名称予約CMOD IMMMUMOD
機能予約00:Kernel Mode 1~2:予約 : 3:User Mode予約0:Interrupt Mask 1:Interrupt Non Mask00:Invalid Paging(Direct Access) 01:1Level Paging 10:2Level Paging 11:予約

PPDTR(Previous Page Directry Table Register)

割り込みが発生すると自動的にPDTRの値がコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~0
名称PDTR

PTIDR(Previous Task ID Register)

割り込みが発生すると自動的にTIDRの値がコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxxx
ビットフィールド31~1413~0
名称フラグ類予約TID

割り込み退避用システムレジスタ(Type-E)

システムレジスタはPreviousレジスタを持つものがあります。これは割り込みでコンテキストが切り替わる際に、今まで実行していたシステムレジスタのコンテキストをPreviousレジスタにコピーすることにより、以前のシステムレジスタの状態を取得できるようにします。また、Previousレジスタに変更を加えて ib命令を送出することで、割り込み終了時にコンテキストの変更や特権レベルの変更などを適用することができます。

PFLAGRやPPCRなど、各レジスタのプレフィックスにPが付きます。

PFLAGR(Previous Flag Register)

割り込みが発生すると自動的にFLAGRの値がPFLAGRにコピーされます。

Kernel Mode ReadKernel Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド43210
名称SPOFCFPFZF
機能演算結果が負数の場合1演算結果がオーバーフローした際1演算結果に桁上げが生じた場合1演算結果が偶数なら1演算結果が0ならば1

PPCR(Previous Program Counter Register)

割り込みが発生すると自動的にPCの値がPPCRにコピーされます。

Kernel Mode ReadKernel Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxxx
ビットフィールド31~0
名称PC

PPSR(Previous Program Status Register)

割り込みが発生すると自動的にPSRからPPSRにコピーされます。このレジスタは1つ前のタスクが実行されていた状態を示しています。

Kernel Mode ReadKernel Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
xxx
ビットフィールド31~321~0
名称予約IM予約
機能予約0:Interrupt Mask 1:Interrupt Non Mask予約

CC : Condition Code(Type-S/Type-E)

条件分岐を行う際の分岐条件をCondition Code(以下CC)で指定します。通常のプロセッサにおける条件付き実行で使用されるCCとは異なります。MIST32ではBranchの条件を指定するコードとなります。ビットフィールドはAFEと共通となり、ジャンプ命令系においてAFEが無効となり、CCとして扱われます。なお、アセンブリ言語記述の際はCC1および、CC2どちらも対象とされるCodeに変換されます。

CCは1つ前の命令の発生させるフラグを参照します。1つ前の命令はCMP、TEST等の比較命令や、フラグを発生させる命令を用意する必要があります。1つ前の命令がフラグを発生させる命令ではない場合、プロセッサはプログラマが期待する動作をしない可能性があります。よって、コンパイラやアセンブリでの記述の際は、ブランチ命令の前にかならずフラグを更新する命令を入れなくてはなりません。 なお、#ALで無条件ジャンプの場合はこの限りではありません。

CMP命令を使用した際のフラグは、第1オペランド-第2オペランドのフラグがCCと比較されます。

//   R0   >=  1
cmp  r0,      1
b    <hoge>,  #ge
CodeOperate条件CC1CC2CC3(GCC)フラグ条件
0x0AlwaysAlwaysAL  Always
0x1Equal==EQZ EQZF
0x2Not Equal!=NEQNZNE!ZF
0x3Minus- MI SF
0x4Plus+ PL !SF
0x5Even Number2% EN PS
0x6Odd Number!%2 ON !PS
0x7Overflow  OVF OF
0x8Unsigned >=(Cary Set)>=UEOCGEUCF
0x9Unsigned <(Not Cary Set)<UUNCLTU!CF
0xAUnsigned >>UO GTUCF and !ZF
0xBUnsigned ⇐UEU LEU!CF or ZF
0xCSigned >=>=SEO GE(SF and OF) or (!SF and !OF)
0xDSigned <<SU LT(SF and !OF) or (!SF and OF)
0xESigned >>SO GT!((SF xor OF) or ZF)
0xFSigned ⇐SEU LE(SF xor OF) or ZF

AFE(Type-S)

AFEは通常の命令実行を行った後に簡単な命令を実行します。これは、値またはフラグを返す命令で、そのディスティネーションまたはフラグにのみ影響を及ぼします。

アセンブリでのAFEの指定は以下のように行います。

ld32 r0, r0, #none 
ld32 r1, r1, #sext8-32

Call / Return について(Type-S/Type-E)

MIST32 では Call, Return 命令を持っていません。しかし、CALL の一部を実現する命令を備えていて、ユーザは以下で同等の機能を実現することが可能となります。

関数呼び出し規則

  • 引数
    • 最初引数から r1 から順番に積んでいく
    • 足りない場合にはスタック
  • 返り値
    • r0
r0 返り値 呼び出し側でスタック退避
r1 ~ r6 引数 呼び出し側でスタック退避
r7 (rtmp) コンパイラ用レジスタ 退避しなくて良い (割り込み時は退避)
r8 ~ r28 一時変数 呼び出される側で使う場合に退避が必要
r29 (rglobl) グローバルポインタ 基本的にそのまま
r30 (rbase) フレームベースポインタ 呼び出された側で退避
r31 (rret) リターンアドレス 呼び出す側で必要な場合は退避

関数呼び出しのイメージ (呼び出し側)

  push    r0
  push    r1
    ; push registers...
 
    lil     r1,   <arg1>         ; args
    lil     r2,   <arg2>
    lil     r3,   <arg3>
    lil     r4,   <arg4>
 
    lih     rtmp, hi(function)   ; load function address
    wl16    rtmp, lo(function)
 
    movepc  rret, 8              ; rret = PC + 8
    b       rtmp, #al            ; call
 
    st32    r0,   <return_dest>  ; return here
 
    ; pop registers...
    pop     r0
    pop     r1

関数呼び出しのイメージ (呼び出される側)

    push    rbase
    push    rret                 ; 更に潜る場合のみ
    srspr   rbase
 
    ; hogehoge
    ; fugafuga
 
    lil     r0, <return_val>     ; return value
 
    srspw   rbase
    pop     rret                 ; 更に潜る場合のみ
    pop     rbase          
 
    b       rret, #al            ; ret

Memory

Memoryサイズの取得(Type-S)

プロセッサはメモリサイズをSPD等(SPDチップの処理などは別チップに任せる。つまりMIST32で規定しない)からメモリ総容量を取得し、DPSに格納する。この処理はリセット時に一度行われる → この処理はDPS-MIによって自動的に行われる。

Memory Ordering(Type-S)

全てのメモリオーダリングに置いて、同一のアドレスに対するアクセスの順番は必ず保証される。同一のアドレス以外に対するメモリアクセスはアーキテクチャ上保証されない。意図する順序で実行をさせるために同期命令を用いる必要がある。

  • 実際の実装について
    • MIST1032ISA : インオーダ実行のため全てのメモリアクセスはプログラム通り保証される。
    • MIST1032SA : 命令の実行はアウトオブオーダだが、Load/Storeに限ってインオーダで実行されるため全てのメモリアクセスはプログラム通り保証される。

Byte Ordering(Type-S/Type-E)

MIST32 の byte order は、big endian です。

Data Alignment(Type-S/Type-E)

メモリアクセスアライメント

メモリアクセスはByte, Half Word, Wordアクセスが可能です。アクセス可能なアライメントは以下のようになります。

Addr:0Addr:1Addr:2Addr:3
ld8/st8OK(1Byte)OK(1Byte)OK(1Byte)OK(1Byte)
ld16/st16OK(2Byte)不定OK(2Byte)不定
ld32/st32/ppush/push/pop/OK(4Byte)不定不定不定

I/Oアライメント

I/OにはWordアクセスが可能のみ。アクセス可能なアライメントは以下のようになります。

Addr:0Addr:1Addr:2Addr:3
ld8/st8不定不定不定不定
ld16/st16不定不定不定不定
ld32/st32/ppush/push/pop/OK(4Byte)不定不定不定

レジスタアライメント(Type-S/Type-E)

全てWord単位でのアクセスになります。任意Byteを取得したい場合は命令を組み合わせる必要があります。

メモリ空間(Type-S)

MIST32のメモリ空間はIOSRが指さすアドレス以降はMMIOの空間となります。0~IOSR-4(Byte Address)の値まではユーザが利用できる空間となります。

MMIOの空間はDPSとGCIから構成されます。DPS : Default Peripheral SystemGCI : General Device Connection Interfaceの詳細はそれぞれのページをご覧ください。

メモリコントローラとの接続(Type-S)

MIST32はメモリコントローラを定義しません。しかし、メモリコントローラとのインタフェースは定義しています。MIST32のメモリコントローラの仕様を満たすためには、これらのモードのいずれかをサポートする必要があります。

ModeLoadStore
M0

MMU : Memory Management Unit(Type-S)

  • MMUは最大2段階のページングをサポートします。MMUのコントロールはPSR[1:0]によって、無変換から2段階まで行うことが可能です。
    • 当分の間、無変換と2段階のみサポートをします。
  • 1ページのサイズは、4KB から 2MB, Page Size Extension を使うことで 4MB よりさらに大きいページサイズも利用可能です。
    • 当分の間、4KB のみサポートします。
  • PDTはKernel Modeの時はKPDTRを、User Modeの時はPDTRを参照します。

ページングモード

MMU のページングに関するモード指定は、大きく分けて2つあります。

MMUMOD : PSR[1:0]

MMU の動作モードを指定します。

Bit Mode
00 Paging Off
01 1-Level Paging
10 2-Level Paging
11 Reserved

MMUPS : PSR[9:7]

MMU のページサイズを指定します

Bit 2-Level Paging 1-Level Paging
000 Reserved Reserved
001 4KB 128KB
010 8KB 256KB
011 16KB 512KB
100 32KB 1024KB
101 64KB 2048KB
110 Reserved Reserved
111 Reserved Reserved

論理アドレス

プロセッサによりアクセスされた論理アドレスは1,2段目ページ内インデックスと、ページ内オフセットに分けられます。

以下のように、32bit のアドレスがインデックスとオフセットに利用されます。上位アドレスから、左から順にビット数が割り振られます。

モード1段目ページ内インデックス2段目ページ内インデックスページ内オフセット
4KB10bit10bit12bit
8KB8bit11bit13bit
16KB6bit12bit14bit
32KB4bit13bit15bit
64KB2bit14bit16bit
128KB15bit17bit
256KB14bit18bit
512KB13bit19bit
1024KB12bit20bit
2048KB11bit21bit

4KB ページサイズの場合には、以下のようになります。

ビットフィールド31:2221:1211:0
アドレス1段目ページ内インデックス2段目ページ内インデックスページ内オフセット

PTE : Page Table Entry

ページテーブルは、PTE の配列です。それそれの PTE は以下の構造になっています。

ビットフィールド31:(ページサイズにより可変)11:0
機能物理ページインデックスページフラグ

ページフラグ

ページテーブルエントリ内に、ページの状態やモードを示すフラグを格納しています。

フラグは以下のようにアサインされています。これらのフラグは、TLBとメモリのページテーブルとで同期している必要があります。

BitNameNote
11:9Reserved予約
8PEPage Extension Flagこのページがページサイズ拡張を利用する場合1
7GGlobal Flagこのページ共有ページである場合である場合1。Global Pageは、TLBのLRUによるFlush操作において常に非Global Pageよりも優先的にTLBに残す。
6CDCache Flag0 Cache Enable
1 Cache Disable
5:4PPPage Privilege Flag[00] Kernel:RW, User:__
[01] Kernel:R_, User:__
[10] Kernel:RW, User:R_
[11] Kernel:RW, User:RW
3EXExecution Flagこのページが実行可能である場合1
2DDirty Flagこのページが書き込みを行っている場合1
(1の場合スワップアウトの際にメモリも更新する必要あり)
1AAccessed Flagアクセスしているページである場合1 (ページアウトのLRU制御用)
0VValid Flagこのページが有効である場合1

Dirty Flag, Read Flag

FIXME Read じゃなくて Accessed では? → 1 R Read Flagを1 A Accessed Flagに変更

Dirty Flag と Read Flag は、PTE が指すページに書き込みや読み込みが行われたかを、MMU が書き込みます。 一度セットされたフラグは、ソフトウェアが明示的にクリアしない限り更新されません。

現状書き込み/読み込みが行われた時に、即ページテーブルと TLB が更新されます。

Dirty Flag は、2-level paging mode の場合、PDT (1段目ページテーブル) の PTE では使用されません。

Cache Flag

キャッシュフラグは、ページのキャッシュを許可するかどうかを指定します。 Memory Mapped I/O に使われている領域など、CPU にキャッシュされたくない領域を含むページである場合には、このフラグを 0 に設定するとキャッシュが無効になります。

Global Flag

グローバルフラグをセットすると、ASID にかかわらず、すべてのページで共通の(グローバルな)ページであることを示します。通常、カーネル領域などどのページでも同じマップであることが保証されている領域に利用します。

TLB 内に Global Flag がセットされているエントリがキャッシュされている場合、ASID にかかわらずそのエントリが利用される可能性があります。また、通常の TLB フラッシュ動作ではこのエントリは削除されません。

PE Flag (Page Size Extension)

このフラグは、2-level paging mode の PDT (1段目ページテーブル) 内の PTE で有効にすると、サイズが拡張されたページを扱うことができます。 それ以外の PTE では使用できません。 このフラグが指定されていると、2段目のページテーブルは存在しません。2段目のページテーブルインデックスに相当するビットまでがオフセットアドレスとなり、ページテーブルの物理ページインデックスを指すフィールドが、ページの物理ページインデックスになります。

4KB page mode の場合、PE Flag が利用されたページは以下のようになります。4MB (2^22) のページを扱うことができます。

ビットフィールド31:2221:1211:0
PTE物理ページインデックス(0 である必要がある)ページフラグ (PE == 1)
アドレス物理ページインデックスページ内オフセット

TLB : Translation Lookaside Buffer

MIST32 は、ページング処理の高速化のために TLB を持ちます。 TLB は、PTE の一部をキャッシュします。

TLB は、ASID をタグとして持ちます。

TLB フラッシュ

TLB は、専用命令を使ってフラッシュします。

論理アドレスから物理アドレスへの変換

  1. PDTR が1段目ページテーブル (PDT : Page Directory Table) が格納されている物理アドレスを指し示しています。
  2. 1段目ページテーブルと、1段目ページ内インデックスから計算されたアドレスにより、PTE を取得し、2段目ページテーブルの物理ページインデックスを求めます。
  3. 2段目物理ページインデックスが指すページ内に、2段目のページテーブルが格納されています。
  4. 2段目のページテーブルと、2段目ページ内インデックスから計算されたアドレスにより、PTE を取得し、論理アドレスにマップされた物理ページインデックスが求められます。
  5. 上位18ビットを物理ページインデックス、下位14bitのページ内オフセットとし、論理アドレスに対応する物理アドレスに変換されます。

Page Fault

アドレス変換時に、取得した PTE の Valid Flag が有効でない場合、MMU は Page Fault 割り込みをします。

Privilege Error

アドレス変換時に、Page Privilege Flag や Execution Flag に違反するアクセスが行われた場合、MMU は命令特権違反割り込みをします。

割り込み(Type-S)

MIST32では割り込みは2048のエントリを持っています。割り込みはハードウェア割り込み・トラップ(ソフトウェア割り込み)・フォールト・アボートに分類されています

退避されるレジスタ

FIXME 書いてない

FI0R/FI1Rについて

この2つのレジスタはフォールトが発生した際に、その要因の詳細を記憶するレジスタです。フォールトの種類により役割が異なります。

割り込み一覧

Non-Maskable Interruptは、PSRのIMビットの状態に依存しません。

ソフトウェア割り込みは64~127までの割り込みベクタを指定可能です。

No.MaskTypeFactorFI0RFI1R
0~3予約
4~35Maskable InterruptHardwareGCIデバイス0~31破壊(0x00000000)none
36Maskable InterruptHardwareDPD UTIM64A~B破壊(0x00000000)none
37Maskable InterruptHardwareDPD LSFLAGS破壊(0x00000000)none
38~39予約
40Non-Maskable InterruptFaultページフォルト(MMU)Faultが起きた仮想アドレス[3]PTE InValid(1:Invalud) / [2]User Mode(1:Usermode) / [1]Write(1:Write) / [0]Instruction Fetch(1:Instruction)
41Non-Maskable InterruptFaultメモリアクセス(ページ単位),命令特権違反(MMU)Faultが起きた仮想アドレス変化なし
42Non-Maskable InterruptFault無効命令(MMU)Faultを引き起こした命令のリニア(仮想)アドレスFI0Rと同様
43Non-Maskable InterruptFault割り込みベクタ無効無効であった割り込み番号FI0Rと同様
44~49予約
50Non-Maskable InterruptFaultTSS無効Faultを引き起こした命令のリニアアドレス
51Non-Maskable InterruptFault除算エラーFaultを引き起こした命令のリニアアドレス
52~63予約
63Non-Maskable InterruptAbortダブルフォールト
64~127Non-Maskable InterruptSWソフトウェア割り込み用

割り込みベクタ

割り込みベクタは割り込み番号ごとに存在し、各種フラグや割り込みハンドラ情報を持っています。

BitNameNote
0Valid bit1:割り込みベクタが有効
1Mask bit1:割り込みハンドラが有効(無効の場合この割り込みは引き起こさない)
15~2Reserved
17~16PRI割り込みレベル
[00] コンテキストスイッチのタイミングで起こす??
[11] すぐに起こす??
31~18Reserved
63~32HDL割り込みハンドラ

割り込み制御について

リセット後のIDTをセットする手順は以下のようになります。割り込みフラグを操作する場合必ず以下の手順を必要とします。割り込みハンドラの変更を行う際にはメモリ上の割り込みハンドラを書き換えるだけで問題ありません。リセット時以に設定を行うにはSRIEIW命令にて割り込みマスクを割り込み禁止にセットしてから行います。

  1. IDTをメモリ上の任意の位置に配置します。
  2. SRIDTW命令にてIDTのIndexを設定します。
  3. IDTS命令にてIDTをプロセッサに設定します。
  4. SRIEIW命令にてプロセッサの割り込みマスクを割り込み許可にします。

割り込みが発生すると自動的にPSR_IMレジスタが0に更新され、多重割り込みを防止します。もし許可したい場合はレジスタの退避を行ってからPSR_IMを1に書き換えることで割り込みを許可します。

割り込みステート(GCI/DPS)

GCIとDPSは割り込みステートを持ちます。

  • S0
    • 通常動作時を指します。
  • I0
    • 割り込みが起こったことを示します。

DPS/GCIは、I0モードになると、まずはじめにその割り込み番号に対応するフラグレジスタを読むまでインターフェース側の動作を停止します。プログラマははI0モードになった時(つまり割り込みが発生したら)、まずはじめにそれぞれの対応するデバイスの割り込み要因フラグ(たとえばDPS_SCIであればLSFLAGS、GCIであればINTFLAG)を読む必要があります。このレジスタを読まない限り、GCI/DPSへのアクセスは禁止されたままになります。

割り込み(Type-E)

MIST32では割り込みは2048のエントリを持っています。割り込みはハードウェア割り込み・トラップ(ソフトウェア割り込み)・フォールト・アボートに分類されています

退避されるレジスタ

PCR,

FI0R/FI1Rについて

この2つのレジスタはフォールトが発生した際に、その要因の詳細を記憶するレジスタです。フォールトの種類により役割が異なります。

割り込み一覧

Non-Maskable Interruptは、PSRのIMビットの状態に依存しません。

No.MaskTypeFactorFI0R
0~3予約
4~37Maskable InterruptHardwareExternal Device0
38~42予約
43Non Maskable InterruptHardwareInvalid Interrupt VectorIRQ Num
44~127予約

割り込みベクタ

割り込みベクタは割り込み番号ごとに存在し、各種フラグや割り込みハンドラ情報を持っています。

BitNameNote
0Valid bit1:割り込みベクタが有効
1Mask bit1:割り込みハンドラが有効(無効の場合この割り込みは引き起こさない)
31~2Reserved
63~32HDL割り込みハンドラ

割り込み制御について

リセット後のIDTをセットする手順は以下のようになります。割り込みフラグを操作する場合必ず以下の手順を必要とします。割り込みハンドラの変更を行う際にはメモリ上の割り込みハンドラを書き換えるだけで問題ありません。リセット時以に設定を行うにはSRIEIW命令にて割り込みマスクを割り込み禁止にセットしてから行います。

  1. IDTをメモリ上の任意の位置に配置します。
  2. SRIDTW命令にてIDTのIndexを設定します。
  3. IDTS命令にてIDTをプロセッサに設定します。
  4. SRIEIW命令にてプロセッサの割り込みマスクを割り込み許可にします。

割り込みが発生すると自動的にPSR_IMレジスタが0に更新され、多重割り込みを防止します。もし許可したい場合はレジスタの退避を行ってからPSR_IMを1に書き換えることで割り込みを許可します。

Protection & Security(Type-S)

FIXME あとで書く

I/O

MIST32ではメモリマップドI/Oを採用しています。IO領域の開始アドレスはIOSARに示されます。IOSARの値は接続されるデバイス構成により変化し、このアドレスはリセット時に一度だけ書き換えられます。

IOはすべてワードアドレッシングのみ採用しています。よってByteやハーフワードロードストア命令であるld8, ld16 / st8, st16命令などにより参照された場合はアライメント違反の割り込みが発生します。

I/O空間の構成

I/O空間は標準タイマ、RTC、UARTなどを搭載しているDefault Peripheral System(DPS)と汎用的なデバイスを自由に接続可能なGeneration Device Connection Interface(GCI)から構成されます。

DPS

GCI

TST : Task Structure Table(Type-S)

TISRが指すアドレスにTSTが存在します。TSTにはプロセッサが切り替えるべきタスクのキューと、タスク構造体が格納されています。

TST全体の構成

0x00000000~0x000003FFQueue entry0~127
0x00000400~0x00260190Task Structure0~16383

Queue entryの構成

ビットフィールド313029~1415~1413~0
名称VE予約予約?TID
機能0:このQueueエントリは無効 1:このQueueエントリは有効0:タスクはすでに実行済み 1:タスクの実行待ち予約未使用:0で埋めるこのQueueエントリが示すタスクID

タスク構造体の内容

0x00000000~0x00000003TASK_INF
0x00000004~0x00000007GR0
0x00000080~0x00000083GR31
0x00000084~0x00000087PCR
0x00000088~0x0000008BSPR(User mode)
0x0000008C~0x0000008FSPR(Kernel mode)
0x00000090~0x00000093PDT
0x00000094~0x00000097PSR
0x00000098~0x0000009BFLAGR
0x00000098~0x000000FF予約

TASK_INFの構成

ビットフィールド3130~2928~0
名称VP予約
機能0:このTASKは無効 1:このTASKは有効タスクの優先度、0~3で0が最も優先度が低い予約

自動タスクスイッチについて(Type-S)

FIXME 後日

インテリジェントタスクキャッシュ

MIST32では32本物汎用レジスタを持っていて、タスクスイッチのコストが大きいという問題点があります。そのため、自動タスクスイッチ使用する際に、比較的使用頻度の高いタスクを自動的にキャッシュして、それを設定された保護レベルでそのキャッシュが追い出されないように保護する機能を持ちます。使用されるキャッシュは通常のLoad/Storeパイプに接続された1Lまたはそれより下位のキャッシュが使用され、使用者はタスクストラクチャでレベルを設定するだけでプロセッサの昨日により実現されます。最大に使用できる領域は実装依存となり、キャッシュなので非実装もアーキテクチャとして許可されます。もしもその領域を使い果たした場合、プロセッサは自動的に保護レベルにのっとったLRUアルゴリズムに基づき自動的にメモリに退避します。

物理層の定義(Type-S)

メモリコントローラとの接続インタフェース

MIST32はメモリコントローラを定義しません。しかし、メモリコントローラとのインタフェースとフォーマットは定義しています。

フォーマット

以下の制御信号を保つ必要があります。

  • ADDR : Wordアドレス。最大30bit
  • Store (CPU → Memory Controller)
    • MASK : 書き込みを行うべきByteラインを示す。bit数はDATAのbit数によって決定される。1でマスクを掛ける。。
    • DATA : 32/64/128/256bitのいずれかである必要がある。
  • Load (Memory Controller → CPU)
    • DATA : 32/64/128/256bitのいずれかである必要がある。

フォーマット

  • Store (CPU → Memory Controller)
    • 書き込むべきアドレスはADDRによって決まり、データはMASKラインによって決定されます。
  • Load (Memory Controller → CPU)
    • メモリコントローラはDATAのバス幅の単位でデータを返します。LD8やLD16等の命令、または32bit以上のバス幅である場合、プロセッサで必要なデータだけどマスクして取り出します。
hardware/mist32.txt · 最終更新: 2016/03/16 02:01 by takahiro