前回までで、Spikeを解析した結果PLICのメモリマップを確保する必要があること、そして、PLICの簡単なデバイスを作成してSpikeに登録してやる必要があることが分かった。
というわけで簡単に実装した。
// See LICENSE for license details. #ifndef _RISCV_SIMPLEPLIC_H #define _RISCV_SIMPLEPLIC_H #include <riscv/mmio_plugin.h> #include "abstract_device.h" #include "mmu.h" class simpleplic_t : public abstract_device_t { public: simpleplic_t(std::string name); bool load(reg_t addr, size_t len, uint8_t* bytes); bool store(reg_t addr, size_t len, const uint8_t* bytes); private: }; /* ... 途中省略 ... */ #endif // _RISCV_SIMPLEPLIC_H
そして作成したデバイスライブラリをSpikeに登録する。
#ifndef SIM_MAIN argv[arg_max++] = "--extlib=../../../spike_dpi/libsimple_plic.so"; #else // SIM_MAIN argv[arg_max++] = "--extlib=./libsimple_plic.so"; #endif // SIM_MAIN argv[arg_max++] = "--device=simpleplic,201326592,plic"; // 201326592 = 0x0c00_0000
これにより、PLIC領域にアクセスするとちゃんと認識されるようになる。
argv[19] = (null) serialdevice: uart loaded simpleplic: plic loaded simple PLIC_t::store called : addr = 0 simple PLIC_t::load called : addr = 8 simple PLIC_t::load called : addr = 0 simple PLIC_t::load called : addr = 0 simple PLIC_t::store called : addr = 4 simple PLIC_t::load called : addr = 4 simple PLIC_t::store called : addr = 8 simple PLIC_t::load called : addr = 10 simple PLIC_t::load called : addr = 8 simple PLIC_t::load called : addr = 8 simple PLIC_t::store called : addr = c simple PLIC_t::load called : addr = c simple PLIC_t::store called : addr = 10 simple PLIC_t::load called : addr = 18 simple PLIC_t::load called : addr = 10 simple PLIC_t::load called : addr = 10 simple PLIC_t::store called : addr = 14 simple PLIC_t::load called : addr = 14 simple PLIC_t::store called : addr = 18 simple PLIC_t::load called : addr = 20 simple PLIC_t::load called : addr = 18 simple PLIC_t::load called : addr = 18 simple PLIC_t::store called : addr = 1c simple PLIC_t::load called : addr = 1c simple PLIC_t::store called : addr = 1000 simple PLIC_t::load called : addr = 1008 simple PLIC_t::load called : addr = 1000 1000 : 422 : IPC(recent) = 0.42, IPC(total) = 0.42 simple PLIC_t::load called : addr = 1000 2000 : 439 : IPC(recent) = 0.02, IPC(total) = 0.22 3000 : 439 : IPC(recent) = 0.00, IPC(total) = 0.15
問題はそのあとだな。デッドロックしているので要解析だ。