cpu_switch_mm(lm_alias(idmap_pg_dir), &init_mm);
 }
 
+/*
+ * Load our new page tables. A strict BBM approach requires that we ensure that
+ * TLBs are free of any entries that may overlap with the global mappings we are
+ * about to install.
+ *
+ * For a real hibernate/resume/kexec cycle TTBR0 currently points to a zero
+ * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI runtime
+ * services), while for a userspace-driven test_resume cycle it points to
+ * userspace page tables (and we must point it at a zero page ourselves).
+ *
+ * We change T0SZ as part of installing the idmap. This is undone by
+ * cpu_uninstall_idmap() in __cpu_suspend_exit().
+ */
+static inline void cpu_install_ttbr0(phys_addr_t ttbr0, unsigned long t0sz)
+{
+       cpu_set_reserved_ttbr0();
+       local_flush_tlb_all();
+       __cpu_set_tcr_t0sz(t0sz);
+
+       /* avoid cpu_switch_mm() and its SW-PAN and CNP interactions */
+       write_sysreg(ttbr0, ttbr0_el1);
+       isb();
+}
+
 /*
  * Atomically replaces the active TTBR1_EL1 PGD with a new VA-compatible PGD,
  * avoiding the possibility of conflicting TLB entries being allocated.
 
        if (rc)
                return rc;
 
-       /*
-        * Load our new page tables. A strict BBM approach requires that we
-        * ensure that TLBs are free of any entries that may overlap with the
-        * global mappings we are about to install.
-        *
-        * For a real hibernate/resume cycle TTBR0 currently points to a zero
-        * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI
-        * runtime services), while for a userspace-driven test_resume cycle it
-        * points to userspace page tables (and we must point it at a zero page
-        * ourselves).
-        *
-        * We change T0SZ as part of installing the idmap. This is undone by
-        * cpu_uninstall_idmap() in __cpu_suspend_exit().
-        */
-       cpu_set_reserved_ttbr0();
-       local_flush_tlb_all();
-       __cpu_set_tcr_t0sz(t0sz);
-       write_sysreg(trans_ttbr0, ttbr0_el1);
-       isb();
-
+       cpu_install_ttbr0(trans_ttbr0, t0sz);
        *phys_dst_addr = virt_to_phys(page);
 
        return 0;