RAのエミュレータ

ここに置きました。

https://github.com/tyano463/qemu/commit/58a9f895ab1607fd351168b0c8c6f5d5a13ae5e4

# ビルド
```shell
mkdir ../build_qemu
cd ../build_qemu
../qemu/configure --target-list="arm-softmmu" --enable-debug --disable-docs
make
```

# 実行
cortex-m23が無いのでm33で代用
```shell
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は以下を丸パクリ

https://qiita.com/tobira-code/items/152befa86bd515f67241

## 変更ファイル
| path|内容|
|- |-|
| accel/tcg/tcg-accel-ops.c | 仕方なくエラー回避 |
| hw/arm/Kconfig | マシン追加 |
| hw/arm/R7FA2L1AB.h | ルネサスの[FSP](https://github.com/renesas/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 | 外部シリアル入出力 <br>USB接続のUARTを想定 |

#### UART

UARTは以下を想定しているため
EVK用のプログラムで使用する場合は
`ra2l1_mmio_write`,`ra2l1_mmio_read`などを変更してください。

0が外部入出力用、9が標準出力(入力は未実装)、

動作確認に使用したプログラムのベクタテーブルの一部
```c
...
        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`です。
上のベクターテーブルと以下の部分が対応しています。

```c
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
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;

```

# 241210追記

外部接続せずにローカルだけで完結するバージョンを作ってみた。

https://qiita.com/ta_yano/items/78096ad8ba1afd6cdd19




# 参考
- https://qiita.com/tobira-code/items/152befa86bd515f67241