2018年9月12日水曜日

QEMU でエミュレートした Raspberry Pi 3 のシステムレジスタを確認した

前回からだいぶたってしまったが、 QEMU が Raspberry Pi 3 のエミュレートに対応したので復活。

システムレジスタの値を確認するコードを作成したので、仕様書と突き合わせていく。

実行結果

core id 以外はすべて 2 進数表記なので 0x でなく 0b 表記でないといけなかったですね…。

qemu-system-aarch64 -kernel ./kernel8.elf -serial null -serial mon:stdio -nographic -machine raspi3
core id: 0.
currentel: 0x1100.
nzcv: 0x1100000000000000000000000000000.
daif: 0x1111000000.
spsr_el1: 0x0.
spsr_el2: 0x0.
spsr_el3: 0x0.
midr_el1: 0x1000001000011111101000000110100.
revidr_el1: 0x0.
id_aa64pfr0_el1: 0x10001000100010.
id_aa64isar0_el1: 0x10001000100100000.
isr_el1: 0x0.

仕様書との突合せ

CurrentEL

記載箇所: Architecture Reference Manual - C5.2.1 CurrentEL, Current Exception Level

EL
0b00 EL0
0b01 EL1
0b10 EL2
0b11 EL3

ということで、 EL3 で動いているということがわかった。

NZCV

記載箇所: Architecture Reference Manual - C5.2.10 NZCV, Condition Flags

ラベル 意味
V Overflow condition flag. (1: 直前の計算がオーバーフローした, 0: 直前の計算がオーバーフローしていない)
C Carry condition flag. (1: 直前の計算で桁上がりした, 0: 直前の計算で桁上がりしていない)
Z Zero condition flag. (1: 直前の計算結果がゼロだった, 0: 直前の計算結果がゼロでなかった)
N Negative condition flag. (1: 直前の計算結果を符号付として解釈した時に、それが負数だった, 0:直前の計算結果を符号付として解釈した時に、それが負数でなかった)

29, 30 が 1 なので、この場合、Carry Condition flag と Zero condition flag が立っているのがわかる。

DAIF

記載箇所: Architecture Reference Manual - C5.2.2 DAIF, Interrupt Mask Bits

ラベル 意味
D Debug exceptions mask.
A SError interrupt Process state mask.
I IRQ mask.
F FIQ mask.

DAIF が全部マスクされていますね。

spsr_el1 - 3

EL1 から EL3 まで全部同じで全部 0。 例外一度も飛ばしていませんからね。

MIDR_EL1

ブロック 意味
Implementer 0x41 ARM Limited
Variant 0x0 製品のバリエーション判定に使えるが、 QEMU の場合は 0x0 固定らしい?
Architecture 0b1111 ID_* レジスタで個別に識別されるという意味
PartNum 0x0D03 製品番号?
Revision 0b0100 デバイスのリビジョン番号

revidr_el1

実装定義。 QEMU の場合は全部ゼロ。

id_aa64pfr0_el1

ブロック 意味
EL0 0b0010 Aarch64 または Aarch32 で実行ができる
EL1 0b0010 Aarch64 または Aarch32 で実行ができる
EL2 0b0010 Aarch64 または Aarch32 で実行ができる
EL3 0b0010 Aarch64 または Aarch32 で実行ができる
FP 0b0000 浮動小数点サポート(詳細は仕様書にて)
AdvSIMD 0b0000 SIMD サポート(詳細は仕様書にて)
GIC 0b0000 GIC Interface 未サポート
RAS 0b0000 RAS 未サポート
SVE 0b0000 SVE 未実装

oh…, GIC 未サポートなのか…。

id_aa64isar0_el1

ブロック 意味
AES 0b0010 AESE, AESD, AESMC, AESIMC, PMULL/PMULL2
SHA1 0b0001 SHA1C, SHA1P, SHA1M, SHA1H, SHA1SU0, SHA1SU1
SHA2 0b0001 SHA256H, SHA256H2, SHA256SU0, SHA256SU1, SHA512, SHA512H, SHA512H2, SHA512U0, SHA512SU1
CRC32 0b0001 CRC32B, CRC32H, CRC32W, CRC32X, CRC32CB, CRC32CH, CRC32CW, CRC32CX
Atomic 0b0000 Atomic 未サポート
RDM 0b0000 RDM 未サポート
SHA3 0b0000 SHA3 未サポート
SM3 0b0000 SM3 未サポート
SM4 0b0000 SM4 未サポート
DP 0b0000 DP 未サポート
FHM 0b0000 FHM 未サポート

とのこと。

isr_el1

ブロック 意味
F 0b0 FIQ pending bit.(0: No pending, 1: pending)
I 0b0 IRQ pending bit.(0: No pending, 1: pending)
A 0b0 SError pending bit.(0: No pending, 1: pending)

ペンディングとは?

まとめ

以上。 GIC 未サポートというのは予想外だったけれどまぁこんなものでしょうか?

参考資料