1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAのエミュレータ

Last updated at Posted at 2024-08-01

ここに置きました。

ビルド

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;

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?