Hello Sascha, On 31.05.23 13:21, Sascha Hauer wrote: > On Wed, May 31, 2023 at 12:45:17PM +0200, Ahmad Fatoum wrote: >> On 31.05.23 12:35, Sascha Hauer wrote: >>> We used to skip setting the zero page to faulting when SDRAM starts >>> at 0x0. As bootm code now explicitly sets the zero page accessible >>> before copying ATAGs there this should no longer be necessary, so >>> unconditionally set the zero page to faulting during MMU startup. >>> This also moves the zero page setup after the point the SDRAM has >>> been mapped cachable, because otherwise the zero page setup would >>> be overwritten. >>> >>> Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> >>> --- >>> arch/arm/cpu/mmu_32.c | 26 +++++++------------------- >>> 1 file changed, 7 insertions(+), 19 deletions(-) >>> >>> diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c >>> index c4e5a3bb0a..fdbc0293a3 100644 >>> --- a/arch/arm/cpu/mmu_32.c >>> +++ b/arch/arm/cpu/mmu_32.c >>> @@ -459,23 +459,6 @@ static int set_vector_table(unsigned long adr) >>> return -EINVAL; >>> } >>> >>> -static void create_zero_page(void) >>> -{ >>> - struct resource *zero_sdram; >>> - >>> - zero_sdram = request_sdram_region("zero page", 0x0, PAGE_SIZE); >>> - if (zero_sdram) { >>> - /* >>> - * Here we would need to set the second level page table >>> - * entry to faulting. This is not yet implemented. >>> - */ >>> - pr_debug("zero page is in SDRAM area, currently not supported\n"); >>> - } else { >>> - zero_page_faulting(); >>> - pr_debug("Created zero page\n"); >>> - } >>> -} >>> - >>> /* >>> * Map vectors and zero page >>> */ >>> @@ -487,7 +470,6 @@ static void vectors_init(void) >>> */ >>> if (!set_vector_table((unsigned long)__exceptions_start)) { >>> arm_fixup_vectors(); >>> - create_zero_page(); >>> return; >>> } >>> >>> @@ -495,7 +477,6 @@ static void vectors_init(void) >>> * Next try high vectors at 0xffff0000. >>> */ >>> if (!set_vector_table(ARM_HIGH_VECTORS)) { >>> - create_zero_page(); >>> create_vector_table(ARM_HIGH_VECTORS); >>> return; >>> } >>> @@ -552,6 +533,13 @@ void __mmu_init(bool mmu_on) >>> >>> remap_range((void *)pos, bank->start + bank->size - pos, MAP_CACHED); >>> } >>> + >>> + /* >>> + * In case the zero page is in SDRAM request it to prevent others >>> + * from using it >>> + */ >>> + request_sdram_region("zero page", 0x0, PAGE_SIZE); >>> + zero_page_faulting(); >> >> I think this would break the case of having low vectors (at address 0). >> We have vector_table requested if that's the case, so we need to check: >> >> if (!zero_page_in_sdram() || !zero_page_already_sdram_requested()) >> zero_page_faulting(); > > You are right. How about this one? > > --------------------------8<------------------------------ > > > From b6e5c92682467496bd9c57918996f1feffda2dd6 Mon Sep 17 00:00:00 2001 > From: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > Date: Wed, 31 May 2023 11:58:51 +0200 > Subject: [PATCH] ARM: mmu_32: fix setting up zero page when it is in SDRAM > > We used to skip setting the zero page to faulting when SDRAM starts at > 0x0. As bootm code now explicitly sets the zero page accessible before > copying ATAGs there this should no longer be necessary, so > unconditionally set the zero page to faulting during MMU startup. This > also moves the zero page and vector table setup after the point the > SDRAM has been mapped cachable, because otherwise the zero page and > possibly the vector table mapping would be overwritten. > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > arch/arm/cpu/mmu_32.c | 23 +++++++++-------------- > 1 file changed, 9 insertions(+), 14 deletions(-) > > diff --git a/arch/arm/cpu/mmu_32.c b/arch/arm/cpu/mmu_32.c > index c4e5a3bb0a..14775768a3 100644 > --- a/arch/arm/cpu/mmu_32.c > +++ b/arch/arm/cpu/mmu_32.c > @@ -461,19 +461,14 @@ static int set_vector_table(unsigned long adr) > > static void create_zero_page(void) Is this commit incomplete? Vectors should be set up unconditionally and create_zero_page should be called after it. > { > - struct resource *zero_sdram; > + /* > + * In case the zero page is in SDRAM request it to prevent others > + * from using it > + */ > + request_sdram_region("zero page", 0x0, PAGE_SIZE); > > - zero_sdram = request_sdram_region("zero page", 0x0, PAGE_SIZE); > - if (zero_sdram) { > - /* > - * Here we would need to set the second level page table > - * entry to faulting. This is not yet implemented. > - */ > - pr_debug("zero page is in SDRAM area, currently not supported\n"); > - } else { > - zero_page_faulting(); > - pr_debug("Created zero page\n"); > - } > + zero_page_faulting(); > + pr_debug("Created zero page\n"); > } > > /* > @@ -530,8 +525,6 @@ void __mmu_init(bool mmu_on) > > pr_debug("ttb: 0x%p\n", ttb); > > - vectors_init(); > - > /* > * Early mmu init will have mapped everything but the initial memory area > * (excluding final OPTEE_SIZE bytes) uncached. We have now discovered > @@ -552,6 +545,8 @@ void __mmu_init(bool mmu_on) > > remap_range((void *)pos, bank->start + bank->size - pos, MAP_CACHED); > } > + > + vectors_init(); > } > > /* -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |