前回、xv6の実装を確認するためにISSをバイナリで実行させたが、システムレジスタを実装していないことや、いくつかの命令を実装していないことが問題になった。 (そのときは緊急回避したが)。
そこで、MIPSのシステムレジスタを実装するためのスケルトンを作成した。 ちなみに、MIPSのアーキテクチャ仕様書はImagination Technologyのサイトからダウンロードできる。僕はこれを印刷して製本している(笑)
さて、RISC-Vでは既にシステムレジスタを実装しているため、それを元に拡張することにしよう。新たにmips_sysreg_table.rbを作成した。
... Array[12, 8,'ASE','R'], Array[ 4, 0,'MCCause','R']]] $sysreg_table[ 9] = Array[0x52, 'RW', 'SegCtl0', Array[Array[31,16,'CFG1', 'RW'], Array[15, 0,'CFG0', 'RW']]] $sysreg_table[10] = Array[0x53, 'RW', 'SegCtl1', Array[Array[31,16,'CFG3', 'RW'], Array[15, 0,'CFG2', 'RW']]] $sysreg_table[11] = Array[0x54, 'RW', 'SegCtl2', Array[Array[31,16,'CFG5', 'RW'], Array[15, 0,'CFG4', 'RW']]] $sysreg_table[12] = Array[0x55, 'RW', 'PWBase', Array[Array[31, 0,'PWBase', 'RW']]] $sysreg_table[13] = Array[0x56, 'RW', 'PWField', Array[Array[29,24,'GDI', 'RW'], Array[23,18,'UDI', 'RW'], Array[17,12,'MDI', 'RW'], Array[11, 6,'PTI', 'RW'], Array[ 5, 0,'PTEI', 'RW']]] $sysreg_table[14] = Array[0x57, 'RW', 'PWSize', Array[Array[29,24,'GDW', 'RW'], Array[23,18,'UDW', 'RW'], Array[17,12,'MDW', 'RW'], Array[11, 6,'PTW', 'RW'], Array[ 5, 0,'PTEW', 'RW']]] $sysreg_table[15] = Array[0x60, 'RW', 'Wired', Array[Array[ 4, 0,'Wired', 'RW']]] $sysreg_table[16] = Array[0x66, 'RW', 'PWCtl', Array[Array[31,31,'PWEn', 'RW'], Array[ 7, 7,'DPH', 'RW'], Array[ 6, 6,'HugePg', 'RW'], Array[ 5, 0,'PSn', 'RW']]] $sysreg_table[17] = Array[0x70, 'RW', 'HWRena', Array[Array[31,30,'Impl', 'RW'], Array[29, 0,'Mask', 'RW']]] $sysreg_table[18] = Array[0x80, 'R', 'BadVAddr', Array[Array[31, 0,'BadVAddr','R']]] $sysreg_table[19] = Array[0x81, 'R', 'BadInstr', Array[Array[31, 0,'BadInstr','R']]] $sysreg_table[20] = Array[0x82, 'R', 'BadInstrP', Array[Array[31, 0,'BadInstrP','R']]] $sysreg_table[21] = Array[0x90, 'RW', 'Count', Array[Array[31, 0,'Conut','RW']]] $sysreg_table[22] = Array[0x100,'RW', 'EntryHi', Array[Array[31,13,'VPN2','RW'], Array[12,11,'VPN2X','RW'], Array[10,10,'EHINV','RW'], Array[ 9, 8,'ASIDX','RW'], Array[ 7, 0,'ASID','RW']]] $sysreg_table[23] = Array[0x110,'RW', 'Compare', Array[Array[31, 0,'Compare','RW']]] $sysreg_table[24] = Array[0x120,'RW', 'Status', Array[Array[31,28,'CU','RW'], Array[27,27,'RP','RW'], Array[26,26,'FR','RW'], Array[25,25,'RE','RW'], ...
各システムレジスタの定義を記述している。これをRubyに掛けると、スケルトンを生成してくれるようにした。
ruby ./gen_sysreg_table.rb mips
すると、以下のファイルが自動生成されるようにした。
さらに、手動で読み書きの制御をするファイルを追加しておく。
- mips_sysreg_func.cpp
... } int32_t CsrEnv::Read_PAGEGRAIN (Word_t *data) { return 0; } int32_t CsrEnv::Read_SEGCTL0 (Word_t *data) { return 0; } int32_t CsrEnv::Read_SEGCTL1 (Word_t *data) { return 0; } int32_t CsrEnv::Read_SEGCTL2 (Word_t *data) { return 0; } int32_t CsrEnv::Read_PWBASE (Word_t *data) { return 0; } int32_t CsrEnv::Read_PWFIELD (Word_t *data) { return 0; } int32_t CsrEnv::Read_PWSIZE (Word_t *data) { return 0; } ...
とりあえずこれでコンパイルはできるようになった。次は、これを命令側から読み込んで実行できるようにする。