linux-4.4.1/cpu_v7_set_pte_ext()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#j78e2739]
#backlinks
*説明 [#o202c748]
-パス: 複数あり
--CONFIG_ARM_LPAE 無効: [[linux-4.4.1/arch/arm/mm/proc-v7...
--CONFIG_ARM_LPAE 有効: [[linux-4.4.1/arch/arm/mm/proc-v7...
--[[linux-4.4.1/CONFIG_ARM_LPAE]]
-FIXME: これは何?
--ARM のコードは L_PTE_MT_ シリーズのマクロを使って、pte_...
**引数 [#sa43dcc7]
-ptep
--
-pte
--
**返り値 [#qe3bdba6]
-
--
**参考 [#wab5af0c]
L_PTE_MT_ シリーズの実装。
arch/arm/include/asm/pgtable-2level.h:
#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0x00) << ...
#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 0x01) << ...
#define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 0x02) << ...
#define L_PTE_MT_WRITEBACK (_AT(pteval_t, 0x03) << ...
#define L_PTE_MT_MINICACHE (_AT(pteval_t, 0x06) << ...
#define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 0x07) << ...
#define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 0x04) << ...
#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << ...
#define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << ...
#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << ...
#define L_PTE_MT_VECTORS (_AT(pteval_t, 0x0f) << ...
#define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2)
arch/arm/include/asm/pgtable-3level.h:
#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0) << 2) ...
#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 1) << 2) ...
#define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 2) << 2) ...
#define L_PTE_MT_WRITEBACK (_AT(pteval_t, 3) << 2) ...
#define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 7) << 2) ...
#define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 4) << 2) ...
#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 4) << 2) ...
#define L_PTE_MT_DEV_WC (_AT(pteval_t, 1) << 2) ...
#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 3) << 2) ...
#define L_PTE_MT_MASK (_AT(pteval_t, 7) << 2)
*実装 [#td122eaa]
**CONFIG_ARM_LPAE 無効: arch/arm/mm/proc-v7-2level.S [#o4...
/*
* cpu_v7_set_pte_ext(ptep, pte)
*
* Set a level 2 translation table entry.
*
* - ptep - pointer to level 2 translation table e...
* (hardware version is stored at +2048 b...
* - pte - PTE value to store
* - ext - value for extended PTE bits
*/
ENTRY(cpu_v7_set_pte_ext)
#ifdef CONFIG_MMU
-
--[[linux-4.4.1/ENTRY()]]
--[[linux-4.4.1/CONFIG_MMU]]
str r1, [r0] @ linux ...
bic r3, r1, #0x000003f0
bic r3, r3, #PTE_TYPE_MASK
orr r3, r3, r2
orr r3, r3, #PTE_EXT_AP0 | 2
-ptep が指す pte_t の値を r1 と r3 に入れて、r3 の値は下...
--r3 のビット 4~9(AP[0:1], TEX[0:2], AP[2])をクリアす...
--r3 のビット 0, 1(ARM のページテーブル第2レベル記述子の...
--r3 と引数 ext のビット毎 OR を取って、r3 に入れる。
--r3 の AP[0] を 1 に、bit1(スモールページの意味)を 1 ...
-PTE_EXT_ 系のビット位置
--PTE_TYPE_MASK: bit0:1, XN と bit1(特に名前がない)
--PTE_EXT_AP0: bit4, AP[0]
tst r1, #1 << 4
orrne r3, r3, #PTE_EXT_TEX(1)
-L_PTE_MT_ シリーズ(ビット 2~5 を占めている)のビット 1...
-PTE_EXT_ 系のビット位置
--PTE_EXT_TEX(1): bit6
eor r1, r1, #L_PTE_DIRTY
tst r1, #L_PTE_RDONLY | L_PTE_DIRTY
orrne r3, r3, #PTE_EXT_APX
tst r1, #L_PTE_USER
orrne r3, r3, #PTE_EXT_AP1
-!RDONLY && DIRTY なら r3 の AP[2] を 0、それ以外は 1 に...
-USER を r3 の AP[1] にコピーする。
-AP[0] は必ず 1(上の解説参照)なので、ここで AP[2:0] が...
-L_PTE_ 系のビット位置
--L_PTE_DIRTY : bit6(2level), bit55(3level)
--L_PTE_RDONLY: bit7(2level), bit58(3level)
--L_PTE_USER : bit8(2level), bit6(3level)
-PTE_EXT_ 系のビット位置
--PTE_EXT_APX: bit9, AP[2]
--PTE_EXT_AP1: bit5, AP[1]
-こう設定するので、
|RDONLY|DIRTY|xor DIRTY|AP[2] 結果|
|0 |0 |1 |1 |
|0 |1 |0 |0 |
|1 |0 |1 |1 |
|1 |1 |0 |1 |
|USER |AP[1] 結果|
|0 |0 |
|1 |1 |
-最終的にはこうなる。
|USER |RDONLY|DIRTY|AP[2:0] 結果|特権 R|特権 W|ユーザ R|...
|0 |0 |0 |101 |Yes |No |No |...
|0 |0 |1 |001 |Yes |Yes |No |...
|0 |1 |0 |101 |Yes |No |No |...
|0 |1 |1 |101 |Yes |No |No |...
|1 |0 |0 |111 |Yes |No |Yes |...
|1 |0 |1 |011 |Yes |Yes |Yes |...
|1 |1 |0 |111 |Yes |No |Yes |...
|1 |1 |1 |111 |Yes |No |Yes |...
tst r1, #L_PTE_XN
orrne r3, r3, #PTE_EXT_XN
-XN ビットを r3 の XN にコピー。
-L_PTE_ 系のビット位置
--L_PTE_XN: bit9(2level), bit54(3level)
-PTE_EXT_ 系のビット位置
--PTE_EXT_XN: bit0, XN
tst r1, #L_PTE_YOUNG
tstne r1, #L_PTE_VALID
eorne r1, r1, #L_PTE_NONE
tstne r1, #L_PTE_NONE
moveq r3, #0
-YOUNG かつ VALID なのに NONE がセットされていたら、r3 を...
-L_PTE_ 系のビット位置
--L_PTE_YOUNG: bit1(2level), bit10(3level)
--L_PTE_VALID: bit0(2level), bit0(3level)
--L_PTE_NONE : bit11(2level), bit57(3level)
ARM( str r3, [r0, #2048]! )
THUMB( add r0, r0, #2048 )
THUMB( str r3, [r0] )
-FIXME: なんで 2048足すの??
-
--[[linux-4.4.1/ARM()]]
--[[linux-4.4.1/THUMB()]]
ALT_SMP(W(nop))
ALT_UP (mcr p15, 0, r0, c7, c10, 1) ...
-
--[[linux-4.4.1/ALT_SMP()]]
--[[linux-4.4.1/W()]]
--[[linux-4.4.1/ALT_UP()]]
#endif
bx lr
ENDPROC(cpu_v7_set_pte_ext)
-
--[[linux-4.4.1/ENDPROC()]]
**CONFIG_ARM_LPAE 有効: arch/arm/mm/proc-v7-3level.S [#c9...
/*
* cpu_v7_set_pte_ext(ptep, pte)
*
* Set a level 2 translation table entry.
* - ptep - pointer to level 3 translation table entry
* - pte - PTE value to store (64-bit in r2 and r3)
*/
ENTRY(cpu_v7_set_pte_ext)
#ifdef CONFIG_MMU
tst rl, #L_PTE_VALID
beq 1f
tst rh, #1 << (57 - 32) @ L_PTE_...
bicne rl, #L_PTE_VALID
bne 1f
eor ip, rh, #1 << (55 - 32) @ toggle L_PTE_D...
@ test for !L_PT...
tst ip, #1 << (55 - 32) | 1 << (58 - 32)
orrne rl, #PTE_AP2
biceq rl, #PTE_AP2
1: strd r2, r3, [r0]
ALT_SMP(W(nop))
ALT_UP (mcr p15, 0, r0, c7, c10, 1) ...
#endif
ret lr
ENDPROC(cpu_v7_set_pte_ext)
*コメント [#n3bd63a0]
終了行:
*参照元 [#j78e2739]
#backlinks
*説明 [#o202c748]
-パス: 複数あり
--CONFIG_ARM_LPAE 無効: [[linux-4.4.1/arch/arm/mm/proc-v7...
--CONFIG_ARM_LPAE 有効: [[linux-4.4.1/arch/arm/mm/proc-v7...
--[[linux-4.4.1/CONFIG_ARM_LPAE]]
-FIXME: これは何?
--ARM のコードは L_PTE_MT_ シリーズのマクロを使って、pte_...
**引数 [#sa43dcc7]
-ptep
--
-pte
--
**返り値 [#qe3bdba6]
-
--
**参考 [#wab5af0c]
L_PTE_MT_ シリーズの実装。
arch/arm/include/asm/pgtable-2level.h:
#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0x00) << ...
#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 0x01) << ...
#define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 0x02) << ...
#define L_PTE_MT_WRITEBACK (_AT(pteval_t, 0x03) << ...
#define L_PTE_MT_MINICACHE (_AT(pteval_t, 0x06) << ...
#define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 0x07) << ...
#define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 0x04) << ...
#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << ...
#define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << ...
#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << ...
#define L_PTE_MT_VECTORS (_AT(pteval_t, 0x0f) << ...
#define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2)
arch/arm/include/asm/pgtable-3level.h:
#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0) << 2) ...
#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 1) << 2) ...
#define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 2) << 2) ...
#define L_PTE_MT_WRITEBACK (_AT(pteval_t, 3) << 2) ...
#define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 7) << 2) ...
#define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 4) << 2) ...
#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 4) << 2) ...
#define L_PTE_MT_DEV_WC (_AT(pteval_t, 1) << 2) ...
#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 3) << 2) ...
#define L_PTE_MT_MASK (_AT(pteval_t, 7) << 2)
*実装 [#td122eaa]
**CONFIG_ARM_LPAE 無効: arch/arm/mm/proc-v7-2level.S [#o4...
/*
* cpu_v7_set_pte_ext(ptep, pte)
*
* Set a level 2 translation table entry.
*
* - ptep - pointer to level 2 translation table e...
* (hardware version is stored at +2048 b...
* - pte - PTE value to store
* - ext - value for extended PTE bits
*/
ENTRY(cpu_v7_set_pte_ext)
#ifdef CONFIG_MMU
-
--[[linux-4.4.1/ENTRY()]]
--[[linux-4.4.1/CONFIG_MMU]]
str r1, [r0] @ linux ...
bic r3, r1, #0x000003f0
bic r3, r3, #PTE_TYPE_MASK
orr r3, r3, r2
orr r3, r3, #PTE_EXT_AP0 | 2
-ptep が指す pte_t の値を r1 と r3 に入れて、r3 の値は下...
--r3 のビット 4~9(AP[0:1], TEX[0:2], AP[2])をクリアす...
--r3 のビット 0, 1(ARM のページテーブル第2レベル記述子の...
--r3 と引数 ext のビット毎 OR を取って、r3 に入れる。
--r3 の AP[0] を 1 に、bit1(スモールページの意味)を 1 ...
-PTE_EXT_ 系のビット位置
--PTE_TYPE_MASK: bit0:1, XN と bit1(特に名前がない)
--PTE_EXT_AP0: bit4, AP[0]
tst r1, #1 << 4
orrne r3, r3, #PTE_EXT_TEX(1)
-L_PTE_MT_ シリーズ(ビット 2~5 を占めている)のビット 1...
-PTE_EXT_ 系のビット位置
--PTE_EXT_TEX(1): bit6
eor r1, r1, #L_PTE_DIRTY
tst r1, #L_PTE_RDONLY | L_PTE_DIRTY
orrne r3, r3, #PTE_EXT_APX
tst r1, #L_PTE_USER
orrne r3, r3, #PTE_EXT_AP1
-!RDONLY && DIRTY なら r3 の AP[2] を 0、それ以外は 1 に...
-USER を r3 の AP[1] にコピーする。
-AP[0] は必ず 1(上の解説参照)なので、ここで AP[2:0] が...
-L_PTE_ 系のビット位置
--L_PTE_DIRTY : bit6(2level), bit55(3level)
--L_PTE_RDONLY: bit7(2level), bit58(3level)
--L_PTE_USER : bit8(2level), bit6(3level)
-PTE_EXT_ 系のビット位置
--PTE_EXT_APX: bit9, AP[2]
--PTE_EXT_AP1: bit5, AP[1]
-こう設定するので、
|RDONLY|DIRTY|xor DIRTY|AP[2] 結果|
|0 |0 |1 |1 |
|0 |1 |0 |0 |
|1 |0 |1 |1 |
|1 |1 |0 |1 |
|USER |AP[1] 結果|
|0 |0 |
|1 |1 |
-最終的にはこうなる。
|USER |RDONLY|DIRTY|AP[2:0] 結果|特権 R|特権 W|ユーザ R|...
|0 |0 |0 |101 |Yes |No |No |...
|0 |0 |1 |001 |Yes |Yes |No |...
|0 |1 |0 |101 |Yes |No |No |...
|0 |1 |1 |101 |Yes |No |No |...
|1 |0 |0 |111 |Yes |No |Yes |...
|1 |0 |1 |011 |Yes |Yes |Yes |...
|1 |1 |0 |111 |Yes |No |Yes |...
|1 |1 |1 |111 |Yes |No |Yes |...
tst r1, #L_PTE_XN
orrne r3, r3, #PTE_EXT_XN
-XN ビットを r3 の XN にコピー。
-L_PTE_ 系のビット位置
--L_PTE_XN: bit9(2level), bit54(3level)
-PTE_EXT_ 系のビット位置
--PTE_EXT_XN: bit0, XN
tst r1, #L_PTE_YOUNG
tstne r1, #L_PTE_VALID
eorne r1, r1, #L_PTE_NONE
tstne r1, #L_PTE_NONE
moveq r3, #0
-YOUNG かつ VALID なのに NONE がセットされていたら、r3 を...
-L_PTE_ 系のビット位置
--L_PTE_YOUNG: bit1(2level), bit10(3level)
--L_PTE_VALID: bit0(2level), bit0(3level)
--L_PTE_NONE : bit11(2level), bit57(3level)
ARM( str r3, [r0, #2048]! )
THUMB( add r0, r0, #2048 )
THUMB( str r3, [r0] )
-FIXME: なんで 2048足すの??
-
--[[linux-4.4.1/ARM()]]
--[[linux-4.4.1/THUMB()]]
ALT_SMP(W(nop))
ALT_UP (mcr p15, 0, r0, c7, c10, 1) ...
-
--[[linux-4.4.1/ALT_SMP()]]
--[[linux-4.4.1/W()]]
--[[linux-4.4.1/ALT_UP()]]
#endif
bx lr
ENDPROC(cpu_v7_set_pte_ext)
-
--[[linux-4.4.1/ENDPROC()]]
**CONFIG_ARM_LPAE 有効: arch/arm/mm/proc-v7-3level.S [#c9...
/*
* cpu_v7_set_pte_ext(ptep, pte)
*
* Set a level 2 translation table entry.
* - ptep - pointer to level 3 translation table entry
* - pte - PTE value to store (64-bit in r2 and r3)
*/
ENTRY(cpu_v7_set_pte_ext)
#ifdef CONFIG_MMU
tst rl, #L_PTE_VALID
beq 1f
tst rh, #1 << (57 - 32) @ L_PTE_...
bicne rl, #L_PTE_VALID
bne 1f
eor ip, rh, #1 << (55 - 32) @ toggle L_PTE_D...
@ test for !L_PT...
tst ip, #1 << (55 - 32) | 1 << (58 - 32)
orrne rl, #PTE_AP2
biceq rl, #PTE_AP2
1: strd r2, r3, [r0]
ALT_SMP(W(nop))
ALT_UP (mcr p15, 0, r0, c7, c10, 1) ...
#endif
ret lr
ENDPROC(cpu_v7_set_pte_ext)
*コメント [#n3bd63a0]
ページ名: