return (s64)(features << (64 - 4 - field)) >> (64 - 4);
 }
 
+void __init setup_cpu_features(void);
 
 void check_cpu_capabilities(const struct arm64_cpu_capabilities *caps,
                            const char *info);
 
        __flush_dcache_area(&mpidr_hash, sizeof(struct mpidr_hash));
 }
 
-static void __init setup_processor(void)
+void __init setup_cpu_features(void)
 {
        u64 features;
        s64 block;
        u32 cwg;
        int cls;
 
-       pr_info("Boot CPU: AArch64 Processor [%08x]\n", read_cpuid_id());
-
-       sprintf(init_utsname()->machine, ELF_PLATFORM);
-       elf_hwcap = 0;
-
-       cpuinfo_store_boot_cpu();
-
        /*
         * Check for sane CTR_EL0.CWG value.
         */
 #endif
 }
 
+static void __init setup_processor(void)
+{
+       pr_info("Boot CPU: AArch64 Processor [%08x]\n", read_cpuid_id());
+       sprintf(init_utsname()->machine, ELF_PLATFORM);
+       cpuinfo_store_boot_cpu();
+}
+
 static void __init setup_machine_fdt(phys_addr_t dt_phys)
 {
        void *dt_virt = fixmap_remap_fdt(dt_phys);
 
 void __init smp_cpus_done(unsigned int max_cpus)
 {
        pr_info("SMP: Total of %d processors activated.\n", num_online_cpus());
+       setup_cpu_features();
        hyp_mode_check();
        apply_alternatives_all();
 }