前回の続きで、ROMにはさらにいくつかの情報を挿入しなければならない。0x1020から挿入しなければならないのが、以下のRISC-Vのコンフィグレーションに関する情報だ。
前回の記事で紹介した以下のものになる。
platform { vendor ucb; arch spike; }; rtc { addr 0x40000000; }; ram { 0 { addr 0x80000000; size 0xaef00000; }; }; core { 0 { 0 { isa rv64imafdc; timecmp 0x40000008; ipi 0x40001000; }; }; };
これをまずは文字列として定義し、それをROMの初期値としてコピーする。
std::stringstream s; s << std::hex << "platform {\n" \ " vendor ucb;\n" \ " arch spike;\n" \ "};\n" \ "rtc {\n" \ " addr 0x40000000;\n" \ "};\n" \ "ram {\n" \ " 0 {\n" \ " addr 0x80000000;\n" \ " size 0xaef00000;\n" \ " };\n" \ "};\n" \ "core {\n" \ " 0 {\n" \ " 0 {\n" \ " isa rv64ima;\n" \ " timecmp 0x40000008;\n" \ " ipi 0x40001000;\n" \ " };\n" \ " };\n" \ "};\n"; std::string config_string = s.str(); memcpy (&m_memory[0x20], config_string.c_str(), config_string.size());
最後にmemcpyをして、ROMの当該位置に値を挿入した。
結構やっつけだが、これでROMについては完成。
さらにSpike-ISSとの不一致部分について調査していたのだが、ここから先はタイマ割り込みに入ってしまった。。。さてどうやって実現しようか。