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(); Cheers, Ahmad > } > > /* -- 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 |