前回からだいぶたってしまったが、 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 未サポートというのは予想外だったけれどまぁこんなものでしょうか?