Merge tag 'vfio-v4.21-rc1' of git://github.com/awilliam/linux-vfio
[sfrench/cifs-2.6.git] / arch / arm64 / kernel / head.S
index 4471f570a2952775a1d1224be2d2f6adcbb13027..c7213674cb24cb10c8a685794be9a8d3072cf932 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/cache.h>
 #include <asm/cputype.h>
 #include <asm/elf.h>
+#include <asm/image.h>
 #include <asm/kernel-pgtable.h>
 #include <asm/kvm_arm.h>
 #include <asm/memory.h>
@@ -91,7 +92,7 @@ _head:
        .quad   0                               // reserved
        .quad   0                               // reserved
        .quad   0                               // reserved
-       .ascii  "ARM\x64"                       // Magic number
+       .ascii  ARM64_IMAGE_MAGIC               // Magic number
 #ifdef CONFIG_EFI
        .long   pe_header - _head               // Offset to the PE header.
 
@@ -318,6 +319,19 @@ __create_page_tables:
        adrp    x0, idmap_pg_dir
        adrp    x3, __idmap_text_start          // __pa(__idmap_text_start)
 
+#ifdef CONFIG_ARM64_USER_VA_BITS_52
+       mrs_s   x6, SYS_ID_AA64MMFR2_EL1
+       and     x6, x6, #(0xf << ID_AA64MMFR2_LVA_SHIFT)
+       mov     x5, #52
+       cbnz    x6, 1f
+#endif
+       mov     x5, #VA_BITS
+1:
+       adr_l   x6, vabits_user
+       str     x5, [x6]
+       dmb     sy
+       dc      ivac, x6                // Invalidate potentially stale cache line
+
        /*
         * VA_BITS may be too small to allow for an ID mapping to be created
         * that covers system RAM if that is located sufficiently high in the
@@ -496,10 +510,9 @@ ENTRY(el2_setup)
 #endif
 
        /* Hyp configuration. */
-       mov     x0, #HCR_RW                     // 64-bit EL1
+       mov_q   x0, HCR_HOST_NVHE_FLAGS
        cbz     x2, set_hcr
-       orr     x0, x0, #HCR_TGE                // Enable Host Extensions
-       orr     x0, x0, #HCR_E2H
+       mov_q   x0, HCR_HOST_VHE_FLAGS
 set_hcr:
        msr     hcr_el2, x0
        isb
@@ -707,6 +720,7 @@ secondary_startup:
        /*
         * Common entry point for secondary CPUs.
         */
+       bl      __cpu_secondary_check52bitva
        bl      __cpu_setup                     // initialise processor
        adrp    x1, swapper_pg_dir
        bl      __enable_mmu
@@ -769,6 +783,7 @@ ENTRY(__enable_mmu)
        phys_to_ttbr x1, x1
        phys_to_ttbr x2, x2
        msr     ttbr0_el1, x2                   // load TTBR0
+       offset_ttbr1 x1
        msr     ttbr1_el1, x1                   // load TTBR1
        isb
        msr     sctlr_el1, x0
@@ -784,9 +799,30 @@ ENTRY(__enable_mmu)
        ret
 ENDPROC(__enable_mmu)
 
+ENTRY(__cpu_secondary_check52bitva)
+#ifdef CONFIG_ARM64_USER_VA_BITS_52
+       ldr_l   x0, vabits_user
+       cmp     x0, #52
+       b.ne    2f
+
+       mrs_s   x0, SYS_ID_AA64MMFR2_EL1
+       and     x0, x0, #(0xf << ID_AA64MMFR2_LVA_SHIFT)
+       cbnz    x0, 2f
+
+       update_early_cpu_boot_status \
+               CPU_STUCK_IN_KERNEL | CPU_STUCK_REASON_52_BIT_VA, x0, x1
+1:     wfe
+       wfi
+       b       1b
+
+#endif
+2:     ret
+ENDPROC(__cpu_secondary_check52bitva)
+
 __no_granule_support:
        /* Indicate that this CPU can't boot and is stuck in the kernel */
-       update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x1, x2
+       update_early_cpu_boot_status \
+               CPU_STUCK_IN_KERNEL | CPU_STUCK_REASON_NO_GRAN, x1, x2
 1:
        wfe
        wfi