ここに置きました。
ビルド
mkdir ../build_qemu
cd ../build_qemu
../qemu/configure --target-list="arm-softmmu" --enable-debug --disable-docs
make
実行
cortex-m23が無いのでm33で代用
sudo ./qemu-system-arm -machine ra2l1 -cpu cortex-m33 -monitor null -kernel /path/to/xxx.elf -s -S | tee -a stdout.log
動作確認環境
device | name |
---|---|
cpu | i5-13400 |
os | fedora40 + xfce |
実装内容
- UART
- AES
- タイマ(面倒なので本体汚した)
- データフラッシュ(面倒なので本体汚した)
UARTはEVKとは使用箇所が異なると思うので注意
AESは以下を丸パクリ
変更ファイル
path | 内容 |
---|---|
accel/tcg/tcg-accel-ops.c | 仕方なくエラー回避 |
hw/arm/Kconfig | マシン追加 |
hw/arm/R7FA2L1AB.h | ルネサスのFSPからコピー |
hw/arm/meson.build | ビルドファイル追加 |
hw/arm/ra2l1.c | マシン本体 |
hw/arm/ra2l1.h | マシン定義 |
hw/arm/ra2l1_sc324_aes.c | AES関連 |
hw/arm/ra2l1_agt.c | タイマ |
hw/arm/ra2l1_agt.h | |
hw/arm/ra2l1_flash.c | フラッシュ |
hw/arm/ra2l1_flash.h | |
hw/arm/ra2l1_sc324_aes.h | AES関連 |
hw/arm/renesas_common.c | デバッグとか |
hw/arm/renesas_common.h | デバッグとか |
hw/arm/renesas_uart_stub.c | 外部シリアル入出力 USB接続のUARTを想定 |
UART
UARTは以下を想定しているため
EVK用のプログラムで使用する場合は
ra2l1_mmio_write
,ra2l1_mmio_read
などを変更してください。
0が外部入出力用、9が標準出力(入力は未実装)、
動作確認に使用したプログラムのベクタテーブルの一部
...
BSP_DONT_REMOVE const fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES] BSP_PLACE_IN_SECTION(BSP_SECTION_APPLICATION_VECTORS) =
{
[0] = gpt_counter_overflow_isr, /* GPT3 COUNTER OVERFLOW (Overflow) */
[1] = sci_uart_txi_isr, /* SCI0 TXI (Transmit data empty) */
[2] = sci_uart_tei_isr, /* SCI0 TEI (Transmit end) */
[3] = agt_int_isr, /* AGT0 INT (AGT interrupt) */
[4] = sci_uart_rxi_isr, /* SCI2 RXI (Receive data full) */
[5] = sci_uart_txi_isr, /* SCI2 TXI (Transmit data empty) */
[6] = sci_uart_tei_isr, /* SCI2 TEI (Transmit end) */
[7] = sci_uart_eri_isr, /* SCI2 ERI (Receive error) */
[8] = sci_uart_rxi_isr, /* SCI0 RXI (Receive data full) */
[9] = can_rx_isr, /* CAN0 FIFO RX (Receive FIFO interrupt) */
[10] = can_tx_isr, /* CAN0 FIFO TX (Transmit FIFO interrupt) */
[11] = sci_uart_eri_isr, /* SCI0 ERI (Receive error) */
[12] = sci_uart_rxi_isr, /* SCI9 RXI (Receive data full) */
[13] = sci_uart_txi_isr, /* SCI9 TXI (Transmit data empty) */
[14] = sci_uart_tei_isr, /* SCI9 TEI (Transmit end) */
[15] = sci_uart_eri_isr, /* SCI9 ERI (Receive error) */
...
割り込み関連の修正箇所はregister_irq
です。
上のベクターテーブルと以下の部分が対応しています。
182 static void register_irq(DeviceState *dev_soc, DeviceState *armv7m) {
...
188 struct {
189 int txi;
190 int tei;
191 int rxi;
192 } irqnum[] = {{1, 2, 8}, {-1}, {5, 6, 8}, {-1}, {-1},
193 {-1}, {-1}, {-1}, {-1}, {13, 14, 12}};
問題点
ここの解決方法が不明
多分ロックをかければ良いだけだと思うが、、、
diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c
index 3c19e68a79..94d9e34ebd 100644
--- a/accel/tcg/tcg-accel-ops.c
+++ b/accel/tcg/tcg-accel-ops.c
@@ -90,7 +90,7 @@ static void tcg_cpu_reset_hold(CPUState *cpu)
/* mask must never be zero, except for A20 change call */
void tcg_handle_interrupt(CPUState *cpu, int mask)
{
- g_assert(bql_locked());
+// g_assert(bql_locked());
cpu->interrupt_request |= mask;