コンテンツにスキップ

SPRR と GXF

2025/3/9時点のsprr-gxfの翻訳


Guarded execution

Guarded executionモードはEL1とEL2の隣にある横方向の例外レベルで、同じページテーブルを使用しますが異なるパーミッションを使用します(SPRRを参照)。これらのレベルはGL1およびGL2と呼ばれます。これはS3_6_C15_1_2のビット1で有効になります。

命令0x00201420はgenterで、ELからGLに切り替え、PCをS3_6_C15_C8_1に設定します。0x00201420はgexitで、ELに戻ります。

#define SYS_GXF_ENTER_EL1 sys_reg(3, 6, 15, 8, 1)

Guarded modeではEL1/2と同様にELR、FAR、ESR、SPSR、VBAR、TPIDRの各レジスタが個別に設定されています。 さらに、ASPSRレジスタは、gexitがGLとELのどちらに戻るべきかを示します。

#define SYS_TPIDR_GL1 sys_reg(3, 6, 15, 10, 1)
#define SYS_VBAR_GL1 sys_reg(3, 6, 15, 10, 2)
#define SYS_SPSR_GL1 sys_reg(3, 6, 15, 10, 3)
#define SYS_ASPSR_GL1 sys_reg(3, 6, 15, 10, 4)
#define SYS_ESR_GL1 sys_reg(3, 6, 15, 10, 5)
#define SYS_ELR_GL1 sys_reg(3, 6, 15, 10, 6)
#define SYS_FAR_GL1 sys_reg(3, 6, 15, 10, 7)

SPRR

SPRRはページテーブルエントリからパーミッションビットを取り出し 属性インデックスに変換します。MAIRが動作する様子と類似:

   3      2      1     0
 AP[1]  AP[0]   UXN   PXN

UXN と PXN は APRR と比較して反転していることに注意してください。

これはそれぞれのエントリが4ビット持つシステムレジスターへのインデックスとして使われます:

    3     2     1     0
  GL[1] GL[0] EL[1] EL[0]

GL/ELはほぼ別々に扱うことができますが、2つの例外があり、特定のGLパーミッションによって 2つの例外があり、特定のGLパーミッションが2つのELビットの通常の意味を変更します。

レジスタ値 EL page permissions GL page permissions
0000 --- ---
0001 r-x ---
0010 r-- ---
0011 rw- ---
0100 --- r-x
0101 r-x r-x
0110 r-- r-x
0111 --- r-x
1000 --- r--
1001 --x r--
1010 r-- r--
1011 rw- r--
1100 --- rw-
1101 r-x rw-
1110 r-- rw-
1111 rw- rw-

これらの4ビットはELモードやGLモードで動作しているときの実際のパーミッションを示しています。 EL0とEL1はパーミッションが分離されるように別々のレジスタを持っています。

S3_6_C15_C1_0 / SPRR_CONFIG_EL1のビット1は、SPRRと新しいシステムレジスターへのアクセスを有効にします。

S3_6_C15_1_5はEL0用、S3_6_C15_1_6はEL1/GL1用のパーミッション・レジスタです。

#define SYS_SPRR_CONFIG_EL1       sys_reg(3, 6, 15, 1, 0)
#define SPRR_CONFIG_EN            BIT(0)
#define SPRR_CONFIG_LOCK_CONFIG   BIT(1)
#define SPRR_CONFIG_LOCK_PERM_EL0 BIT(4)
#define SPRR_CONFIG_LOCK_PERM_EL1 BIT(5)

#define SYS_SPRR_PERM_EL0 sys_reg(3, 6, 15, 1, 5)
#define SYS_SPRR_PERM_EL1 sys_reg(3, 6, 15, 1, 6)