OSDN Git Service

KVM: arm64: Page-align the .hyp sections
authorQuentin Perret <qperret@google.com>
Fri, 19 Mar 2021 10:01:44 +0000 (10:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 19 Mar 2021 12:02:18 +0000 (12:02 +0000)
We will soon unmap the .hyp sections from the host stage 2 in Protected
nVHE mode, which obviously works with at least page granularity, so make
sure to align them correctly.

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210319100146.1149909-37-qperret@google.com
arch/arm64/kernel/vmlinux.lds.S

index e96173c..709d2c4 100644 (file)
 
 #define HYPERVISOR_DATA_SECTIONS                               \
        HYP_SECTION_NAME(.rodata) : {                           \
+               . = ALIGN(PAGE_SIZE);                           \
                __hyp_rodata_start = .;                         \
                *(HYP_SECTION_NAME(.data..ro_after_init))       \
                *(HYP_SECTION_NAME(.rodata))                    \
+               . = ALIGN(PAGE_SIZE);                           \
                __hyp_rodata_end = .;                           \
        }
 
@@ -72,21 +74,14 @@ ENTRY(_text)
 jiffies = jiffies_64;
 
 #define HYPERVISOR_TEXT                                        \
-       /*                                              \
-        * Align to 4 KB so that                        \
-        * a) the HYP vector table is at its minimum    \
-        *    alignment of 2048 bytes                   \
-        * b) the HYP init code will not cross a page   \
-        *    boundary if its size does not exceed      \
-        *    4 KB (see related ASSERT() below)         \
-        */                                             \
-       . = ALIGN(SZ_4K);                               \
+       . = ALIGN(PAGE_SIZE);                           \
        __hyp_idmap_text_start = .;                     \
        *(.hyp.idmap.text)                              \
        __hyp_idmap_text_end = .;                       \
        __hyp_text_start = .;                           \
        *(.hyp.text)                                    \
        HYPERVISOR_EXTABLE                              \
+       . = ALIGN(PAGE_SIZE);                           \
        __hyp_text_end = .;
 
 #define IDMAP_TEXT                                     \
@@ -322,11 +317,12 @@ SECTIONS
 #include "image-vars.h"
 
 /*
- * The HYP init code and ID map text can't be longer than a page each,
- * and should not cross a page boundary.
+ * The HYP init code and ID map text can't be longer than a page each. The
+ * former is page-aligned, but the latter may not be with 16K or 64K pages, so
+ * it should also not cross a page boundary.
  */
-ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & ~(SZ_4K - 1)) <= SZ_4K,
-       "HYP init code too big or misaligned")
+ASSERT(__hyp_idmap_text_end - __hyp_idmap_text_start <= PAGE_SIZE,
+       "HYP init code too big")
 ASSERT(__idmap_text_end - (__idmap_text_start & ~(SZ_4K - 1)) <= SZ_4K,
        "ID map text too big or misaligned")
 #ifdef CONFIG_HIBERNATION