powerpc/8xx: Prepare handlers for _PAGE_HUGE for 512k pages.
Prepare ITLB handler to handle _PAGE_HUGE when CONFIG_HUGETLBFS is enabled. This means that the L1 entry has to be kept in r11 until L2 entry is read, in order to insert _PAGE_HUGE into it. Also move pgd_offset helpers before pte_update() as they will be needed there in next patch. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/21fd1de8fba781bededa9474a5a9374aefb1f849.1589866984.git.christophe.leroy@csgroup.eu
This commit is contained in:
Родитель
d3efcd38c0
Коммит
a891c43b97
|
@ -206,6 +206,12 @@ static inline void pmd_clear(pmd_t *pmdp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* to find an entry in a kernel page-table-directory */
|
||||||
|
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
|
||||||
|
|
||||||
|
/* to find an entry in a page-table-directory */
|
||||||
|
#define pgd_index(address) ((address) >> PGDIR_SHIFT)
|
||||||
|
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PTE updates. This function is called whenever an existing
|
* PTE updates. This function is called whenever an existing
|
||||||
|
@ -348,13 +354,6 @@ static inline int pte_young(pte_t pte)
|
||||||
pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
|
pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* to find an entry in a kernel page-table-directory */
|
|
||||||
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
|
|
||||||
|
|
||||||
/* to find an entry in a page-table-directory */
|
|
||||||
#define pgd_index(address) ((address) >> PGDIR_SHIFT)
|
|
||||||
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
|
|
||||||
|
|
||||||
/* Find an entry in the third-level page table.. */
|
/* Find an entry in the third-level page table.. */
|
||||||
#define pte_index(address) \
|
#define pte_index(address) \
|
||||||
(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
||||||
|
|
|
@ -196,7 +196,7 @@ SystemCall:
|
||||||
|
|
||||||
InstructionTLBMiss:
|
InstructionTLBMiss:
|
||||||
mtspr SPRN_SPRG_SCRATCH0, r10
|
mtspr SPRN_SPRG_SCRATCH0, r10
|
||||||
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_SWAP)
|
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_SWAP) || defined(CONFIG_HUGETLBFS)
|
||||||
mtspr SPRN_SPRG_SCRATCH1, r11
|
mtspr SPRN_SPRG_SCRATCH1, r11
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -235,16 +235,19 @@ InstructionTLBMiss:
|
||||||
rlwinm r10, r10, 0, 20, 31
|
rlwinm r10, r10, 0, 20, 31
|
||||||
oris r10, r10, (swapper_pg_dir - PAGE_OFFSET)@ha
|
oris r10, r10, (swapper_pg_dir - PAGE_OFFSET)@ha
|
||||||
3:
|
3:
|
||||||
#endif
|
|
||||||
lwz r10, (swapper_pg_dir-PAGE_OFFSET)@l(r10) /* Get level 1 entry */
|
|
||||||
mtspr SPRN_MI_TWC, r10 /* Set segment attributes */
|
|
||||||
|
|
||||||
mtspr SPRN_MD_TWC, r10
|
|
||||||
mfspr r10, SPRN_MD_TWC
|
|
||||||
lwz r10, 0(r10) /* Get the pte */
|
|
||||||
#ifdef ITLB_MISS_KERNEL
|
|
||||||
mtcr r11
|
mtcr r11
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_HUGETLBFS
|
||||||
|
lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r10) /* Get level 1 entry */
|
||||||
|
mtspr SPRN_MI_TWC, r11 /* Set segment attributes */
|
||||||
|
mtspr SPRN_MD_TWC, r11
|
||||||
|
#else
|
||||||
|
lwz r10, (swapper_pg_dir-PAGE_OFFSET)@l(r10) /* Get level 1 entry */
|
||||||
|
mtspr SPRN_MI_TWC, r10 /* Set segment attributes */
|
||||||
|
mtspr SPRN_MD_TWC, r10
|
||||||
|
#endif
|
||||||
|
mfspr r10, SPRN_MD_TWC
|
||||||
|
lwz r10, 0(r10) /* Get the pte */
|
||||||
#ifdef CONFIG_SWAP
|
#ifdef CONFIG_SWAP
|
||||||
rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
||||||
and r11, r11, r10
|
and r11, r11, r10
|
||||||
|
@ -263,7 +266,7 @@ InstructionTLBMiss:
|
||||||
|
|
||||||
/* Restore registers */
|
/* Restore registers */
|
||||||
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
0: mfspr r10, SPRN_SPRG_SCRATCH0
|
||||||
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_SWAP)
|
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_SWAP) || defined(CONFIG_HUGETLBFS)
|
||||||
mfspr r11, SPRN_SPRG_SCRATCH1
|
mfspr r11, SPRN_SPRG_SCRATCH1
|
||||||
#endif
|
#endif
|
||||||
rfi
|
rfi
|
||||||
|
|
Загрузка…
Ссылка в новой задаче