extern int get_cpu_capability(unsigned int *);
 
 /*
- * User space process size: 2GB for 31 bit, 4TB for 64 bit.
+ * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
  */
 #ifndef __s390x__
 
 
 #else /* __s390x__ */
 
-#define TASK_SIZE_OF(tsk)      (test_tsk_thread_flag(tsk,TIF_31BIT) ? \
-                                       (1UL << 31) : (1UL << 53))
+#define TASK_SIZE_OF(tsk)      ((tsk)->mm->context.asce_limit)
 #define TASK_UNMAPPED_BASE     (test_thread_flag(TIF_31BIT) ? \
                                        (1UL << 30) : (1UL << 41))
 #define TASK_SIZE              TASK_SIZE_OF(current)
 
  * Leave an at least ~128 MB hole.
  */
 #define MIN_GAP (128*1024*1024)
-#define MAX_GAP (TASK_SIZE/6*5)
+#define MAX_GAP (STACK_TOP/6*5)
 
 static inline unsigned long mmap_base(void)
 {
        else if (gap > MAX_GAP)
                gap = MAX_GAP;
 
-       return TASK_SIZE - (gap & PAGE_MASK);
+       return STACK_TOP - (gap & PAGE_MASK);
 }
 
 static inline int mmap_is_legacy(void)
 
                crst_table_init(table, entry);
                pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd);
                mm->pgd = (pgd_t *) table;
+               mm->task_size = mm->context.asce_limit;
                table = NULL;
        }
        spin_unlock(&mm->page_table_lock);
                        BUG();
                }
                mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
+               mm->task_size = mm->context.asce_limit;
                crst_table_free(mm, (unsigned long *) pgd);
        }
        update_mm(mm, current);