]> xenbits.xensource.com Git - people/tklengyel/xen.git/commitdiff
xen/arm: Support properly __ro_after_init on Arm
authorJulien Grall <jgrall@amazon.com>
Tue, 16 Aug 2022 18:59:54 +0000 (19:59 +0100)
committerJulien Grall <julien@xen.org>
Wed, 31 Aug 2022 18:53:06 +0000 (19:53 +0100)
__ro_after_init was introduced recently to prevent modifying
some variables after init.

At the moment, on Arm, the variables will still be accessible
because the region permission is not updated.

Address that by moving the sections .data.ro_after_init
out of .data and then map the region read-only once we finish
to boot.

Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Penny Zheng <penny.zheng@arm.com>
Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com>
Tested-by: Henry Wang <Henry.Wang@arm.com>
xen/arch/arm/include/asm/setup.h
xen/arch/arm/setup.c
xen/arch/arm/xen.lds.S

index 2bb01ecfa88fc6df730cbbf15dd4a330dd6d7645..5815ccf8c5cc1840c95d75c9e2c60a78483e2f71 100644 (file)
@@ -137,6 +137,8 @@ u32 device_tree_get_u32(const void *fdt, int node,
 int map_range_to_domain(const struct dt_device_node *dev,
                         u64 addr, u64 len, void *data);
 
+extern const char __ro_after_init_start[], __ro_after_init_end[];
+
 #endif
 /*
  * Local variables:
index 500307edc08d90239496598edceefaa6d6c9faa7..6e0398f3f6616fc839c39294ecb230b110b2ec7a 100644 (file)
@@ -75,10 +75,24 @@ domid_t __read_mostly max_init_domid;
 
 static __used void init_done(void)
 {
+    int rc;
+
     /* Must be done past setting system_state. */
     unregister_init_virtual_region();
 
     free_init_memory();
+
+    /*
+     * We have finished booting. Mark the section .data.ro_after_init
+     * read-only.
+     */
+    rc = modify_xen_mappings((unsigned long)&__ro_after_init_start,
+                             (unsigned long)&__ro_after_init_end,
+                             PAGE_HYPERVISOR_RO);
+    if ( rc )
+        panic("Unable to mark the .data.ro_after_init section read-only (rc = %d)\n",
+              rc);
+
     startup_cpu_idle_loop();
 }
 
index 1e986e211f68c6f106709e756ee942e9f130ca16..92c298405259b267535058008f7f9c339df27418 100644 (file)
@@ -83,6 +83,13 @@ SECTIONS
   _erodata = .;                /* End of read-only data */
 
   . = ALIGN(PAGE_SIZE);
+  .data.ro_after_init : {
+      __ro_after_init_start = .;
+      *(.data.ro_after_init)
+      . = ALIGN(PAGE_SIZE);
+      __ro_after_init_end = .;
+  } : text
+
   .data.read_mostly : {
        /* Exception table */
        __start___ex_table = .;