From: Henry Wang <Henry.Wang@arm.com>
To: xen-devel@lists.xenproject.org
Cc: Henry Wang <Henry.Wang@arm.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Julien Grall <julien@xen.org>,
Bertrand Marquis <bertrand.marquis@arm.com>,
Wei Chen <wei.chen@arm.com>, Penny Zheng <penny.zheng@arm.com>,
Michal Orzel <michal.orzel@amd.com>,
Ayan Kumar Halder <ayan.kumar.halder@amd.com>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>,
Julien Grall <jgrall@amazon.com>
Subject: [PATCH v9 3/8] xen/arm: Fold mmu_init_secondary_cpu() to head.S
Date: Thu, 16 Nov 2023 22:50:27 +0800 [thread overview]
Message-ID: <20231116145032.1651305-4-Henry.Wang@arm.com> (raw)
In-Reply-To: <20231116145032.1651305-1-Henry.Wang@arm.com>
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.
For arm32, the WXN bit cannot be set early because at the point when
the MMU is enabled, the page-tables may still contain mapping which
are writable and executable. Therefore, introduce an assembly macro
pt_enforce_wxn. The macro is called before secondary CPUs jumping
into the C world.
For arm64, set the SCTLR_Axx_ELx_WXN flag right when the MMU is
enabled. This would avoid the extra TLB flush and SCTLR dance.
Signed-off-by: Henry Wang <Henry.Wang@arm.com>
Co-authored-by: Julien Grall <jgrall@amazon.com>
Signed-off-by: Julien Grall <jgrall@amazon.com>
Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
---
v9:
- Move pt_enforce_wxn() for arm32 up a few lines.
- Add commit message explaining why WXN cannot be set early for arm32.
- Correct in-code comment for enable_mmu().
- Add Julien's Reviewed-by tag.
v8:
- Change the setting of SCTLR_Axx_ELx_WXN for arm64 to set the
flag right when the MMU is enabled.
v7:
- No change.
v6:
- New patch.
---
xen/arch/arm/arm32/head.S | 20 ++++++++++++++++++++
xen/arch/arm/arm64/mmu/head.S | 19 ++++++++++++-------
xen/arch/arm/include/asm/mm.h | 2 --
xen/arch/arm/mm.c | 6 ------
xen/arch/arm/smpboot.c | 2 --
5 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index bbbdf7daf8..2c235fb34c 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 -
@@ -249,6 +268,7 @@ secondary_switched:
dsb
isb
flush_xen_tlb_local r0
+ pt_enforce_wxn r0
#ifdef CONFIG_EARLY_PRINTK
/* Use a virtual address to access the UART. */
diff --git a/xen/arch/arm/arm64/mmu/head.S b/xen/arch/arm/arm64/mmu/head.S
index 412b28e649..10774f30e4 100644
--- a/xen/arch/arm/arm64/mmu/head.S
+++ b/xen/arch/arm/arm64/mmu/head.S
@@ -269,11 +269,13 @@ ENDPROC(create_page_tables)
*
* Inputs:
* x0 : Physical address of the page tables.
+ * x1 : Extra flags of the SCTLR.
*
- * Clobbers x0 - x4
+ * Clobbers x0 - x5
*/
enable_mmu:
mov x4, x0
+ mov x5, x1
PRINT("- Turning on paging -\r\n")
/*
@@ -289,6 +291,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 */
@@ -303,16 +306,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
@@ -326,14 +330,15 @@ 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
/*
@@ -343,7 +348,7 @@ ENTRY(enable_boot_cpu_mm)
ldr x0, =1f
br x0
1:
- mov lr, x5
+ mov lr, x6
/*
* The 1:1 map may clash with other parts of the Xen virtual memory
* layout. As it is not used anymore, remove it completely to
diff --git a/xen/arch/arm/include/asm/mm.h b/xen/arch/arm/include/asm/mm.h
index d25e59f828..163d22ecd3 100644
--- a/xen/arch/arm/include/asm/mm.h
+++ b/xen/arch/arm/include/asm/mm.h
@@ -214,8 +214,6 @@ extern void remove_early_mappings(void);
/* Allocate and initialise pagetables for a secondary CPU. Sets init_ttbr to the
* new page table */
extern int init_secondary_pagetables(int cpu);
-/* Switch secondary CPUS to its own pagetables and finalise MMU setup */
-extern void mmu_init_secondary_cpu(void);
/*
* For Arm32, set up the direct-mapped xenheap: up to 1GB of contiguous,
* always-mapped memory. Base must be 32MB aligned and size a multiple of 32MB.
diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index b7eb3a6e08..923a90925c 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -326,12 +326,6 @@ void __init setup_pagetables(unsigned long boot_phys_offset)
#endif
}
-/* MMU setup for secondary CPUS (which already have paging enabled) */
-void mmu_init_secondary_cpu(void)
-{
- xen_pt_enforce_wnx();
-}
-
#ifdef CONFIG_ARM_32
/*
* Set up the direct-mapped xenheap:
diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c
index 5533aed455..1cf6e50a85 100644
--- a/xen/arch/arm/smpboot.c
+++ b/xen/arch/arm/smpboot.c
@@ -361,8 +361,6 @@ void start_secondary(void)
*/
update_system_features(¤t_cpu_data);
- mmu_init_secondary_cpu();
-
gic_init_secondary_cpu();
set_current(idle_vcpu[cpuid]);
--
2.25.1
next prev parent reply other threads:[~2023-11-16 14:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-16 14:50 [PATCH v9 0/8] xen/arm: Split MMU code as the prepration of MPU work Henry Wang
2023-11-16 14:50 ` [PATCH v9 1/8] xen/arm: Split page table related code to mmu/pt.c Henry Wang
2023-11-16 14:50 ` [PATCH v9 2/8] xen/arm: Split MMU system SMP MM bringup code to mmu/smpboot.c Henry Wang
2023-11-16 14:50 ` Henry Wang [this message]
2023-11-16 14:50 ` [PATCH v9 4/8] xen/arm: Extract MMU-specific MM code Henry Wang
2023-11-16 14:50 ` [PATCH v9 5/8] xen/arm: Split MMU-specific setup_mm() and related code out Henry Wang
2023-11-16 14:50 ` [PATCH v9 6/8] xen/arm: Fold pmap and fixmap into MMU system Henry Wang
2023-11-16 14:50 ` [PATCH v9 7/8] xen/arm: Rename init_secondary_pagetables() to prepare_secondary_mm() Henry Wang
2023-11-16 14:50 ` [PATCH v9 8/8] xen/arm: mmu: move MMU specific P2M code to mmu/p2m.{c,h} Henry Wang
2023-11-20 19:09 ` [PATCH v9 0/8] xen/arm: Split MMU code as the prepration of MPU work Julien Grall
2023-11-21 5:37 ` Henry Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231116145032.1651305-4-Henry.Wang@arm.com \
--to=henry.wang@arm.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=ayan.kumar.halder@amd.com \
--cc=bertrand.marquis@arm.com \
--cc=jgrall@amazon.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=penny.zheng@arm.com \
--cc=sstabellini@kernel.org \
--cc=wei.chen@arm.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.