[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 6/6] arm/mpu: Enable read/write to protection regions for arm32


  • To: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
  • From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
  • Date: Thu, 12 Jun 2025 09:35:30 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=amd.com smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hlbuVXEhrs9MyyeX4BvQmIBKEboRfF+W/4hIcY4UHXw=; b=BhmhD3hzx+xHA3FXTmmdgwBaSgPuUaZgfwER2+x7duqLBnMQpEtQu1pmeN0/FS0zg5ipdunXqyYaNWgEAMq8YBluVRSbqlBNC+985QOjCoRy4QSOb9Nm7uoTpjsi9aDIVsTZKe7b38tH9mR9mLYlJFFnCvzsE30DyETWCLeL7FH1sQoARVGiCFatPDAK9UpYRCK0zfiAE7WVZW8QMSsF0MkAiojghCe5ZdUudD+EQTFujUM7r1hJMRwrIorqJ/XlTzavQDIaIpIx1m49hHtDFQ37xOqMssE0MQPcjg+nsQiA9eLWSTl0QHs83NUSQkAvPPrsuKSxaHQ8B+r0mBOjww==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hlbuVXEhrs9MyyeX4BvQmIBKEboRfF+W/4hIcY4UHXw=; b=UC6J5Ik+L+hhhoLXhFVaw4lsy1BKvVcHzIISGGCJEWYAIVSapDyXngT0Eyyk+2Z6ElCR/mpP4a5A3tTKQIBVB9Oadhi8EgruoctKtou+lqNM8Oac5V5jtXb0XGfVSLXkXHLvYfRv2e3p9//4ATdhaFHPf5ZoAnQqzth2zL+MsPM3nzWb1WtuIyV8q6Tjtyhwf4DYURD1suJ1fEVhHc/mkQNJjlONDqJe2d0dvantBKy2/VwHQdOmGQuB5HeY1SMrZE1FYC38cD3IvbAXSSSWxzy58h/4ohJfYdcwVBdVzochbiUZkXK1YLf9IjhbhAuErrX6SqOPDhH4c1GDXgJurg==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=sE74iQKNFmKp4QeCIHHkaKumBPffEBtGe+cq4BIuisITOsgIdeNy0Y+qQD8dzLUYH1bsnnTpQBrvhyuzpN8b9vDY8sk7ZP4KGqyj0kQhz5deV4fqvDCkI1DNnjF5EsOfRs3sWq3iGGc5QXcqHsNz6Qn9Tw/eVdd0vulenLOw4W2UI0H94W5TvnTQ6+/S+8y0PN2gOj4q8XCL0A5egJeHbR8ula4GThG1c1YieK7jb/EmmWCoST3/dMeo6LTlV7m0cJf4bNYPhUOw58ixfs/nwpc2d2l9IwTw0U8LkClZfdrZIrQOU8Daqur79Did1z/YO5WRBMgHGKIfV9/8PrDhvQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lFBR/iTdK1iKa6xB76Wdy3WajzQgrkI093r7JFYNwE4k7d/59YeqklaD89ggL8CcTeIYp4Jp6sagVt2DApk6yICZQhdCFcvKAMzxqV3qfs3ZbBfc7qm3X6KsjAZitrHzU8lGG4JKhBq3GfO6ZiaZ2HZkVBhLhafjfx9qU1MbMj5yckbf4seqWCPqxCyKd+W87I6mxH6MFFf0626H682HzP2dcmvGkuk9yT1w5zuKiVn/1K7lK9447rnb0yF6XRQlSvXaGyzRMRgs1ZN3ctOKy0H5oLckNjA+5hC/U4dLXX8mkaRNW03A818AbRdkt920n85r0Dqsk8Lz5PxiEJq00w==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Thu, 12 Jun 2025 09:36:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Thread-index: AQHb2t7jddptbtJu60em4gEBgB1jlLP/RMoA
  • Thread-topic: [PATCH v3 6/6] arm/mpu: Enable read/write to protection regions for arm32

Hi Ayan,

> On 11 Jun 2025, at 15:35, Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx> wrote:
> 
> Define prepare_selector(), read_protection_region() and
> write_protection_region() for arm32. Also, define
> GENERATE_{READ/WRITE}_PR_REG_OTHERS to access MPU regions from 32 to 255.
> 
> Enable pr_{get/set}_{base/limit}(), region_is_valid() for arm32.
> Enable pr_of_addr() for arm32.
> 
> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@xxxxxxx>
> ---

Based on your v2 
(https://patchwork.kernel.org/project/xen-devel/patch/20250606164854.1551148-4-ayan.kumar.halder@xxxxxxx/)
 I was imaging something like this:

diff --git a/xen/arch/arm/mpu/mm.c b/xen/arch/arm/mpu/mm.c
index 74e96ca57137..5d324b2d4ca5 100644
--- a/xen/arch/arm/mpu/mm.c
+++ b/xen/arch/arm/mpu/mm.c
@@ -87,20 +87,28 @@ static void __init __maybe_unused build_assertions(void)
  */
 static void prepare_selector(uint8_t *sel)
 {
-#ifdef CONFIG_ARM_64
     uint8_t cur_sel = *sel;
 
+#ifdef CONFIG_ARM_64
     /*
-     * {read,write}_protection_region works using the direct access to the 
0..15
-     * regions, so in order to save the isb() overhead, change the PRSELR_EL2
-     * only when needed, so when the upper 4 bits of the selector will change.
+     * {read,write}_protection_region works using the Arm64 direct access to 
the
+     * 0..15 regions, so in order to save the isb() overhead, change the
+     * PRSELR_EL2 only when needed, so when the upper 4 bits of the selector
+     * will change.
      */
     cur_sel &= 0xF0U;
+#else
+    /* Arm32 MPU can use direct access for 0-31 */
+    if ( cur_sel > 31 )
+        cur_sel = 0;
+#endif
     if ( READ_SYSREG(PRSELR_EL2) != cur_sel )
     {
         WRITE_SYSREG(cur_sel, PRSELR_EL2);
         isb();
     }
+
+#ifdef CONFIG_ARM_64
     *sel = *sel & 0xFU;
 #endif
 }
@@ -144,6 +152,12 @@ void read_protection_region(pr_t *pr_read, uint8_t sel)
         GENERATE_READ_PR_REG_CASE(29, pr_read);
         GENERATE_READ_PR_REG_CASE(30, pr_read);
         GENERATE_READ_PR_REG_CASE(31, pr_read);
+        case 32 ... 255:
+        {
+            pr->prbar.bits = READ_SYSREG(PRBAR_EL2);
+            pr->prlar.bits = READ_SYSREG(PRLAR_EL2);
+            break;
+        }
 #endif
     default:
         BUG(); /* Can't happen */
@@ -190,6 +204,12 @@ void write_protection_region(const pr_t *pr_write, uint8_t 
sel)
         GENERATE_WRITE_PR_REG_CASE(29, pr_write);
         GENERATE_WRITE_PR_REG_CASE(30, pr_write);
         GENERATE_WRITE_PR_REG_CASE(31, pr_write);
+        case 32 ... 255:
+        {
+            WRITE_SYSREG(pr->prbar.bits & ~MPU_REGION_RES0, PRBAR_EL2);
+            WRITE_SYSREG(pr->prlar.bits & ~MPU_REGION_RES0, PRLAR_EL2);
+            break;
+        }
 #endif
     default:
         BUG(); /* Can't happen */


Is it using too ifdefs in your opinion that would benefit the split you do in 
v3?





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.