[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6 08/13] xen/arm: Fold mmu_init_secondary_cpu() to head.S
Hi Julien, > On Sep 16, 2023, at 05:58, Julien Grall <julien@xxxxxxx> wrote: > > Hi Henry, > > On 28/08/2023 02:32, Henry Wang wrote: >> Currently mmu_init_secondary_cpu() only enforces the page table >> should not contain mapping that are both Writable and eXecutables >> after boot. To ease the arch/arm/mm.c split work, fold this function >> to head.S. >> Introduce assembly macro pt_enforce_wxn for both arm32 and arm64. >> For arm64, the macro is called at the end of enable_secondary_cpu_mm(). >> For arm32, the macro is called before secondary CPUs jumping into >> the C world. >> Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx> >> --- >> v6: >> - New patch. >> --- >> xen/arch/arm/arm32/head.S | 20 ++++++++++++++++++++ >> xen/arch/arm/arm64/mmu/head.S | 21 +++++++++++++++++++++ >> xen/arch/arm/include/asm/mm.h | 2 -- >> xen/arch/arm/mm.c | 6 ------ >> xen/arch/arm/smpboot.c | 2 -- >> 5 files changed, 41 insertions(+), 10 deletions(-) >> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S >> index 33b038e7e0..39218cf15f 100644 >> --- a/xen/arch/arm/arm32/head.S >> +++ b/xen/arch/arm/arm32/head.S >> @@ -83,6 +83,25 @@ >> isb >> .endm >> +/* >> + * Enforce Xen page-tables do not contain mapping that are both >> + * Writable and eXecutables. >> + * >> + * This should be called on each secondary CPU. >> + */ >> +.macro pt_enforce_wxn tmp >> + mrc CP32(\tmp, HSCTLR) >> + orr \tmp, \tmp, #SCTLR_Axx_ELx_WXN >> + dsb >> + mcr CP32(\tmp, HSCTLR) >> + /* >> + * The TLBs may cache SCTLR_EL2.WXN. So ensure it is synchronized >> + * before flushing the TLBs. >> + */ >> + isb >> + flush_xen_tlb_local \tmp >> +.endm >> + >> /* >> * Common register usage in this file: >> * r0 - >> @@ -254,6 +273,7 @@ secondary_switched: >> /* Use a virtual address to access the UART. */ >> mov_w r11, EARLY_UART_VIRTUAL_ADDRESS >> #endif >> + pt_enforce_wxn r0 >> PRINT("- Ready -\r\n") >> /* Jump to C world */ >> mov_w r2, start_secondary >> diff --git a/xen/arch/arm/arm64/mmu/head.S b/xen/arch/arm/arm64/mmu/head.S >> index a5271e3880..25028bdf07 100644 >> --- a/xen/arch/arm/arm64/mmu/head.S >> +++ b/xen/arch/arm/arm64/mmu/head.S >> @@ -31,6 +31,25 @@ >> isb >> .endm >> +/* >> + * Enforce Xen page-tables do not contain mapping that are both >> + * Writable and eXecutables. >> + * >> + * This should be called on each secondary CPU. >> + */ >> +.macro pt_enforce_wxn tmp >> + mrs \tmp, SCTLR_EL2 >> + orr \tmp, \tmp, #SCTLR_Axx_ELx_WXN >> + dsb sy >> + msr SCTLR_EL2, \tmp >> + /* >> + * The TLBs may cache SCTLR_EL2.WXN. So ensure it is synchronized >> + * before flushing the TLBs. >> + */ >> + isb >> + flush_xen_tlb_local >> +.endm >> + > > It would be preferable if we can set the flag right when the MMU is > initialized enabled configured. This would avoid the extra TLB flush and > SCTLR dance. How about the following (not compiled/cleaned) code: Thank you for the detailed information. Sure, I will try below code and keep you updated about if it works. Will update the patch accordingly. > > diff --git a/xen/arch/arm/arm64/mmu/head.S b/xen/arch/arm/arm64/mmu/head.S > index a5271e388071..6b19d15ff89f 100644 > --- a/xen/arch/arm/arm64/mmu/head.S > +++ b/xen/arch/arm/arm64/mmu/head.S > @@ -264,10 +264,11 @@ ENDPROC(create_page_tables) > * Inputs: > * x0 : Physical address of the page tables. > * > - * Clobbers x0 - x4 > + * Clobbers x0 - x6 > */ > enable_mmu: > mov x4, x0 > + mov x5, x1 > PRINT("- Turning on paging -\r\n") > > /* > @@ -283,6 +284,7 @@ enable_mmu: > mrs x0, SCTLR_EL2 > orr x0, x0, #SCTLR_Axx_ELx_M /* Enable MMU */ > orr x0, x0, #SCTLR_Axx_ELx_C /* Enable D-cache */ > + orr x0, x0, x5 /* Enable extra flags */ > dsb sy /* Flush PTE writes and finish reads */ > msr SCTLR_EL2, x0 /* now paging is enabled */ > isb /* Now, flush the icache */ > @@ -297,16 +299,17 @@ ENDPROC(enable_mmu) > * Inputs: > * lr : Virtual address to return to. > * > - * Clobbers x0 - x5 > + * Clobbers x0 - x6 > */ > ENTRY(enable_secondary_cpu_mm) > - mov x5, lr > + mov x6, lr > > load_paddr x0, init_ttbr > ldr x0, [x0] > > + mov x1, #SCTLR_Axx_ELx_WXN /* Enable WxN from the start */ > bl enable_mmu > - mov lr, x5 > + mov lr, x6 > > /* Return to the virtual address requested by the caller. */ > ret > @@ -320,16 +323,17 @@ ENDPROC(enable_secondary_cpu_mm) > * Inputs: > * lr : Virtual address to return to. > * > - * Clobbers x0 - x5 > + * Clobbers x0 - x6 > */ > ENTRY(enable_boot_cpu_mm) > - mov x5, lr > + mov x6, lr > > bl create_page_tables > load_paddr x0, boot_pgtable > > + mov x1, #0 /* No extra SCTLR flags */ > bl enable_mmu > - mov lr, x5 > + mov lr, x6 > > /* > * The MMU is turned on and we are in the 1:1 mapping. Switch > > The same logic could be used for arm32. Sure. Will do that together. Kind regards, Henry > > Cheers, > > -- > Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |