diff -urN linux-2.5.62/arch/s390x/kernel/binfmt_elf32.c linux-2.5.62-s390/arch/s390x/kernel/binfmt_elf32.c
--- linux-2.5.62/arch/s390x/kernel/binfmt_elf32.c	Mon Feb 17 23:57:21 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/binfmt_elf32.c	Mon Feb 24 18:25:00 2003
@@ -9,9 +9,10 @@
  * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek   (jj@ultra.linux.cz)
  */
 
-
 #define __ASMS390_ELF_H
 
+#include <linux/time.h>
+
 /*
  * These are used to set parameters in the core dumps.
  */
@@ -38,7 +39,7 @@
 #define ELF_PLAT_INIT(_r) \
 	do { \
 	_r->gprs[14] = 0; \
-	current->thread.flags |= S390_FLAG_31BIT; \
+	set_thread_flag(TIF_31BIT); \
 	} while(0)
 
 #define USE_ELF_CORE_DUMP
@@ -49,9 +50,7 @@
    the loader.  We need to make sure that it is out of the way of the program
    that it will "exec", and that there is sufficient room for the brk.  */
 
-#define ELF_ET_DYN_BASE         ((TASK31_SIZE & 0x80000000) \
-                                ? TASK31_SIZE / 3 * 2 \
-                                : 2 * TASK31_SIZE / 3)     
+#define ELF_ET_DYN_BASE         (TASK31_SIZE / 3 * 2)
 
 /* Wow, the "main" arch needs arch dependent functions too.. :) */
 
@@ -86,7 +85,6 @@
 
 #define ELF_PLATFORM (NULL)
 
-#ifdef __KERNEL__
 #define SET_PERSONALITY(ex, ibcs2)			\
 do {							\
 	if (ibcs2)                                      \
@@ -94,7 +92,6 @@
 	else if (current->personality != PER_LINUX32)   \
 		set_personality(PER_LINUX);             \
 } while (0)
-#endif 
 
 #include "linux32.h"
 
@@ -186,6 +183,14 @@
 #undef MODULE_DESCRIPTION
 #undef MODULE_AUTHOR
 
+#define jiffies_to_timeval jiffies_to_compat_timeval
+static __inline__ void
+jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
+{
+	value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
+	value->tv_sec = jiffies / HZ;
+}
+
 #include "../../../fs/binfmt_elf.c"
 
 static unsigned long
@@ -193,14 +198,17 @@
 {
 	unsigned long map_addr;
 
-	if(!addr)
-		addr = 0x40000000;
+	if (!addr) 
+		addr = 0x40000000; 
+
+	if (prot & PROT_READ) 
+		prot |= PROT_EXEC; 
 
 	down_write(¤t->mm->mmap_sem);
 	map_addr = do_mmap(filep, ELF_PAGESTART(addr),
-			   eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr), prot, type,
+			   eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr),
+			   prot, type,
 			   eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr));
 	up_write(¤t->mm->mmap_sem);
 	return(map_addr);
 }
-
diff -urN linux-2.5.62/arch/s390x/kernel/entry.S linux-2.5.62-s390/arch/s390x/kernel/entry.S
--- linux-2.5.62/arch/s390x/kernel/entry.S	Mon Feb 24 18:18:38 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/entry.S	Mon Feb 24 18:25:00 2003
@@ -280,6 +280,12 @@
         la      %r2,SP_PTREGS(%r15)    # load pt_regs
         jg      sys_clone              # branch to sys_clone
 
+#ifdef CONFIG_S390_SUPPORT
+sys32_clone_glue: 
+        la      %r2,SP_PTREGS(%r15)    # load pt_regs
+        jg      sys32_clone            # branch to sys32_clone
+#endif
+
 sys_fork_glue:  
         la      %r2,SP_PTREGS(%r15)    # load pt_regs
         jg      sys_fork               # branch to sys_fork
@@ -511,7 +517,7 @@
         .long  SYSCALL(sys_ipc,sys32_ipc_wrapper)
         .long  SYSCALL(sys_fsync,sys32_fsync_wrapper)
         .long  SYSCALL(sys_sigreturn_glue,sys32_sigreturn_glue)
-        .long  SYSCALL(sys_clone_glue,sys_clone_glue) /* 120 */
+        .long  SYSCALL(sys_clone_glue,sys32_clone_glue) /* 120 */
         .long  SYSCALL(sys_setdomainname,sys32_setdomainname_wrapper)
         .long  SYSCALL(s390x_newuname,sys32_newuname_wrapper)
         .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* modify_ldt for i386 */
@@ -643,7 +649,7 @@
 	.long  SYSCALL(sys_epoll_create,sys_ni_syscall)
 	.long  SYSCALL(sys_epoll_ctl,sys_ni_syscall)
 	.long  SYSCALL(sys_epoll_wait,sys_ni_syscall)
-	.long  SYSCALL(sys_set_tid_address,sys_ni_syscall)
+	.long  SYSCALL(sys_set_tid_address,sys32_set_tid_address_wrapper)
 	.long  SYSCALL(sys_fadvise64,sys_ni_syscall)
         .rept  255-253
 	.long  SYSCALL(sys_ni_syscall,sys_ni_syscall)
diff -urN linux-2.5.62/arch/s390x/kernel/exec32.c linux-2.5.62-s390/arch/s390x/kernel/exec32.c
--- linux-2.5.62/arch/s390x/kernel/exec32.c	Mon Feb 17 23:55:49 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/exec32.c	Mon Feb 24 18:25:00 2003
@@ -42,9 +42,11 @@
 {
 	unsigned long stack_base;
 	struct vm_area_struct *mpnt;
+	struct mm_struct *mm = current->mm;
 	int i;
 
 	stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
+	mm->arg_start = bprm->p + stack_base;
 
 	bprm->p += stack_base;
 	if (bprm->loader)
@@ -55,9 +57,14 @@
 	if (!mpnt) 
 		return -ENOMEM; 
 	
-	down_write(¤t->mm->mmap_sem);
+	if (!vm_enough_memory((STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) {
+		kmem_cache_free(vm_area_cachep, mpnt);
+		return -ENOMEM;
+	}
+
+	down_write(&mm->mmap_sem);
 	{
-		mpnt->vm_mm = current->mm;
+		mpnt->vm_mm = mm;
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = STACK_TOP;
 		mpnt->vm_page_prot = PAGE_COPY;
@@ -65,9 +72,10 @@
 		mpnt->vm_ops = NULL;
 		mpnt->vm_pgoff = 0;
 		mpnt->vm_file = NULL;
+		INIT_LIST_HEAD(&mpnt->shared);
 		mpnt->vm_private_data = (void *) 0;
-		insert_vm_struct(current->mm, mpnt);
-		current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
+		insert_vm_struct(mm, mpnt);
+		mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
 	} 
 
 	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
@@ -78,7 +86,7 @@
 		}
 		stack_base += PAGE_SIZE;
 	}
-	up_write(¤t->mm->mmap_sem);
+	up_write(&mm->mmap_sem);
 	
 	return 0;
 }
diff -urN linux-2.5.62/arch/s390x/kernel/linux32.c linux-2.5.62-s390/arch/s390x/kernel/linux32.c
--- linux-2.5.62/arch/s390x/kernel/linux32.c	Mon Feb 24 18:17:42 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/linux32.c	Mon Feb 24 18:25:00 2003
@@ -1328,12 +1328,12 @@
 	err |= put_user(high2lowgid(stat->gid), &statbuf->st_gid);
 	err |= put_user(stat->rdev, &statbuf->st_rdev);
 	err |= put_user(stat->size, &statbuf->st_size);
-	err |= put_user(stat->atime, &statbuf->st_atime);
-	err |= put_user(0, &statbuf->__unused1);
-	err |= put_user(stat->mtime, &statbuf->st_mtime);
-	err |= put_user(0, &statbuf->__unused2);
-	err |= put_user(stat->ctime, &statbuf->st_ctime);
-	err |= put_user(0, &statbuf->__unused3);
+	err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
+	err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
+	err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
+	err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
+	err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
+	err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
 	err |= put_user(stat->blksize, &statbuf->st_blksize);
 	err |= put_user(stat->blocks, &statbuf->st_blocks);
 /* fixme
@@ -2700,8 +2700,7 @@
 	int retval;
 	int i;
 
-	bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
-	memset(bprm.page, 0, MAX_ARG_PAGES * sizeof(bprm.page[0]));
+	sched_balance_exec();
 
 	file = open_exec(filename);
 
@@ -2709,21 +2708,32 @@
 	if (IS_ERR(file))
 		return retval;
 
+	bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
+	memset(bprm.page, 0, MAX_ARG_PAGES * sizeof(bprm.page[0]));
+
 	bprm.file = file;
 	bprm.filename = filename;
 	bprm.sh_bang = 0;
 	bprm.loader = 0;
 	bprm.exec = 0;
-	if ((bprm.argc = count32(argv)) < 0) {
-		allow_write_access(file);
-		fput(file);
-		return bprm.argc;
-	}
-	if ((bprm.envc = count32(envp)) < 0) {
-		allow_write_access(file);
-		fput(file);
-		return bprm.envc;
-	}
+	bprm.mm = mm_alloc();
+	retval = -ENOMEM;
+	if (!bprm.mm)
+		goto out_file;
+
+	/* init_new_context is empty for s390x. */
+
+	bprm.argc = count32(argv);
+	if ((retval = bprm.argc) < 0)
+		goto out_mm;
+
+	bprm.envc = count32(envp);
+	if ((retval = bprm.envc) < 0)
+		goto out_mm;
+
+	retval = security_bprm_alloc(&bprm);
+	if (retval)
+		goto out;
 
 	retval = prepare_binprm(&bprm);
 	if (retval < 0)
@@ -2743,19 +2753,31 @@
 		goto out;
 
 	retval = search_binary_handler(&bprm, regs);
-	if (retval >= 0)
+	if (retval >= 0) {
 		/* execve success */
+		security_bprm_free(&bprm);
 		return retval;
+	}
 
 out:
 	/* Something went wrong, return the inode and free the argument pages*/
-	allow_write_access(bprm.file);
-	if (bprm.file)
-		fput(bprm.file);
+	for (i=0 ; i<MAX_ARG_PAGES ; i++) {
+		struct page * page = bprm.page[i];
+		if (page)
+			__free_page(page);
+	}
+
+	if (bprm.security)
+		security_bprm_free(&bprm);
+
+out_mm:
+	mmdrop(bprm.mm);
 
-	for (i=0 ; i<MAX_ARG_PAGES ; i++)
-		if (bprm.page[i])
-			__free_page(bprm.page[i]);
+out_file:
+	if (bprm.file) {
+		allow_write_access(bprm.file);
+		fput(bprm.file);
+	}
 
 	return retval;
 }
@@ -2816,265 +2838,6 @@
 	s32 usecount;
 };
 
-/* Query various bits about modules.  */
-
-static inline long
-get_mod_name(const char *user_name, char **buf)
-{
-	unsigned long page;
-	long retval;
-
-	if ((unsigned long)user_name >= TASK_SIZE
-	    && !segment_eq(get_fs (), KERNEL_DS))
-		return -EFAULT;
-
-	page = __get_free_page(GFP_KERNEL);
-	if (!page)
-		return -ENOMEM;
-
-	retval = strncpy_from_user((char *)page, user_name, PAGE_SIZE);
-	if (retval > 0) {
-		if (retval < PAGE_SIZE) {
-			*buf = (char *)page;
-			return retval;
-		}
-		retval = -ENAMETOOLONG;
-	} else if (!retval)
-		retval = -EINVAL;
-
-	free_page(page);
-	return retval;
-}
-
-static inline void
-put_mod_name(char *buf)
-{
-	free_page((unsigned long)buf);
-}
-
-static __inline__ struct module *find_module(const char *name)
-{
-	struct module *mod;
-
-	for (mod = module_list; mod ; mod = mod->next) {
-		if (mod->flags & MOD_DELETED)
-			continue;
-		if (!strcmp(mod->name, name))
-			break;
-	}
-
-	return mod;
-}
-
-static int
-qm_modules(char *buf, size_t bufsize, compat_size_t *ret)
-{
-	struct module *mod;
-	size_t nmod, space, len;
-
-	nmod = space = 0;
-
-	for (mod = module_list; mod->next != NULL; mod = mod->next, ++nmod) {
-		len = strlen(mod->name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, mod->name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(nmod, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	space += len;
-	while ((mod = mod->next)->next != NULL)
-		space += strlen(mod->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static int
-qm_deps(struct module *mod, char *buf, size_t bufsize, compat_size_t *ret)
-{
-	size_t i, space, len;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-	if (!MOD_CAN_QUERY(mod))
-		return put_user(0, ret);
-
-	space = 0;
-	for (i = 0; i < mod->ndeps; ++i) {
-		const char *dep_name = mod->deps[i].dep->name;
-
-		len = strlen(dep_name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, dep_name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	return put_user(i, ret);
-
-calc_space_needed:
-	space += len;
-	while (++i < mod->ndeps)
-		space += strlen(mod->deps[i].dep->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static int
-qm_refs(struct module *mod, char *buf, size_t bufsize, compat_size_t *ret)
-{
-	size_t nrefs, space, len;
-	struct module_ref *ref;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-	if (!MOD_CAN_QUERY(mod))
-		if (put_user(0, ret))
-			return -EFAULT;
-		else
-			return 0;
-
-	space = 0;
-	for (nrefs = 0, ref = mod->refs; ref ; ++nrefs, ref = ref->next_ref) {
-		const char *ref_name = ref->ref->name;
-
-		len = strlen(ref_name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-		if (copy_to_user(buf, ref_name, len))
-			return -EFAULT;
-		buf += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(nrefs, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	space += len;
-	while ((ref = ref->next_ref) != NULL)
-		space += strlen(ref->ref->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static inline int
-qm_symbols(struct module *mod, char *buf, size_t bufsize, compat_size_t *ret)
-{
-	size_t i, space, len;
-	struct module_symbol *s;
-	char *strings;
-	unsigned *vals;
-
-	if (!MOD_CAN_QUERY(mod))
-		if (put_user(0, ret))
-			return -EFAULT;
-		else
-			return 0;
-
-	space = mod->nsyms * 2*sizeof(u32);
-
-	i = len = 0;
-	s = mod->syms;
-
-	if (space > bufsize)
-		goto calc_space_needed;
-
-	if (!access_ok(VERIFY_WRITE, buf, space))
-		return -EFAULT;
-
-	bufsize -= space;
-	vals = (unsigned *)buf;
-	strings = buf+space;
-
-	for (; i < mod->nsyms ; ++i, ++s, vals += 2) {
-		len = strlen(s->name)+1;
-		if (len > bufsize)
-			goto calc_space_needed;
-
-		if (copy_to_user(strings, s->name, len)
-		    || __put_user(s->value, vals+0)
-		    || __put_user(space, vals+1))
-			return -EFAULT;
-
-		strings += len;
-		bufsize -= len;
-		space += len;
-	}
-
-	if (put_user(i, ret))
-		return -EFAULT;
-	else
-		return 0;
-
-calc_space_needed:
-	for (; i < mod->nsyms; ++i, ++s)
-		space += strlen(s->name)+1;
-
-	if (put_user(space, ret))
-		return -EFAULT;
-	else
-		return -ENOSPC;
-}
-
-static inline int
-qm_info(struct module *mod, char *buf, size_t bufsize, compat_size_t *ret)
-{
-	int error = 0;
-
-	if (mod->next == NULL)
-		return -EINVAL;
-
-	if (sizeof(struct module_info32) <= bufsize) {
-		struct module_info32 info;
-		info.addr = (unsigned long)mod;
-		info.size = mod->size;
-		info.flags = mod->flags;
-		info.usecount =
-			((mod_member_present(mod, can_unload)
-			  && mod->can_unload)
-			 ? -1 : atomic_read(&mod->uc.usecount));
-
-		if (copy_to_user(buf, &info, sizeof(struct module_info32)))
-			return -EFAULT;
-	} else
-		error = -ENOSPC;
-
-	if (put_user(sizeof(struct module_info32), ret))
-		return -EFAULT;
-
-	return error;
-}
-
-struct kernel_sym32 {
-	u32 value;
-	char name[60];
-};
-
 #else /* CONFIG_MODULES */
 
 asmlinkage int
@@ -4069,3 +3832,21 @@
 
 	return sys_write(fd, buf, count);
 }
+
+asmlinkage int sys32_clone(struct pt_regs regs)
+{
+        unsigned long clone_flags;
+        unsigned long newsp;
+	struct task_struct *p;
+	int *parent_tidptr, *child_tidptr;
+
+        clone_flags = regs.gprs[3] & 0xffffffffUL;
+        newsp = regs.orig_gpr2 & 0x7fffffffUL;
+	parent_tidptr = (int *) (regs.gprs[4] & 0x7fffffffUL);
+	child_tidptr = (int *) (regs.gprs[5] & 0x7fffffffUL);
+        if (!newsp)
+                newsp = regs.gprs[15];
+        p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, ®s, 0,
+		    parent_tidptr, child_tidptr);
+	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+}
diff -urN linux-2.5.62/arch/s390x/kernel/process.c linux-2.5.62-s390/arch/s390x/kernel/process.c
--- linux-2.5.62/arch/s390x/kernel/process.c	Mon Feb 24 18:18:38 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/process.c	Mon Feb 24 18:25:00 2003
@@ -206,7 +206,7 @@
 
 	/* Set a new TLS ?  */
 	if (clone_flags & CLONE_SETTLS) {
-		if (current->thread.flags & S390_FLAG_31BIT) {
+		if (test_thread_flag(TIF_31BIT)) {
 			frame->childregs.acrs[0] =
 				(unsigned int) regs->gprs[6];
 		} else {
diff -urN linux-2.5.62/arch/s390x/kernel/ptrace.c linux-2.5.62-s390/arch/s390x/kernel/ptrace.c
--- linux-2.5.62/arch/s390x/kernel/ptrace.c	Mon Feb 24 18:18:38 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/ptrace.c	Mon Feb 24 18:25:00 2003
@@ -58,7 +58,7 @@
 	if (per_info->single_step) {
 		per_info->control_regs.bits.starting_addr = 0;
 #ifdef CONFIG_S390_SUPPORT
-		if (current->thread.flags & S390_FLAG_31BIT)
+		if (test_thread_flag(TIF_31BIT))
 			per_info->control_regs.bits.ending_addr = 0x7fffffffUL;
 		else
 #endif
@@ -290,7 +290,7 @@
 	addr_t offset;
 	__u32 tmp;
 
-	if (!(child->thread.flags & S390_FLAG_31BIT) ||
+	if (!test_thread_flag(TIF_31BIT) ||
 	    (addr & 3) || addr > sizeof(struct user) - 3)
 		return -EIO;
 
@@ -349,9 +349,8 @@
 	per_struct32 *dummy_per32 = NULL;
 	addr_t offset;
 	__u32 tmp;
-	int ret;
 
-	if (!(child->thread.flags & S390_FLAG_31BIT) ||
+	if (!test_thread_flag(TIF_31BIT) ||
 	    (addr & 3) || addr > sizeof(struct user32) - 3)
 		return -EIO;
 
@@ -382,7 +381,7 @@
 		 */
 		if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
 		    (tmp & ~FPC_VALID_MASK) != 0)
-			/* Invalid floating pointer control. */
+			/* Invalid floating point control. */
 			return -EINVAL;
 	        offset = addr - (addr_t) &dummy32->regs.fp_regs;
 		*(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
@@ -542,7 +541,7 @@
 	/* Do requests that differ for 31/64 bit */
 	default:
 #ifdef CONFIG_S390_SUPPORT
-		if (current->thread.flags & S390_FLAG_31BIT)
+		if (test_thread_flag(TIF_31BIT))
 			return do_ptrace_emu31(child, request, addr, data);
 #endif
 		return do_ptrace_normal(child, request, addr, data);
diff -urN linux-2.5.62/arch/s390x/kernel/signal.c linux-2.5.62-s390/arch/s390x/kernel/signal.c
--- linux-2.5.62/arch/s390x/kernel/signal.c	Mon Feb 24 18:18:38 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/signal.c	Mon Feb 24 18:25:00 2003
@@ -455,7 +455,7 @@
 	if (!oldset)
 		oldset = ¤t->blocked;
 #ifdef CONFIG_S390_SUPPORT 
-	if (current->thread.flags & S390_FLAG_31BIT) {
+	if (test_thread_flag(TIF_31BIT)) {
 		extern asmlinkage int do_signal32(struct pt_regs *regs, sigset_t *oldset); 
 		return do_signal32(regs, oldset);
         }
diff -urN linux-2.5.62/arch/s390x/kernel/signal32.c linux-2.5.62-s390/arch/s390x/kernel/signal32.c
--- linux-2.5.62/arch/s390x/kernel/signal32.c	Mon Feb 17 23:56:14 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/signal32.c	Mon Feb 24 18:25:00 2003
@@ -556,7 +556,7 @@
 handle_signal32(unsigned long sig, siginfo_t *info, sigset_t *oldset,
 	struct pt_regs * regs)
 {
-	struct k_sigaction *ka = ¤t->sig->action[sig-1];
+	struct k_sigaction *ka = ¤t->sighand->action[sig-1];
 
 	/* Are we from a system call? */
 	if (regs->trap == __LC_SVC_OLD_PSW) {
diff -urN linux-2.5.62/arch/s390x/kernel/sys_s390.c linux-2.5.62-s390/arch/s390x/kernel/sys_s390.c
--- linux-2.5.62/arch/s390x/kernel/sys_s390.c	Mon Feb 17 23:56:55 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/sys_s390.c	Mon Feb 24 18:25:00 2003
@@ -117,6 +117,38 @@
 	return error;
 }
 
+unsigned long
+arch_get_unmapped_area(struct file *filp, unsigned long addr,
+		       unsigned long len, unsigned long pgoff,
+		       unsigned long flags)
+{
+	struct vm_area_struct *vma;
+	unsigned long end;
+
+	if (test_thread_flag(TIF_31BIT)) { 
+		if (!addr) 
+			addr = 0x40000000; 
+		end = 0x80000000;		
+	} else { 
+		if (!addr) 
+			addr = TASK_SIZE / 2;
+		end = TASK_SIZE; 
+	}
+
+	if (len > end)
+		return -ENOMEM;
+	addr = PAGE_ALIGN(addr);
+
+	for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
+		/* At this point:  (!vma || addr < vma->vm_end). */
+		if (end - len < addr)
+			return -ENOMEM;
+		if (!vma || addr + len <= vma->vm_start)
+			return addr;
+		addr = vma->vm_end;
+	}
+}
+
 extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
 
 /*
diff -urN linux-2.5.62/arch/s390x/kernel/wrapper32.S linux-2.5.62-s390/arch/s390x/kernel/wrapper32.S
--- linux-2.5.62/arch/s390x/kernel/wrapper32.S	Mon Feb 17 23:57:18 2003
+++ linux-2.5.62-s390/arch/s390x/kernel/wrapper32.S	Mon Feb 24 18:25:00 2003
@@ -1204,3 +1204,8 @@
 sys32_exit_group_wrapper:
 	lgfr	%r2,%r2			# int
 	jg	sys_exit_group		# branch to system call
+
+	.globl  sys32_set_tid_address_wrapper
+sys32_set_tid_address_wrapper:
+	llgtr	%r2,%r2			# int *
+	jg	sys_set_tid_address	# branch to system call
diff -urN linux-2.5.62/include/asm-s390x/compat.h linux-2.5.62-s390/include/asm-s390x/compat.h
--- linux-2.5.62/include/asm-s390x/compat.h	Mon Feb 17 23:56:15 2003
+++ linux-2.5.62-s390/include/asm-s390x/compat.h	Mon Feb 24 18:25:00 2003
@@ -49,11 +49,11 @@
 	u32		st_blksize;
 	u32		st_blocks;
 	u32		st_atime;
-	u32		__unused1;
+	u32		st_atime_nsec;
 	u32		st_mtime;
-	u32		__unused2;
+	u32		st_mtime_nsec;
 	u32		st_ctime;
-	u32		__unused3;
+	u32		st_ctime_nsec;
 	u32		__unused4;
 	u32		__unused5;
 };
diff -urN linux-2.5.62/include/asm-s390x/elf.h linux-2.5.62-s390/include/asm-s390x/elf.h
--- linux-2.5.62/include/asm-s390x/elf.h	Mon Feb 17 23:56:15 2003
+++ linux-2.5.62-s390/include/asm-s390x/elf.h	Mon Feb 24 18:25:00 2003
@@ -39,7 +39,7 @@
 #define ELF_PLAT_INIT(_r) \
 	do { \
 	_r->gprs[14] = 0; \
-	current->thread.flags = 0; \
+	clear_thread_flag(TIF_31BIT); \
 	} while(0)
 
 #define USE_ELF_CORE_DUMP
@@ -83,6 +83,7 @@
 		set_personality(PER_SVR4);		\
 	else if (current->personality != PER_LINUX32)	\
 		set_personality(PER_LINUX);		\
+	clear_thread_flag(TIF_31BIT);			\
 } while (0)
 #endif
 
diff -urN linux-2.5.62/include/asm-s390x/pgtable.h linux-2.5.62-s390/include/asm-s390x/pgtable.h
--- linux-2.5.62/include/asm-s390x/pgtable.h	Mon Feb 17 23:56:13 2003
+++ linux-2.5.62-s390/include/asm-s390x/pgtable.h	Mon Feb 24 18:25:00 2003
@@ -544,5 +544,7 @@
  */
 #define pgtable_cache_init()	do { } while (0)
 
+#define HAVE_ARCH_UNMAPPED_AREA
+
 #endif /* _S390_PAGE_H */
 
diff -urN linux-2.5.62/include/asm-s390x/processor.h linux-2.5.62-s390/include/asm-s390x/processor.h
--- linux-2.5.62/include/asm-s390x/processor.h	Mon Feb 17 23:56:49 2003
+++ linux-2.5.62-s390/include/asm-s390x/processor.h	Mon Feb 24 18:25:00 2003
@@ -55,8 +55,6 @@
 /* Lazy FPU handling on uni-processor */
 extern struct task_struct *last_task_used_math;
 
-#define S390_FLAG_31BIT 0x01UL
-
 /*
  * User space process size: 4TB (default).
  */
@@ -66,8 +64,8 @@
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
  */
-#define TASK_UNMAPPED_BASE      ((current->thread.flags & S390_FLAG_31BIT) ? \
-	(TASK31_SIZE / 2) : (TASK_SIZE / 2))
+#define TASK_UNMAPPED_BASE \
+	(test_thread_flag(TIF_31BIT) ? (TASK31_SIZE / 2) : (TASK_SIZE / 2))
 
 #define THREAD_SIZE (4*PAGE_SIZE)
 
diff -urN linux-2.5.62/include/asm-s390x/thread_info.h linux-2.5.62-s390/include/asm-s390x/thread_info.h
--- linux-2.5.62/include/asm-s390x/thread_info.h	Mon Feb 17 23:56:26 2003
+++ linux-2.5.62-s390/include/asm-s390x/thread_info.h	Mon Feb 24 18:25:00 2003
@@ -77,6 +77,7 @@
 #define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling 
 					   TIF_NEED_RESCHED */
+#define TIF_31BIT		18	/* 32bit process */ 
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
@@ -85,6 +86,7 @@
 #define _TIF_RESTART_SVC	(1<<TIF_RESTART_SVC)
 #define _TIF_USEDFPU		(1<<TIF_USEDFPU)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
+#define _TIF_31BIT		(1<<TIF_31BIT)
 
 #endif /* __KERNEL__ */
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/