powerpc: Define swapper_pg_dir[] in C
Don't duplicate swapper_pg_dir[] in each platform's head.S Define it in mm/pgtable.c Define MAX_PTRS_PER_PGD because on book3s/64 PTRS_PER_PGD is not a constant. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/5e3f1b8a4695c33ccc80aa3870e016bef32b85e1.1623063174.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
45b30fafe5
commit
e72421a085
@ -232,6 +232,9 @@ extern unsigned long __pmd_frag_size_shift;
|
|||||||
#define PTRS_PER_PUD (1 << PUD_INDEX_SIZE)
|
#define PTRS_PER_PUD (1 << PUD_INDEX_SIZE)
|
||||||
#define PTRS_PER_PGD (1 << PGD_INDEX_SIZE)
|
#define PTRS_PER_PGD (1 << PGD_INDEX_SIZE)
|
||||||
|
|
||||||
|
#define MAX_PTRS_PER_PGD (1 << (H_PGD_INDEX_SIZE > RADIX_PGD_INDEX_SIZE ? \
|
||||||
|
H_PGD_INDEX_SIZE : RADIX_PGD_INDEX_SIZE))
|
||||||
|
|
||||||
/* PMD_SHIFT determines what a second-level page table entry can map */
|
/* PMD_SHIFT determines what a second-level page table entry can map */
|
||||||
#define PMD_SHIFT (PAGE_SHIFT + PTE_INDEX_SIZE)
|
#define PMD_SHIFT (PAGE_SHIFT + PTE_INDEX_SIZE)
|
||||||
#define PMD_SIZE (1UL << PMD_SHIFT)
|
#define PMD_SIZE (1UL << PMD_SHIFT)
|
||||||
|
@ -41,6 +41,10 @@ struct mm_struct;
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#ifndef MAX_PTRS_PER_PGD
|
||||||
|
#define MAX_PTRS_PER_PGD PTRS_PER_PGD
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Keep these as a macros to avoid include dependency mess */
|
/* Keep these as a macros to avoid include dependency mess */
|
||||||
#define pte_page(x) pfn_to_page(pte_pfn(x))
|
#define pte_page(x) pfn_to_page(pte_pfn(x))
|
||||||
#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
|
#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
|
||||||
|
@ -354,11 +354,6 @@ int main(void)
|
|||||||
DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry));
|
DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
|
||||||
DEFINE(PGD_TABLE_SIZE, (sizeof(pgd_t) << max(RADIX_PGD_INDEX_SIZE, H_PGD_INDEX_SIZE)));
|
|
||||||
#else
|
|
||||||
DEFINE(PGD_TABLE_SIZE, PGD_TABLE_SIZE);
|
|
||||||
#endif
|
|
||||||
DEFINE(PTE_SIZE, sizeof(pte_t));
|
DEFINE(PTE_SIZE, sizeof(pte_t));
|
||||||
|
|
||||||
#ifdef CONFIG_KVM
|
#ifdef CONFIG_KVM
|
||||||
|
@ -701,14 +701,3 @@ _GLOBAL(abort)
|
|||||||
mfspr r13,SPRN_DBCR0
|
mfspr r13,SPRN_DBCR0
|
||||||
oris r13,r13,DBCR0_RST_SYSTEM@h
|
oris r13,r13,DBCR0_RST_SYSTEM@h
|
||||||
mtspr SPRN_DBCR0,r13
|
mtspr SPRN_DBCR0,r13
|
||||||
|
|
||||||
/* We put a few things here that have to be page-aligned. This stuff
|
|
||||||
* goes at the beginning of the data segment, which is page-aligned.
|
|
||||||
*/
|
|
||||||
.data
|
|
||||||
.align 12
|
|
||||||
.globl sdata
|
|
||||||
sdata:
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
@ -1233,23 +1233,8 @@ head_start_common:
|
|||||||
isync
|
isync
|
||||||
blr
|
blr
|
||||||
|
|
||||||
/*
|
|
||||||
* We put a few things here that have to be page-aligned. This stuff
|
|
||||||
* goes at the beginning of the data segment, which is page-aligned.
|
|
||||||
*/
|
|
||||||
.data
|
|
||||||
.align PAGE_SHIFT
|
|
||||||
.globl sdata
|
|
||||||
sdata:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To support >32-bit physical addresses, we use an 8KB pgdir.
|
|
||||||
*/
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
.data
|
||||||
.align 12
|
.align 12
|
||||||
temp_boot_stack:
|
temp_boot_stack:
|
||||||
.space 1024
|
.space 1024
|
||||||
|
@ -997,18 +997,3 @@ start_here_common:
|
|||||||
0: trap
|
0: trap
|
||||||
EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0
|
EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0
|
||||||
.previous
|
.previous
|
||||||
|
|
||||||
/*
|
|
||||||
* We put a few things here that have to be page-aligned.
|
|
||||||
* This stuff goes at the beginning of the bss, which is page-aligned.
|
|
||||||
*/
|
|
||||||
.section ".bss"
|
|
||||||
/*
|
|
||||||
* pgd dir should be aligned to PGD_TABLE_SIZE which is 64K.
|
|
||||||
* We will need to find a better way to fix this
|
|
||||||
*/
|
|
||||||
.align 16
|
|
||||||
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
@ -786,15 +786,3 @@ _GLOBAL(mmu_pin_tlb)
|
|||||||
mtspr SPRN_SRR1, r10
|
mtspr SPRN_SRR1, r10
|
||||||
mtspr SPRN_SRR0, r11
|
mtspr SPRN_SRR0, r11
|
||||||
rfi
|
rfi
|
||||||
|
|
||||||
/*
|
|
||||||
* We put a few things here that have to be page-aligned.
|
|
||||||
* This stuff goes at the beginning of the data segment,
|
|
||||||
* which is page-aligned.
|
|
||||||
*/
|
|
||||||
.data
|
|
||||||
.globl sdata
|
|
||||||
sdata:
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
@ -1208,14 +1208,4 @@ setup_usbgecko_bat:
|
|||||||
blr
|
blr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* We put a few things here that have to be page-aligned.
|
|
||||||
* This stuff goes at the beginning of the data segment,
|
|
||||||
* which is page-aligned.
|
|
||||||
*/
|
|
||||||
.data
|
.data
|
||||||
.globl sdata
|
|
||||||
sdata:
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
@ -1212,15 +1212,3 @@ _GLOBAL(restore_to_as0)
|
|||||||
*/
|
*/
|
||||||
3: mr r3,r5
|
3: mr r3,r5
|
||||||
bl _start
|
bl _start
|
||||||
|
|
||||||
/*
|
|
||||||
* We put a few things here that have to be page-aligned. This stuff
|
|
||||||
* goes at the beginning of the data segment, which is page-aligned.
|
|
||||||
*/
|
|
||||||
.data
|
|
||||||
.align 12
|
|
||||||
.globl sdata
|
|
||||||
sdata:
|
|
||||||
.globl swapper_pg_dir
|
|
||||||
swapper_pg_dir:
|
|
||||||
.space PGD_TABLE_SIZE
|
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <asm/hugetlb.h>
|
#include <asm/hugetlb.h>
|
||||||
#include <asm/pte-walk.h>
|
#include <asm/pte-walk.h>
|
||||||
|
|
||||||
|
pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __page_aligned_bss;
|
||||||
|
|
||||||
static inline int is_exec_fault(void)
|
static inline int is_exec_fault(void)
|
||||||
{
|
{
|
||||||
return current->thread.regs && TRAP(current->thread.regs) == 0x400;
|
return current->thread.regs && TRAP(current->thread.regs) == 0x400;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user