#define call_nodat(nr, rettype, fn, ...)                               \
 ({                                                                     \
        rettype (*__fn)(CALL_PARM_##nr(__VA_ARGS__)) = (fn);            \
-       psw_t psw_enter, psw_leave;                                     \
+       /* aligned since psw_leave must not cross page boundary */      \
+       psw_t __aligned(16) psw_leave;                                  \
+       psw_t psw_enter;                                                \
        CALL_LARGS_##nr(__VA_ARGS__);                                   \
        CALL_REGS_##nr;                                                 \
                                                                        \
 
        store_status(__do_machine_kdump, image);
 }
 
-static int do_start_kdump(struct kimage *image)
-{
-       purgatory_t purgatory = (purgatory_t)image->start;
-
-       return call_nodat(1, int, purgatory, int, 0);
-}
-
 #endif /* CONFIG_CRASH_DUMP */
 
 /*
 static bool kdump_csum_valid(struct kimage *image)
 {
 #ifdef CONFIG_CRASH_DUMP
+       purgatory_t purgatory = (purgatory_t)image->start;
        int rc;
 
-       preempt_disable();
-       rc = call_on_stack(1, S390_lowcore.nodat_stack, int, do_start_kdump,
-                          struct kimage *, image);
-       preempt_enable();
+       rc = call_nodat(1, int, purgatory, int, 0);
        return rc == 0;
 #else
        return false;