[PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems

Harry Ramsey posted 6 patches 1 week, 4 days ago
[PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems
Posted by Harry Ramsey 1 week, 4 days ago
From: Penny Zheng <Penny.Zheng@arm.com>

In MPU systems, we implement map_domain_page()/unmap_domain_page()
through mapping the domain page with a MPU region on demand.

Signed-off-by: Penny Zheng <penny.zheng@arm.com>
Signed-off-by: Wei Chen <wei.chen@arm.com>
Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
Signed-off-by: Harry Ramsey <harry.ramsey@arm.com>
---
v4:
- Remove duplicate code by having `map_domain_page` and
  `unmap_domain_page` use `vmap_contig` and `vunmap`
v3:
- No changes
v2:
- No changes
---
 xen/arch/arm/Kconfig           |  1 +
 xen/arch/arm/mpu/Makefile      |  1 +
 xen/arch/arm/mpu/domain-page.c | 46 ++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+)
 create mode 100644 xen/arch/arm/mpu/domain-page.c

diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
index cf6af68299..baa6c4cf15 100644
--- a/xen/arch/arm/Kconfig
+++ b/xen/arch/arm/Kconfig
@@ -91,6 +91,7 @@ config MMU
 
 config MPU
 	bool "MPU" if UNSUPPORTED
+	select ARCH_MAP_DOMAIN_PAGE if ARM_64
 	select STATIC_MEMORY
 	help
 	  Memory Protection Unit (MPU). Select if you plan to run Xen on ARMv8-R
diff --git a/xen/arch/arm/mpu/Makefile b/xen/arch/arm/mpu/Makefile
index 4963c8b550..940297af3f 100644
--- a/xen/arch/arm/mpu/Makefile
+++ b/xen/arch/arm/mpu/Makefile
@@ -1,5 +1,6 @@
 obj-$(CONFIG_ARM_32) += arm32/
 obj-$(CONFIG_ARM_64) += arm64/
+obj-$(CONFIG_ARM_64) += domain-page.o
 obj-y += mm.o
 obj-y += p2m.o
 obj-y += setup.init.o
diff --git a/xen/arch/arm/mpu/domain-page.c b/xen/arch/arm/mpu/domain-page.c
new file mode 100644
index 0000000000..b79afc493b
--- /dev/null
+++ b/xen/arch/arm/mpu/domain-page.c
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <xen/bug.h>
+#include <xen/domain_page.h>
+#include <xen/mm.h>
+#include <xen/mm-frame.h>
+#include <xen/types.h>
+#include <xen/vmap.h>
+
+void *map_domain_page_global(mfn_t mfn)
+{
+    BUG_ON("unimplemented");
+    return NULL;
+}
+
+/* Map a page of domheap memory */
+void *map_domain_page(mfn_t mfn)
+{
+    return vmap_contig(mfn, 1);
+}
+
+/* Release a mapping taken with map_domain_page() */
+void unmap_domain_page(const void *ptr)
+{
+    vunmap(ptr);
+}
+
+mfn_t domain_page_map_to_mfn(const void *ptr)
+{
+    BUG_ON("unimplemented");
+    return INVALID_MFN;
+}
+
+void unmap_domain_page_global(const void *va)
+{
+    BUG_ON("unimplemented");
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
-- 
2.43.0
Re: [PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems
Posted by Halder, Ayan Kumar 1 week, 4 days ago
Hi Harry,

Can we expand this to cover Arm32 as well ? I did some test and both 
Arm32 and Arm64 get to the same point.

On 14/01/2026 14:27, Harry Ramsey wrote:
> From: Penny Zheng <Penny.Zheng@arm.com>
>
> In MPU systems, we implement map_domain_page()/unmap_domain_page()
> through mapping the domain page with a MPU region on demand.
>
> Signed-off-by: Penny Zheng <penny.zheng@arm.com>
> Signed-off-by: Wei Chen <wei.chen@arm.com>
> Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
> Signed-off-by: Harry Ramsey <harry.ramsey@arm.com>
> ---
> v4:
> - Remove duplicate code by having `map_domain_page` and
>    `unmap_domain_page` use `vmap_contig` and `vunmap`
> v3:
> - No changes
> v2:
> - No changes
> ---
>   xen/arch/arm/Kconfig           |  1 +
>   xen/arch/arm/mpu/Makefile      |  1 +
>   xen/arch/arm/mpu/domain-page.c | 46 ++++++++++++++++++++++++++++++++++
>   3 files changed, 48 insertions(+)
>   create mode 100644 xen/arch/arm/mpu/domain-page.c
>
> diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
> index cf6af68299..baa6c4cf15 100644
> --- a/xen/arch/arm/Kconfig
> +++ b/xen/arch/arm/Kconfig
> @@ -91,6 +91,7 @@ config MMU
>   
>   config MPU
>   	bool "MPU" if UNSUPPORTED
> +	select ARCH_MAP_DOMAIN_PAGE if ARM_64
Remove ARM_64
>   	select STATIC_MEMORY
>   	help
>   	  Memory Protection Unit (MPU). Select if you plan to run Xen on ARMv8-R
> diff --git a/xen/arch/arm/mpu/Makefile b/xen/arch/arm/mpu/Makefile
> index 4963c8b550..940297af3f 100644
> --- a/xen/arch/arm/mpu/Makefile
> +++ b/xen/arch/arm/mpu/Makefile
> @@ -1,5 +1,6 @@
>   obj-$(CONFIG_ARM_32) += arm32/
>   obj-$(CONFIG_ARM_64) += arm64/
> +obj-$(CONFIG_ARM_64) += domain-page.o
obj-y += domain-page.o
>   obj-y += mm.o
>   obj-y += p2m.o
>   obj-y += setup.init.o
> diff --git a/xen/arch/arm/mpu/domain-page.c b/xen/arch/arm/mpu/domain-page.c
> new file mode 100644
> index 0000000000..b79afc493b
> --- /dev/null
> +++ b/xen/arch/arm/mpu/domain-page.c
> @@ -0,0 +1,46 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#include <xen/bug.h>
> +#include <xen/domain_page.h>
> +#include <xen/mm.h>
> +#include <xen/mm-frame.h>
> +#include <xen/types.h>
> +#include <xen/vmap.h>
> +
> +void *map_domain_page_global(mfn_t mfn)
> +{
> +    BUG_ON("unimplemented");
> +    return NULL;
> +}
> +
> +/* Map a page of domheap memory */
> +void *map_domain_page(mfn_t mfn)
> +{
> +    return vmap_contig(mfn, 1);
> +}
> +
> +/* Release a mapping taken with map_domain_page() */
> +void unmap_domain_page(const void *ptr)
> +{
> +    vunmap(ptr);
> +}
> +
> +mfn_t domain_page_map_to_mfn(const void *ptr)
> +{
> +    BUG_ON("unimplemented");
> +    return INVALID_MFN;
> +}
> +
> +void unmap_domain_page_global(const void *va)
> +{
> +    BUG_ON("unimplemented");
> +}
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */

The rest LGTM.

With this, one can see R52 booting to the same level as R82.

(XEN) load tracking window length 1073741824 ns
(XEN) Allocated console ring of 16 KiB.
(XEN) VFP implementer 0x41 architecture 3 part 0x40 variant 0x2 rev 0x3
(XEN) CPU0: Guest atomics will try 1 times before pausing the domain
(XEN) Brought up 1 CPUs
(XEN) Xen BUG at arch/arm/arm32/mpu/p2m.c:9

- Ayan
Re: [PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems
Posted by Luca Fancellu 1 week, 4 days ago

> On 14 Jan 2026, at 15:55, Halder, Ayan Kumar <ayankuma@amd.com> wrote:
> 
> Hi Harry,
> 
> Can we expand this to cover Arm32 as well ? I did some test and both Arm32 and Arm64 get to the same point.

The only problem is that we don’t have an Arm32 setup to test these, if the maintainer are ok we can do it,
but then it should be you to test on arm32.

Also, in case, could it be done while committing? (provided that the maintainer give their ack)

Cheers,
Luca


Re: [PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems
Posted by Orzel, Michal 1 week, 3 days ago

On 14/01/2026 16:59, Luca Fancellu wrote:
> 
> 
>> On 14 Jan 2026, at 15:55, Halder, Ayan Kumar <ayankuma@amd.com> wrote:
>>
>> Hi Harry,
>>
>> Can we expand this to cover Arm32 as well ? I did some test and both Arm32 and Arm64 get to the same point.
> 
> The only problem is that we don’t have an Arm32 setup to test these, if the maintainer are ok we can do it,
> but then it should be you to test on arm32.
> 
> Also, in case, could it be done while committing? (provided that the maintainer give their ack)
I can do that later on when committing.

Reviewed-by: Michal Orzel <michal.orzel@amd.com>

~Michal


Re: [PATCH v4 6/6] arm/mpu: Map domain page in AArch64 MPU systems
Posted by Halder, Ayan Kumar 1 week, 4 days ago
Hi Luca,

>
>> On 14 Jan 2026, at 15:55, Halder, Ayan Kumar <ayankuma@amd.com> wrote:
>>
>> Hi Harry,
>>
>> Can we expand this to cover Arm32 as well ? I did some test and both Arm32 and Arm64 get to the same point.
> The only problem is that we don’t have an Arm32 setup to test these, if the maintainer are ok we can do it,
> but then it should be you to test on arm32.

yes, I have the setup and can test the changes for arm32-v8r. You can 
test if it compiles or not.

It saves some time and effort to send another patch for removing 
Kconfig. :-)

- Ayan