#include <asm/cacheflush.h>
 #include <asm/cpufeature.h>
+#include <asm/daifflags.h>
 #include <asm/proc-fns.h>
 #include <asm-generic/mm_hooks.h>
 #include <asm/cputype.h>
        typedef void (ttbr_replace_func)(phys_addr_t);
        extern ttbr_replace_func idmap_cpu_replace_ttbr1;
        ttbr_replace_func *replace_phys;
+       unsigned long daif;
 
        /* phys_to_ttbr() zeros lower 2 bits of ttbr with 52-bit PA */
        phys_addr_t ttbr1 = phys_to_ttbr(virt_to_phys(pgdp));
        replace_phys = (void *)__pa_symbol(idmap_cpu_replace_ttbr1);
 
        __cpu_install_idmap(idmap);
+
+       /*
+        * We really don't want to take *any* exceptions while TTBR1 is
+        * in the process of being replaced so mask everything.
+        */
+       daif = local_daif_save();
        replace_phys(ttbr1);
+       local_daif_restore(daif);
+
        cpu_uninstall_idmap();
 }
 
 
  * called by anything else. It can only be executed from a TTBR0 mapping.
  */
 SYM_TYPED_FUNC_START(idmap_cpu_replace_ttbr1)
-       save_and_disable_daif flags=x2
-
        __idmap_cpu_set_reserved_ttbr1 x1, x3
 
        offset_ttbr1 x0, x3
        msr     ttbr1_el1, x0
        isb
 
-       restore_daif x2
-
        ret
 SYM_FUNC_END(idmap_cpu_replace_ttbr1)
        .popsection