* [PATCH 1/3] powerpc: Define empty_zero_page[] in C @ 2021-06-07 10:56 Christophe Leroy 2021-06-07 10:56 ` [PATCH 2/3] powerpc: Define swapper_pg_dir[] " Christophe Leroy ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Christophe Leroy @ 2021-06-07 10:56 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel At the time being, empty_zero_page[] is defined in each platform head.S. Define it in mm/mem.c instead, and put it in BSS section instead of the DATA section. Commit 5227cfa71f9e ("arm64: mm: place empty_zero_page in bss") explains why it is interesting to have it in BSS. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- Applies on top of powerpc next-test with the Fixup for v3 "powerpc/nohash: Refactor update of BDI2000 pointers in switch_mmu_context()". The last patch of this small series can be applied independently at the cost of a trivial conflict in asm-offsets.c arch/powerpc/kernel/head_40x.S | 4 ---- arch/powerpc/kernel/head_44x.S | 4 ---- arch/powerpc/kernel/head_64.S | 5 ----- arch/powerpc/kernel/head_8xx.S | 6 ------ arch/powerpc/kernel/head_book3s_32.S | 5 ----- arch/powerpc/kernel/head_fsl_booke.S | 4 ---- arch/powerpc/mm/mem.c | 3 +++ 7 files changed, 3 insertions(+), 28 deletions(-) diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index 2717aa860cae..92b6c7356161 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S @@ -709,10 +709,6 @@ _GLOBAL(abort) .align 12 .globl sdata sdata: - .globl empty_zero_page -empty_zero_page: - .space 4096 -EXPORT_SYMBOL(empty_zero_page) .globl swapper_pg_dir swapper_pg_dir: .space PGD_TABLE_SIZE diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 2c4ffec027a2..e037eb615757 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S @@ -1241,10 +1241,6 @@ head_start_common: .align PAGE_SHIFT .globl sdata sdata: - .globl empty_zero_page -empty_zero_page: - .space PAGE_SIZE -EXPORT_SYMBOL(empty_zero_page) /* * To support >32-bit physical addresses, we use an 8KB pgdir. diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index ece7f97bafff..730838c7ca39 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -1012,8 +1012,3 @@ start_here_common: .globl swapper_pg_dir swapper_pg_dir: .space PGD_TABLE_SIZE - - .globl empty_zero_page -empty_zero_page: - .space PAGE_SIZE -EXPORT_SYMBOL(empty_zero_page) diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 817df9fe7fb3..5ce42dfac061 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -795,12 +795,6 @@ _GLOBAL(mmu_pin_tlb) .data .globl sdata sdata: - .globl empty_zero_page - .align PAGE_SHIFT -empty_zero_page: - .space PAGE_SIZE -EXPORT_SYMBOL(empty_zero_page) - .globl swapper_pg_dir swapper_pg_dir: .space PGD_TABLE_SIZE diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 326262030279..79c744afc6b6 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -1274,11 +1274,6 @@ setup_usbgecko_bat: .data .globl sdata sdata: - .globl empty_zero_page -empty_zero_page: - .space 4096 -EXPORT_SYMBOL(empty_zero_page) - .globl swapper_pg_dir swapper_pg_dir: .space PGD_TABLE_SIZE diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index ab718fd5e2a2..f33bc5a8e73e 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S @@ -1221,10 +1221,6 @@ _GLOBAL(restore_to_as0) .align 12 .globl sdata sdata: - .globl empty_zero_page -empty_zero_page: - .space 4096 -EXPORT_SYMBOL(empty_zero_page) .globl swapper_pg_dir swapper_pg_dir: .space PGD_TABLE_SIZE diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 043bbeaf407c..b06e5d969051 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -27,6 +27,9 @@ unsigned long long memory_limit; bool init_mem_is_free; +unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss; +EXPORT_SYMBOL(empty_zero_page); + pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, unsigned long size, pgprot_t vma_prot) { -- 2.25.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] powerpc: Define swapper_pg_dir[] in C 2021-06-07 10:56 [PATCH 1/3] powerpc: Define empty_zero_page[] in C Christophe Leroy @ 2021-06-07 10:56 ` Christophe Leroy 2021-06-23 11:53 ` Daniel Axtens 2021-06-07 10:56 ` [PATCH 3/3] powerpc/32s: Rename PTE_SIZE to PTE_T_SIZE Christophe Leroy 2021-06-18 3:51 ` [PATCH 1/3] powerpc: Define empty_zero_page[] in C Michael Ellerman 2 siblings, 1 reply; 7+ messages in thread From: Christophe Leroy @ 2021-06-07 10:56 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel 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> --- arch/powerpc/include/asm/book3s/64/pgtable.h | 3 +++ arch/powerpc/include/asm/pgtable.h | 4 ++++ arch/powerpc/kernel/asm-offsets.c | 5 ----- arch/powerpc/kernel/head_40x.S | 11 ----------- arch/powerpc/kernel/head_44x.S | 17 +---------------- arch/powerpc/kernel/head_64.S | 15 --------------- arch/powerpc/kernel/head_8xx.S | 12 ------------ arch/powerpc/kernel/head_book3s_32.S | 11 ----------- arch/powerpc/kernel/head_fsl_booke.S | 12 ------------ arch/powerpc/mm/pgtable.c | 2 ++ 10 files changed, 10 insertions(+), 82 deletions(-) diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h index a666d561b44d..4d9941b2fe51 100644 --- a/arch/powerpc/include/asm/book3s/64/pgtable.h +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -232,6 +232,9 @@ extern unsigned long __pmd_frag_size_shift; #define PTRS_PER_PUD (1 << PUD_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 */ #define PMD_SHIFT (PAGE_SHIFT + PTE_INDEX_SIZE) #define PMD_SIZE (1UL << PMD_SHIFT) diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index c6a676714f04..b9c8641654f4 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h @@ -41,6 +41,10 @@ struct mm_struct; #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 */ #define pte_page(x) pfn_to_page(pte_pfn(x)) #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 0480f4006e0c..f1b6ff14c8a0 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c @@ -361,11 +361,6 @@ int main(void) DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry)); #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)); #ifdef CONFIG_KVM diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index 92b6c7356161..7d72ee5ab387 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S @@ -701,14 +701,3 @@ _GLOBAL(abort) mfspr r13,SPRN_DBCR0 oris r13,r13,DBCR0_RST_SYSTEM@h 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 diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index e037eb615757..ddc978a2d381 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S @@ -1233,23 +1233,8 @@ head_start_common: isync 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 + .data .align 12 temp_boot_stack: .space 1024 diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 730838c7ca39..79f2d1e61abd 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -997,18 +997,3 @@ start_here_common: 0: trap EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0 .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 diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 5ce42dfac061..9bdb95f5694f 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -786,15 +786,3 @@ _GLOBAL(mmu_pin_tlb) mtspr SPRN_SRR1, r10 mtspr SPRN_SRR0, r11 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 diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 79c744afc6b6..689c9d37f193 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -1266,18 +1266,7 @@ setup_usbgecko_bat: blr #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 - .globl sdata -sdata: - .globl swapper_pg_dir -swapper_pg_dir: - .space PGD_TABLE_SIZE - /* Room for two PTE pointers, usually the kernel and current user pointers * to their respective root page table. */ diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index f33bc5a8e73e..0f9642f36b49 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S @@ -1212,15 +1212,3 @@ _GLOBAL(restore_to_as0) */ 3: mr r3,r5 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 diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 354611940118..1707ab580ee2 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -28,6 +28,8 @@ #include <asm/hugetlb.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) { return current->thread.regs && TRAP(current->thread.regs) == 0x400; -- 2.25.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc: Define swapper_pg_dir[] in C 2021-06-07 10:56 ` [PATCH 2/3] powerpc: Define swapper_pg_dir[] " Christophe Leroy @ 2021-06-23 11:53 ` Daniel Axtens 2021-06-23 12:38 ` Michael Ellerman 0 siblings, 1 reply; 7+ messages in thread From: Daniel Axtens @ 2021-06-23 11:53 UTC (permalink / raw) To: Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel Hi Christophe, This breaks booting a radix KVM guest with 4k pages for me: make pseries_le_defconfig scripts/config -d CONFIG_PPC_64K_PAGES scripts/config -e CONFIG_PPC_4K_PAGES make vmlinux sudo qemu-system-ppc64 -enable-kvm -M pseries -m 1G -nographic -vga none -smp 4 -cpu host -kernel vmlinux Boot hangs after printing 'Booting Linux via __start()' and qemu's 'info registers' reports that it's stuck at the instruction fetch exception. My host is Power9, 64k page size radix, and gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34 Kind regards, Daniel > 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> > --- > arch/powerpc/include/asm/book3s/64/pgtable.h | 3 +++ > arch/powerpc/include/asm/pgtable.h | 4 ++++ > arch/powerpc/kernel/asm-offsets.c | 5 ----- > arch/powerpc/kernel/head_40x.S | 11 ----------- > arch/powerpc/kernel/head_44x.S | 17 +---------------- > arch/powerpc/kernel/head_64.S | 15 --------------- > arch/powerpc/kernel/head_8xx.S | 12 ------------ > arch/powerpc/kernel/head_book3s_32.S | 11 ----------- > arch/powerpc/kernel/head_fsl_booke.S | 12 ------------ > arch/powerpc/mm/pgtable.c | 2 ++ > 10 files changed, 10 insertions(+), 82 deletions(-) > > diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h > index a666d561b44d..4d9941b2fe51 100644 > --- a/arch/powerpc/include/asm/book3s/64/pgtable.h > +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h > @@ -232,6 +232,9 @@ extern unsigned long __pmd_frag_size_shift; > #define PTRS_PER_PUD (1 << PUD_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 */ > #define PMD_SHIFT (PAGE_SHIFT + PTE_INDEX_SIZE) > #define PMD_SIZE (1UL << PMD_SHIFT) > diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h > index c6a676714f04..b9c8641654f4 100644 > --- a/arch/powerpc/include/asm/pgtable.h > +++ b/arch/powerpc/include/asm/pgtable.h > @@ -41,6 +41,10 @@ struct mm_struct; > > #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 */ > #define pte_page(x) pfn_to_page(pte_pfn(x)) > #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 0480f4006e0c..f1b6ff14c8a0 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -361,11 +361,6 @@ int main(void) > DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry)); > #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)); > > #ifdef CONFIG_KVM > diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S > index 92b6c7356161..7d72ee5ab387 100644 > --- a/arch/powerpc/kernel/head_40x.S > +++ b/arch/powerpc/kernel/head_40x.S > @@ -701,14 +701,3 @@ _GLOBAL(abort) > mfspr r13,SPRN_DBCR0 > oris r13,r13,DBCR0_RST_SYSTEM@h > 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 > diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S > index e037eb615757..ddc978a2d381 100644 > --- a/arch/powerpc/kernel/head_44x.S > +++ b/arch/powerpc/kernel/head_44x.S > @@ -1233,23 +1233,8 @@ head_start_common: > isync > 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 > + .data > .align 12 > temp_boot_stack: > .space 1024 > diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S > index 730838c7ca39..79f2d1e61abd 100644 > --- a/arch/powerpc/kernel/head_64.S > +++ b/arch/powerpc/kernel/head_64.S > @@ -997,18 +997,3 @@ start_here_common: > 0: trap > EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0 > .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 > diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S > index 5ce42dfac061..9bdb95f5694f 100644 > --- a/arch/powerpc/kernel/head_8xx.S > +++ b/arch/powerpc/kernel/head_8xx.S > @@ -786,15 +786,3 @@ _GLOBAL(mmu_pin_tlb) > mtspr SPRN_SRR1, r10 > mtspr SPRN_SRR0, r11 > 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 > diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S > index 79c744afc6b6..689c9d37f193 100644 > --- a/arch/powerpc/kernel/head_book3s_32.S > +++ b/arch/powerpc/kernel/head_book3s_32.S > @@ -1266,18 +1266,7 @@ setup_usbgecko_bat: > blr > #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 > - .globl sdata > -sdata: > - .globl swapper_pg_dir > -swapper_pg_dir: > - .space PGD_TABLE_SIZE > - > /* Room for two PTE pointers, usually the kernel and current user pointers > * to their respective root page table. > */ > diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S > index f33bc5a8e73e..0f9642f36b49 100644 > --- a/arch/powerpc/kernel/head_fsl_booke.S > +++ b/arch/powerpc/kernel/head_fsl_booke.S > @@ -1212,15 +1212,3 @@ _GLOBAL(restore_to_as0) > */ > 3: mr r3,r5 > 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 > diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c > index 354611940118..1707ab580ee2 100644 > --- a/arch/powerpc/mm/pgtable.c > +++ b/arch/powerpc/mm/pgtable.c > @@ -28,6 +28,8 @@ > #include <asm/hugetlb.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) > { > return current->thread.regs && TRAP(current->thread.regs) == 0x400; > -- > 2.25.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc: Define swapper_pg_dir[] in C 2021-06-23 11:53 ` Daniel Axtens @ 2021-06-23 12:38 ` Michael Ellerman 2021-06-24 2:36 ` Daniel Axtens 0 siblings, 1 reply; 7+ messages in thread From: Michael Ellerman @ 2021-06-23 12:38 UTC (permalink / raw) To: Daniel Axtens, Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras Cc: linuxppc-dev, linux-kernel Daniel Axtens <dja@axtens.net> writes: > Hi Christophe, > > This breaks booting a radix KVM guest with 4k pages for me: > > make pseries_le_defconfig > scripts/config -d CONFIG_PPC_64K_PAGES > scripts/config -e CONFIG_PPC_4K_PAGES > make vmlinux > sudo qemu-system-ppc64 -enable-kvm -M pseries -m 1G -nographic -vga none -smp 4 -cpu host -kernel vmlinux > > Boot hangs after printing 'Booting Linux via __start()' and qemu's 'info > registers' reports that it's stuck at the instruction fetch exception. > > My host is Power9, 64k page size radix, and > gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34 > ... >> diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S >> index 730838c7ca39..79f2d1e61abd 100644 >> --- a/arch/powerpc/kernel/head_64.S >> +++ b/arch/powerpc/kernel/head_64.S >> @@ -997,18 +997,3 @@ start_here_common: >> 0: trap >> EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0 >> .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 This is now 4K aligned whereas it used to be 64K. This fixes it and is not completely ugly? diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 1707ab580ee2..298469beaa90 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -28,7 +28,13 @@ #include <asm/hugetlb.h> #include <asm/pte-walk.h> -pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __page_aligned_bss; +#ifdef CONFIG_PPC64 +#define PGD_ALIGN 0x10000 +#else +#define PGD_ALIGN PAGE_SIZE +#endif + +pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __section(".bss..page_aligned") __aligned(PGD_ALIGN); static inline int is_exec_fault(void) { cheers ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] powerpc: Define swapper_pg_dir[] in C 2021-06-23 12:38 ` Michael Ellerman @ 2021-06-24 2:36 ` Daniel Axtens 0 siblings, 0 replies; 7+ messages in thread From: Daniel Axtens @ 2021-06-24 2:36 UTC (permalink / raw) To: Michael Ellerman, Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras Cc: linuxppc-dev, linux-kernel Michael Ellerman <mpe@ellerman.id.au> writes: > Daniel Axtens <dja@axtens.net> writes: >> Hi Christophe, >> >> This breaks booting a radix KVM guest with 4k pages for me: >> >> make pseries_le_defconfig >> scripts/config -d CONFIG_PPC_64K_PAGES >> scripts/config -e CONFIG_PPC_4K_PAGES >> make vmlinux >> sudo qemu-system-ppc64 -enable-kvm -M pseries -m 1G -nographic -vga none -smp 4 -cpu host -kernel vmlinux >> >> Boot hangs after printing 'Booting Linux via __start()' and qemu's 'info >> registers' reports that it's stuck at the instruction fetch exception. >> >> My host is Power9, 64k page size radix, and >> gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34 >> > > ... >>> diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S >>> index 730838c7ca39..79f2d1e61abd 100644 >>> --- a/arch/powerpc/kernel/head_64.S >>> +++ b/arch/powerpc/kernel/head_64.S >>> @@ -997,18 +997,3 @@ start_here_common: >>> 0: trap >>> EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0 >>> .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 > > This is now 4K aligned whereas it used to be 64K. > > This fixes it and is not completely ugly? > > diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c > index 1707ab580ee2..298469beaa90 100644 > --- a/arch/powerpc/mm/pgtable.c > +++ b/arch/powerpc/mm/pgtable.c > @@ -28,7 +28,13 @@ > #include <asm/hugetlb.h> > #include <asm/pte-walk.h> > > -pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __page_aligned_bss; > +#ifdef CONFIG_PPC64 > +#define PGD_ALIGN 0x10000 > +#else > +#define PGD_ALIGN PAGE_SIZE > +#endif > + > +pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __section(".bss..page_aligned") __aligned(PGD_ALIGN); The fix works for me, thank you. Kind regards, Daniel > > static inline int is_exec_fault(void) > { > > > cheers ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] powerpc/32s: Rename PTE_SIZE to PTE_T_SIZE 2021-06-07 10:56 [PATCH 1/3] powerpc: Define empty_zero_page[] in C Christophe Leroy 2021-06-07 10:56 ` [PATCH 2/3] powerpc: Define swapper_pg_dir[] " Christophe Leroy @ 2021-06-07 10:56 ` Christophe Leroy 2021-06-18 3:51 ` [PATCH 1/3] powerpc: Define empty_zero_page[] in C Michael Ellerman 2 siblings, 0 replies; 7+ messages in thread From: Christophe Leroy @ 2021-06-07 10:56 UTC (permalink / raw) To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Cc: linuxppc-dev, linux-kernel PTE_SIZE means PTE page table size in most placed, whereas in hash_low.S in means size of one entry in the table. Rename it PTE_T_SIZE, and define it directly in hash_low.S instead of going through asm-offsets. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- arch/powerpc/kernel/asm-offsets.c | 2 -- arch/powerpc/mm/book3s32/hash_low.S | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index f1b6ff14c8a0..2bd936ebcae8 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c @@ -361,8 +361,6 @@ int main(void) DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry)); #endif - DEFINE(PTE_SIZE, sizeof(pte_t)); - #ifdef CONFIG_KVM OFFSET(VCPU_HOST_STACK, kvm_vcpu, arch.host_stack); OFFSET(VCPU_HOST_PID, kvm_vcpu, arch.host_pid); diff --git a/arch/powerpc/mm/book3s32/hash_low.S b/arch/powerpc/mm/book3s32/hash_low.S index fb4233a5bdf7..6925ce998557 100644 --- a/arch/powerpc/mm/book3s32/hash_low.S +++ b/arch/powerpc/mm/book3s32/hash_low.S @@ -27,8 +27,10 @@ #include <asm/code-patching-asm.h> #ifdef CONFIG_PTE_64BIT +#define PTE_T_SIZE 8 #define PTE_FLAGS_OFFSET 4 /* offset of PTE flags, in bytes */ #else +#define PTE_T_SIZE 4 #define PTE_FLAGS_OFFSET 0 #endif @@ -488,7 +490,7 @@ _GLOBAL(flush_hash_pages) bne 2f ble cr1,19f addi r4,r4,0x1000 - addi r5,r5,PTE_SIZE + addi r5,r5,PTE_T_SIZE addi r6,r6,-1 b 1b @@ -573,7 +575,7 @@ _GLOBAL(flush_hash_pages) 8: ble cr1,9f /* if all ptes checked */ 81: addi r6,r6,-1 - addi r5,r5,PTE_SIZE + addi r5,r5,PTE_T_SIZE addi r4,r4,0x1000 lwz r0,0(r5) /* check next pte */ cmpwi cr1,r6,1 -- 2.25.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] powerpc: Define empty_zero_page[] in C 2021-06-07 10:56 [PATCH 1/3] powerpc: Define empty_zero_page[] in C Christophe Leroy 2021-06-07 10:56 ` [PATCH 2/3] powerpc: Define swapper_pg_dir[] " Christophe Leroy 2021-06-07 10:56 ` [PATCH 3/3] powerpc/32s: Rename PTE_SIZE to PTE_T_SIZE Christophe Leroy @ 2021-06-18 3:51 ` Michael Ellerman 2 siblings, 0 replies; 7+ messages in thread From: Michael Ellerman @ 2021-06-18 3:51 UTC (permalink / raw) To: Paul Mackerras, Michael Ellerman, Benjamin Herrenschmidt, Christophe Leroy Cc: linuxppc-dev, linux-kernel On Mon, 7 Jun 2021 10:56:04 +0000 (UTC), Christophe Leroy wrote: > At the time being, empty_zero_page[] is defined in each > platform head.S. > > Define it in mm/mem.c instead, and put it in BSS section instead > of the DATA section. Commit 5227cfa71f9e ("arm64: mm: place > empty_zero_page in bss") explains why it is interesting to have > it in BSS. Applied to powerpc/next. [1/3] powerpc: Define empty_zero_page[] in C https://git.kernel.org/powerpc/c/45b30fafe528601f1a4449c9d68d8ebe7bbc39ad [2/3] powerpc: Define swapper_pg_dir[] in C https://git.kernel.org/powerpc/c/e72421a085a8dc81c71b0daeb89612279c2c621c [3/3] powerpc/32s: Rename PTE_SIZE to PTE_T_SIZE https://git.kernel.org/powerpc/c/91e9ee7e949bff08cc3845a4811185e826b6e2f1 cheers ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-06-24 2:37 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-06-07 10:56 [PATCH 1/3] powerpc: Define empty_zero_page[] in C Christophe Leroy 2021-06-07 10:56 ` [PATCH 2/3] powerpc: Define swapper_pg_dir[] " Christophe Leroy 2021-06-23 11:53 ` Daniel Axtens 2021-06-23 12:38 ` Michael Ellerman 2021-06-24 2:36 ` Daniel Axtens 2021-06-07 10:56 ` [PATCH 3/3] powerpc/32s: Rename PTE_SIZE to PTE_T_SIZE Christophe Leroy 2021-06-18 3:51 ` [PATCH 1/3] powerpc: Define empty_zero_page[] in C Michael Ellerman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).