]> git.hungrycats.org Git - linux/commitdiff
[PATCH] s390: core fixes.
authorAndrew Morton <akpm@osdl.org>
Sat, 27 Mar 2004 05:00:23 +0000 (21:00 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 27 Mar 2004 05:00:23 +0000 (21:00 -0800)
From: Martin Schwidefsky <schwidefsky@de.ibm.com>

s390 core changes:
 - Fix return type of some system call functions (long vs. int).
 - Fix prototypes for compat system call handlers.
 - Correct some bugs in the compat system call wrappers.
 - Fix broken pointer arithmetic which causes problems with
   gcc 3.4 and -march=z990
 - Remove unnecessary #ifndef & optimize inline assemblies in spinlock.h.
 - Improve handling of deferred condition code 1.
 - New default configuration.

arch/s390/defconfig
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_signal.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/process.c
arch/s390/kernel/ptrace.c
arch/s390/kernel/setup.c
arch/s390/kernel/sys_s390.c
drivers/s390/cio/device_fsm.c
include/asm-s390/spinlock.h
include/asm-s390/unistd.h

index 123fcb72fb8034581ddd57799528193f51031cdf..e73820a498a59bd632152289ed99e2118c35001b 100644 (file)
@@ -21,9 +21,11 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=17
-# CONFIG_IKCONFIG is not set
+CONFIG_HOTPLUG=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
 # CONFIG_EMBEDDED is not set
-# CONFIG_KALLSYMS is not set
+CONFIG_KALLSYMS=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
@@ -84,6 +86,7 @@ CONFIG_PFAULT=y
 # Generic Driver Options
 #
 # CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
 
 #
 # SCSI device support
@@ -109,6 +112,12 @@ CONFIG_SCSI_MULTI_LUN=y
 CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
 
+#
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
 #
 # SCSI low-level drivers
 #
@@ -185,7 +194,6 @@ CONFIG_S390_TAPE_BLOCK=y
 # S/390 tape hardware support
 #
 CONFIG_S390_TAPE_34XX=m
-CONFIG_HOTPLUG=y
 
 #
 # Networking support
@@ -199,7 +207,7 @@ CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 # CONFIG_NETLINK_DEV is not set
 CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
+CONFIG_NET_KEY=y
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
@@ -208,7 +216,6 @@ CONFIG_IP_MULTICAST=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -222,11 +229,12 @@ CONFIG_IPV6=y
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_NETFILTER is not set
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -247,6 +255,7 @@ CONFIG_IPV6_SCTP__=y
 CONFIG_NET_SCHED=y
 CONFIG_NET_SCH_CBQ=m
 # CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
 CONFIG_NET_SCH_CSZ=m
 CONFIG_NET_SCH_PRIO=m
 CONFIG_NET_SCH_RED=m
@@ -255,6 +264,7 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
+# CONFIG_NET_SCH_DELAY is not set
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
 CONFIG_NET_CLS=y
@@ -303,6 +313,7 @@ CONFIG_NET_ETHERNET=y
 #
 # CONFIG_TR is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -340,6 +351,8 @@ CONFIG_CCWGROUP=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # File systems
@@ -380,7 +393,6 @@ CONFIG_FS_MBCACHE=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 # CONFIG_HUGETLB_PAGE is not set
@@ -392,6 +404,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -417,7 +430,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -484,7 +497,9 @@ CONFIG_CRYPTO=y
 # CONFIG_CRYPTO_AES is not set
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 # CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
 # CONFIG_CRYPTO_TEST is not set
 
 #
index ea7e709246576197ee89ca74176bef005541c850..8f26dad738265f48d9e61fbbe0b288e7af42bfe9 100644 (file)
@@ -298,7 +298,7 @@ static inline long put_tv32(struct compat_timeval *o, struct timeval *i)
  *
  * This is really horribly ugly.
  */
-asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr)
+asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
 {
        if(call >> 16) /* hack for backward compatibility */
                return -EINVAL;
@@ -360,7 +360,7 @@ asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr)
        return -EINVAL;
 }
 
-asmlinkage int sys32_truncate64(const char * path, unsigned long high, unsigned long low)
+asmlinkage long sys32_truncate64(const char * path, unsigned long high, unsigned long low)
 {
        if ((int)high < 0)
                return -EINVAL;
@@ -368,7 +368,7 @@ asmlinkage int sys32_truncate64(const char * path, unsigned long high, unsigned
                return sys_truncate(path, (high << 32) | low);
 }
 
-asmlinkage int sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
+asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
 {
        if ((int)high < 0)
                return -EINVAL;
@@ -479,7 +479,7 @@ out:
        return retval;
 }
 
-asmlinkage long sys32_readv(int fd, struct compat_iovec *vector, u32 count)
+asmlinkage long sys32_readv(int fd, struct compat_iovec *vector, unsigned long count)
 {
        struct file *file;
        long ret = -EBADF;
@@ -497,7 +497,7 @@ bad_file:
        return ret;
 }
 
-asmlinkage long sys32_writev(int fd, struct compat_iovec *vector, u32 count)
+asmlinkage long sys32_writev(int fd, struct compat_iovec *vector, unsigned long count)
 {
        struct file *file;
        int ret = -EBADF;
@@ -549,7 +549,7 @@ static int fillonedir(void * __buf, const char * name, int namlen,
        return 0;
 }
 
-asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 *dirent, unsigned int count)
+asmlinkage long old32_readdir(unsigned int fd, struct old_linux_dirent32 *dirent, unsigned int count)
 {
        int error = -EBADF;
        struct file * file;
@@ -611,7 +611,7 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset, i
        return 0;
 }
 
-asmlinkage int sys32_getdents(unsigned int fd, struct linux_dirent32 *dirent, unsigned int count)
+asmlinkage long sys32_getdents(unsigned int fd, struct linux_dirent32 *dirent, unsigned int count)
 {
        struct file * file;
        struct linux_dirent32 * lastdirent;
@@ -706,10 +706,10 @@ set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset)
 #define MAX_SELECT_SECONDS \
        ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
 
-asmlinkage int sys32_select(int n, u32 *inp, u32 *outp, u32 *exp, u32 tvp_x)
+asmlinkage long sys32_select(int n, u32 *inp, u32 *outp, u32 *exp,
+                               struct compat_timeval *tvp)
 {
        fd_set_bits fds;
-       struct compat_timeval *tvp = (struct compat_timeval *)AA(tvp_x);
        char *bits;
        unsigned long nn;
        long timeout;
@@ -914,7 +914,7 @@ static int copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
 #define SMBFS_NAME     "smbfs"
 #define NCPFS_NAME     "ncpfs"
 
-asmlinkage int sys32_mount(char *dev_name, char *dir_name, char *type, unsigned long new_flags, u32 data)
+asmlinkage long sys32_mount(char *dev_name, char *dir_name, char *type, unsigned long new_flags, void *data)
 {
        unsigned long type_page = 0;
        unsigned long data_page = 0;
@@ -936,7 +936,7 @@ asmlinkage int sys32_mount(char *dev_name, char *dir_name, char *type, unsigned
        is_smb = !strcmp((char *)type_page, SMBFS_NAME);
        is_ncp = !strcmp((char *)type_page, NCPFS_NAME);
 
-       err = copy_mount_stuff_to_kernel((const void *)AA(data), &data_page);
+       err = copy_mount_stuff_to_kernel(data, &data_page);
        if (err)
                goto type_out;
 
@@ -996,7 +996,7 @@ struct sysinfo32 {
         char _f[8];
 };
 
-asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
+asmlinkage long sys32_sysinfo(struct sysinfo32 __user *info)
 {
        struct sysinfo s;
        int ret, err;
@@ -1024,7 +1024,7 @@ asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
        return ret;
 }
 
-asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
+asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid,
                                struct compat_timespec __user *interval)
 {
        struct timespec t;
@@ -1039,8 +1039,8 @@ asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
        return ret;
 }
 
-asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
-                       compat_sigset_t __user *oset, compat_size_t sigsetsize)
+asmlinkage long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
+                       compat_sigset_t __user *oset, size_t sigsetsize)
 {
        sigset_t s;
        compat_sigset_t s32;
@@ -1074,8 +1074,8 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
        return 0;
 }
 
-asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *set,
-                               compat_size_t sigsetsize)
+asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set,
+                               size_t sigsetsize)
 {
        sigset_t s;
        compat_sigset_t s32;
@@ -1101,9 +1101,9 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *set,
 extern int
 copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from);
 
-asmlinkage int
+asmlinkage long
 sys32_rt_sigtimedwait(compat_sigset_t *uthese, siginfo_t32 *uinfo,
-                     struct compat_timespec *uts, compat_size_t sigsetsize)
+                     struct compat_timespec *uts, size_t sigsetsize)
 {
        int ret, sig;
        sigset_t these;
@@ -1182,7 +1182,7 @@ sys32_rt_sigtimedwait(compat_sigset_t *uthese, siginfo_t32 *uinfo,
        return ret;
 }
 
-asmlinkage int
+asmlinkage long
 sys32_rt_sigqueueinfo(int pid, int sig, siginfo_t32 __user *uinfo)
 {
        siginfo_t info;
@@ -1384,7 +1384,7 @@ out_file:
  * sys32_execve() executes a new program after the asm stub has set
  * things up for us.  This should basically do what I want it to.
  */
-asmlinkage int
+asmlinkage long
 sys32_execve(struct pt_regs regs)
 {
         int error;
@@ -1412,14 +1412,14 @@ out:
 
 #ifdef CONFIG_MODULES
 
-asmlinkage int
+asmlinkage long
 sys32_init_module(void __user *umod, unsigned long len,
                const char __user *uargs)
 {
        return sys_init_module(umod, len, uargs);
 }
 
-asmlinkage int
+asmlinkage long
 sys32_delete_module(const char __user *name_user, unsigned int flags)
 {
        return sys_delete_module(name_user, flags);
@@ -1427,14 +1427,14 @@ sys32_delete_module(const char __user *name_user, unsigned int flags)
 
 #else /* CONFIG_MODULES */
 
-asmlinkage int
+asmlinkage long
 sys32_init_module(void __user *umod, unsigned long len,
                const char __user *uargs)
 {
        return -ENOSYS;
 }
 
-asmlinkage int
+asmlinkage long
 sys32_delete_module(const char __user *name_user, unsigned int flags)
 {
        return -ENOSYS;
@@ -1599,7 +1599,7 @@ static int nfs_getfh32_res_trans(union nfsctl_res *kres, union nfsctl_res32 *res
        return copy_to_user(res32, kres, sizeof(*res32)) ? -EFAULT : 0;
 }
 
-int asmlinkage sys32_nfsservctl(int cmd, struct nfsctl_arg32 *arg32, union nfsctl_res32 *res32)
+long asmlinkage sys32_nfsservctl(int cmd, struct nfsctl_arg32 *arg32, union nfsctl_res32 *res32)
 {
        struct nfsctl_arg *karg = NULL;
        union nfsctl_res *kres = NULL;
@@ -1667,7 +1667,7 @@ done:
 
 extern struct timezone sys_tz;
 
-asmlinkage int sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz)
+asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz)
 {
        if (tv) {
                struct timeval ktv;
@@ -1696,7 +1696,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
        return 0;
 }
 
-asmlinkage int sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz)
+asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz)
 {
        struct timespec kts;
        struct timezone ktz;
@@ -1714,23 +1714,23 @@ asmlinkage int sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz
 }
 
 /* These are here just in case some old sparc32 binary calls it. */
-asmlinkage int sys32_pause(void)
+asmlinkage long sys32_pause(void)
 {
        current->state = TASK_INTERRUPTIBLE;
        schedule();
        return -ERESTARTNOHAND;
 }
 
-asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, char *ubuf,
-                                compat_size_t count, u32 poshi, u32 poslo)
+asmlinkage long sys32_pread64(unsigned int fd, char *ubuf,
+                               size_t count, u32 poshi, u32 poslo)
 {
        if ((compat_ssize_t) count < 0)
                return -EINVAL;
        return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
 }
 
-asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, char *ubuf,
-                                 compat_size_t count, u32 poshi, u32 poslo)
+asmlinkage long sys32_pwrite64(unsigned int fd, const char *ubuf,
+                               size_t count, u32 poshi, u32 poslo)
 {
        if ((compat_ssize_t) count < 0)
                return -EINVAL;
@@ -1742,7 +1742,7 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun
        return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);
 }
 
-asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 count)
+asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size_t count)
 {
        mm_segment_t old_fs = get_fs();
        int ret;
@@ -1761,7 +1761,7 @@ asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 c
        return ret;
 }
 
-asmlinkage int sys32_sendfile64(int out_fd, int in_fd, 
+asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
                                compat_loff_t *offset, s32 count)
 {
        mm_segment_t old_fs = get_fs();
@@ -1798,7 +1798,7 @@ struct timex32 {
 
 extern int do_adjtimex(struct timex *);
 
-asmlinkage int sys32_adjtimex(struct timex32 *utp)
+asmlinkage long sys32_adjtimex(struct timex32 *utp)
 {
        struct timex txc;
        int ret;
@@ -1951,7 +1951,7 @@ static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat)
        return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 
 }
 
-asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf, long flags)
+asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf)
 {
        struct kstat stat;
        int ret = vfs_stat(filename, &stat);
@@ -1960,7 +1960,7 @@ asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf, lon
        return ret;
 }
 
-asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf, long flags)
+asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf)
 {
        struct kstat stat;
        int ret = vfs_lstat(filename, &stat);
@@ -1969,7 +1969,7 @@ asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf, lo
        return ret;
 }
 
-asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf, long flags)
+asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf)
 {
        struct kstat stat;
        int ret = vfs_fstat(fd, &stat);
@@ -2056,7 +2056,7 @@ out:
        return error;
 }
 
-asmlinkage compat_ssize_t sys32_read(unsigned int fd, char * buf, size_t count)
+asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count)
 {
        if ((compat_ssize_t) count < 0)
                return -EINVAL; 
@@ -2064,7 +2064,7 @@ asmlinkage compat_ssize_t sys32_read(unsigned int fd, char * buf, size_t count)
        return sys_read(fd, buf, count);
 }
 
-asmlinkage compat_ssize_t sys32_write(unsigned int fd, char * buf, size_t count)
+asmlinkage long sys32_write(unsigned int fd, char * buf, size_t count)
 {
        if ((compat_ssize_t) count < 0)
                return -EINVAL; 
@@ -2072,7 +2072,7 @@ asmlinkage compat_ssize_t sys32_write(unsigned int fd, char * buf, size_t count)
        return sys_write(fd, buf, count);
 }
 
-asmlinkage int sys32_clone(struct pt_regs regs)
+asmlinkage long sys32_clone(struct pt_regs regs)
 {
         unsigned long clone_flags;
         unsigned long newsp;
index a76cceabe3c40b352756bfd91a1eedc1d80e0bcf..9e1d4b10802e1f53c8adef77c753b34aab5d9e1e 100644 (file)
@@ -161,7 +161,7 @@ sys32_rt_sigsuspend(struct pt_regs * regs,compat_sigset_t *unewset, size_t sigse
         }
 }                                                         
 
-asmlinkage int
+asmlinkage long
 sys32_sigaction(int sig, const struct old_sigaction32 *act,
                 struct old_sigaction32 *oact)
 {
@@ -254,7 +254,7 @@ sys32_rt_sigaction(int sig, const struct sigaction32 *act,
        return ret;
 }
 
-asmlinkage int
+asmlinkage long
 sys32_sigaltstack(const stack_t32 *uss, stack_t32 *uoss, struct pt_regs *regs)
 {
        stack_t kss, koss;
index c911dd4dd2700bf210782b8e7cad95c070213782..6dd70ad35cd766f8ed95c14a7e35f6f8d555cbcc 100644 (file)
@@ -126,7 +126,7 @@ sys32_ptrace_wrapper:
 
        .globl  sys32_alarm_wrapper 
 sys32_alarm_wrapper:
-       llgtr   %r2,%r2                 # unsigned int
+       llgfr   %r2,%r2                 # unsigned int
        jg      sys_alarm               # branch to system call
 
 #sys32_pause_wrapper                   # void 
@@ -203,7 +203,7 @@ sys32_setgid16_wrapper:
        .globl sys32_signal_wrapper
 sys32_signal_wrapper:
        lgfr    %r2,%r2                 # int 
-       llgfr   %r3,%r3                 # __sighandler_t 
+       llgtr   %r3,%r3                 # __sighandler_t
        jg      sys_signal
 
 #sys32_geteuid16_wrapper               # void 
@@ -243,7 +243,7 @@ sys32_setpgid_wrapper:
 
        .globl  sys32_umask_wrapper 
 sys32_umask_wrapper:
-       lgfr    %r3,%r3                 # int
+       lgfr    %r2,%r2                 # int
        jg      sys_umask               # branch to system call
 
        .globl  sys32_chroot_wrapper 
@@ -273,6 +273,7 @@ sys32_dup2_wrapper:
 sys32_sigaction_wrapper:
        lgfr    %r2,%r2                 # int 
        llgtr   %r3,%r3                 # const struct old_sigaction *
+       llgtr   %r4,%r4                 # struct old_sigaction32 *
        jg      sys32_sigaction         # branch to system call
 
        .globl  sys32_setreuid16_wrapper 
@@ -424,8 +425,8 @@ sys32_fchmod_wrapper:
        .globl  sys32_fchown16_wrapper 
 sys32_fchown16_wrapper:
        llgfr   %r2,%r2                 # unsigned int
-       llgtr   %r3,%r3                 # __kernel_old_uid_emu31_t *
-       llgtr   %r4,%r4                 # __kernel_old_gid_emu31_t *
+       llgfr   %r3,%r3                 # compat_uid_t
+       llgfr   %r4,%r4                 # compat_uid_t
        jg      sys32_fchown16          # branch to system call
 
        .globl  sys32_getpriority_wrapper 
@@ -523,7 +524,7 @@ sys32_ipc_wrapper:
        lgfr    %r3,%r3                 # int
        lgfr    %r4,%r4                 # int
        lgfr    %r5,%r5                 # int
-       llgtr   %r6,%r6                 # void *
+       llgfr   %r6,%r6                 # u32
        jg      sys32_ipc               # branch to system call
 
        .globl  sys32_fsync_wrapper 
@@ -580,9 +581,9 @@ sys32_delete_module_wrapper:
 
        .globl  sys32_quotactl_wrapper 
 sys32_quotactl_wrapper:
-       lgfr    %r2,%r2                 # int
+       llgfr   %r2,%r2                 # unsigned int
        llgtr   %r3,%r3                 # const char *
-       lgfr    %r4,%r4                 # int
+       llgfr   %r4,%r4                 # qid_t
        llgtr   %r5,%r5                 # caddr_t
        jg      sys_quotactl            # branch to system call
 
@@ -664,14 +665,14 @@ sys32_msync_wrapper:
 
        .globl  sys32_readv_wrapper 
 sys32_readv_wrapper:
-       llgfr   %r2,%r2                 # unsigned long
+       lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # const struct iovec_emu31 *
        llgfr   %r4,%r4                 # unsigned long
        jg      sys32_readv             # branch to system call
 
        .globl  sys32_writev_wrapper 
 sys32_writev_wrapper:
-       llgfr   %r2,%r2                 # unsigned long
+       lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # const struct iovec_emu31 *
        llgfr   %r4,%r4                 # unsigned long
        jg      sys32_writev            # branch to system call
@@ -830,6 +831,7 @@ sys32_rt_sigprocmask_wrapper:
        lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # old_sigset_emu31 *
        llgtr   %r4,%r4                 # old_sigset_emu31 *
+       llgfr   %r5,%r5                 # size_t
        jg      sys32_rt_sigprocmask    # branch to system call
 
        .globl  sys32_rt_sigpending_wrapper 
@@ -917,15 +919,15 @@ sys32_sendfile_wrapper:
        .globl  sys32_truncate64_wrapper 
 sys32_truncate64_wrapper:
        llgtr   %r2,%r2                 # const char *
-       lgfr    %r3,%r3                 # s32 
-       llgfr   %r4,%r4                 # u32 
+       llgfr   %r3,%r3                 # unsigned long
+       llgfr   %r4,%r4                 # unsigned long
        jg      sys32_truncate64        # branch to system call
 
        .globl  sys32_ftruncate64_wrapper 
 sys32_ftruncate64_wrapper:
        llgfr   %r2,%r2                 # unsigned int
-       lgfr    %r3,%r3                 # s32 
-       llgfr   %r4,%r4                 # u32 
+       llgfr   %r3,%r3                 # unsigned long
+       llgfr   %r4,%r4                 # unsigned long
        jg      sys32_ftruncate64       # branch to system call
 
        .globl sys32_lchown_wrapper     
@@ -1064,14 +1066,12 @@ compat_sys_fcntl64_wrapper:
 sys32_stat64_wrapper:
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # struct stat64 *
-       llgfr   %r4,%r4                 # long
        jg      sys32_stat64            # branch to system call
 
        .globl  sys32_lstat64_wrapper
 sys32_lstat64_wrapper:
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # struct stat64 *
-       llgfr   %r4,%r4                 # long
        jg      sys32_lstat64           # branch to system call
 
        .globl  sys32_stime_wrapper
@@ -1088,7 +1088,6 @@ sys32_sysctl_wrapper:
 sys32_fstat64_wrapper:
        llgfr   %r2,%r2                 # unsigned long
        llgtr   %r3,%r3                 # struct stat64 *
-       llgfr   %r4,%r4                 # long
        jg      sys32_fstat64           # branch to system call
 
        .globl  compat_sys_futex_wrapper 
index 9029c0e6ff0cb06d48399f68d385e273f6216dc1..8fe028cf9733950c7111438a4a6e90b507a9bf73 100644 (file)
@@ -277,12 +277,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
         return 0;
 }
 
-asmlinkage int sys_fork(struct pt_regs regs)
+asmlinkage long sys_fork(struct pt_regs regs)
 {
        return do_fork(SIGCHLD, regs.gprs[15], &regs, 0, NULL, NULL);
 }
 
-asmlinkage int sys_clone(struct pt_regs regs)
+asmlinkage long sys_clone(struct pt_regs regs)
 {
         unsigned long clone_flags;
         unsigned long newsp;
@@ -308,7 +308,7 @@ asmlinkage int sys_clone(struct pt_regs regs)
  * do not have enough call-clobbered registers to hold all
  * the information you need.
  */
-asmlinkage int sys_vfork(struct pt_regs regs)
+asmlinkage long sys_vfork(struct pt_regs regs)
 {
        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
                       regs.gprs[15], &regs, 0, NULL, NULL);
@@ -317,7 +317,7 @@ asmlinkage int sys_vfork(struct pt_regs regs)
 /*
  * sys_execve() executes a new program.
  */
-asmlinkage int sys_execve(struct pt_regs regs)
+asmlinkage long sys_execve(struct pt_regs regs)
 {
         int error;
         char * filename;
index 0845a86b57a14a5384de2f69c5d2d055103ddbfe..4867dbc8a7a84ab89b7a8e30573a9c093cb23f8e 100644 (file)
@@ -616,7 +616,7 @@ do_ptrace(struct task_struct *child, long request, long addr, long data)
        return -EIO;
 }
 
-asmlinkage int
+asmlinkage long
 sys_ptrace(long request, long pid, long addr, long data)
 {
        struct task_struct *child;
index fc703b1e363aeacf82aa829303d0bf69db119e2c..da079e3a6d40a0f7594f5a129c26c45ca5a7cf20 100644 (file)
@@ -492,20 +492,20 @@ void __init setup_arch(char **cmdline_p)
 #endif /* CONFIG_ARCH_S390X */
        lc->restart_psw.mask = PSW_BASE_BITS;
        lc->restart_psw.addr =
-               PSW_ADDR_AMODE + (unsigned long) restart_int_handler;
+               PSW_ADDR_AMODE | (unsigned long) restart_int_handler;
        lc->external_new_psw.mask = PSW_KERNEL_BITS;
        lc->external_new_psw.addr =
-               PSW_ADDR_AMODE + (unsigned long) ext_int_handler;
+               PSW_ADDR_AMODE | (unsigned long) ext_int_handler;
        lc->svc_new_psw.mask = PSW_KERNEL_BITS;
-       lc->svc_new_psw.addr = PSW_ADDR_AMODE + (unsigned long) system_call;
+       lc->svc_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) system_call;
        lc->program_new_psw.mask = PSW_KERNEL_BITS;
        lc->program_new_psw.addr =
-               PSW_ADDR_AMODE + (unsigned long)pgm_check_handler;
+               PSW_ADDR_AMODE | (unsigned long)pgm_check_handler;
        lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
        lc->mcck_new_psw.addr =
-               PSW_ADDR_AMODE + (unsigned long) mcck_int_handler;
+               PSW_ADDR_AMODE | (unsigned long) mcck_int_handler;
        lc->io_new_psw.mask = PSW_KERNEL_BITS;
-       lc->io_new_psw.addr = PSW_ADDR_AMODE + (unsigned long) io_int_handler;
+       lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler;
        lc->ipl_device = S390_lowcore.ipl_device;
        lc->jiffy_timer = -1LL;
        lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE;
index 119131b2316b4c90efb890525b2f098fe23fcf5e..3599f49352ec5af5f06c98bdf7ff883d9b42b822 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/ipc.h>
 
-#ifndef CONFIG_ARCH_S390X
-#define __SYS_RETTYPE int
-#else
-#define __SYS_RETTYPE long
-#endif /* CONFIG_ARCH_S390X */
-
 /*
  * sys_pipe() is the normal C calling standard for creating
  * a pipe. It's not the way Unix traditionally does this, though.
  */
-asmlinkage __SYS_RETTYPE sys_pipe(unsigned long * fildes)
+asmlinkage long sys_pipe(unsigned long * fildes)
 {
        int fd[2];
        int error;
@@ -61,7 +55,7 @@ static inline long do_mmap2(
        unsigned long prot, unsigned long flags,
        unsigned long fd, unsigned long pgoff)
 {
-       __SYS_RETTYPE error = -EBADF;
+       long error = -EBADF;
        struct file * file = NULL;
 
        flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
@@ -109,10 +103,10 @@ out:
        return error;
 }
 
-asmlinkage __SYS_RETTYPE old_mmap(struct mmap_arg_struct *arg)
+asmlinkage long old_mmap(struct mmap_arg_struct *arg)
 {
        struct mmap_arg_struct a;
-       __SYS_RETTYPE error = -EFAULT;
+       long error = -EFAULT;
 
        if (copy_from_user(&a, arg, sizeof(a)))
                goto out;
@@ -133,7 +127,7 @@ struct sel_arg_struct {
        struct timeval *tvp;
 };
 
-asmlinkage int old_select(struct sel_arg_struct *arg)
+asmlinkage long old_select(struct sel_arg_struct *arg)
 {
        struct sel_arg_struct a;
 
@@ -182,7 +176,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
  *
  * This is really horribly ugly.
  */
-asmlinkage __SYS_RETTYPE sys_ipc (uint call, int first, int second, 
+asmlinkage long sys_ipc (uint call, int first, int second,
                                  unsigned long third, void *ptr)
 {
         struct ipc_kludge tmp;
@@ -246,7 +240,7 @@ asmlinkage __SYS_RETTYPE sys_ipc (uint call, int first, int second,
 }
 
 #ifdef CONFIG_ARCH_S390X
-asmlinkage int s390x_newuname(struct new_utsname * name)
+asmlinkage long s390x_newuname(struct new_utsname * name)
 {
        int ret = sys_newuname(name);
 
@@ -257,7 +251,7 @@ asmlinkage int s390x_newuname(struct new_utsname * name)
        return ret;
 }
 
-asmlinkage int s390x_personality(unsigned long personality)
+asmlinkage long s390x_personality(unsigned long personality)
 {
        int ret;
 
index a925c9b035e4ab71479b1328bf6b03f81386b291..e4d781e2ae493a1e5e8e808cb61fd078b87fa8c9 100644 (file)
@@ -731,6 +731,9 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
                        (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) {
                if (cdev->handler)
                        cdev->handler (cdev, 0, irb);
+               if (irb->scsw.cc == 1)
+                       /* Basic sense hasn't started. Try again. */
+                       ccw_device_do_sense(cdev, irb);
                return;
        }
        /* Add basic sense info to irb. */
@@ -828,6 +831,8 @@ ccw_device_wait4io_irq(struct ccw_device *cdev, enum dev_event dev_event)
                        (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) {
                if (cdev->handler)
                        cdev->handler (cdev, 0, irb);
+               if (irb->scsw.cc == 1)
+                       goto call_handler;
                return;
        }
        /*
@@ -841,6 +846,7 @@ ccw_device_wait4io_irq(struct ccw_device *cdev, enum dev_event dev_event)
                }
                return;
        }
+call_handler:
        /* Iff device is idle, reset timeout. */
        sch = to_subchannel(cdev->dev.parent);
        if (!stsch(sch->irq, &sch->schib))
@@ -908,6 +914,8 @@ ccw_device_stlck_done(struct ccw_device *cdev, enum dev_event dev_event)
                /* Check for unsolicited interrupt. */
                if (irb->scsw.stctl ==
                    (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS))
+                       /* FIXME: we should restart stlck here, but this
+                        * is extremely unlikely ... */
                        goto out_wakeup;
 
                ccw_device_accumulate_irb(cdev, irb);
index 00981f815f3051524fad85db478574ac7ee7bacb..12da8b06104be311e84f9280cc53602a9cc34b65 100644 (file)
  */
 
 typedef struct {
-#ifndef __s390x__
-       volatile unsigned long lock;
-} spinlock_t;
-#else /* __s390x__ */
        volatile unsigned int lock;
 } __attribute__ ((aligned (4))) spinlock_t;
-#endif /* __s390x__ */
 
 #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
 #define spin_lock_init(lp) do { (lp)->lock = 0; } while(0)
@@ -80,11 +75,10 @@ extern inline int _raw_spin_trylock(spinlock_t *lp)
 #else /* __s390x__ */
        unsigned int result, reg;
 #endif /* __s390x__ */
-       __asm__ __volatile("    slr   %0,%0\n"
-                          "    basr  %1,0\n"
+       __asm__ __volatile("    basr  %1,0\n"
                           "0:  cs    %0,%1,0(%3)"
-                          : "=&d" (result), "=&d" (reg), "=m" (lp->lock)
-                          : "a" (&lp->lock), "m" (lp->lock)
+                          : "=d" (result), "=&d" (reg), "=m" (lp->lock)
+                          : "a" (&lp->lock), "m" (lp->lock), "0" (0)
                           : "cc", "memory" );
        return !result;
 }
@@ -224,17 +218,15 @@ extern inline int _raw_write_trylock(rwlock_t *rw)
        
        __asm__ __volatile__(
 #ifndef __s390x__
-                            "   slr  %0,%0\n"
                             "   lhi  %1,1\n"
                             "   sll  %1,31\n"
                             "   cs   %0,%1,0(%3)"
 #else /* __s390x__ */
-                            "   slgr  %0,%0\n"
                             "   llihh %1,0x8000\n"
                             "0: csg %0,%1,0(%3)\n"
 #endif /* __s390x__ */
-                            : "=&d" (result), "=&d" (reg), "=m" (rw->lock)
-                            : "a" (&rw->lock), "m" (rw->lock)
+                            : "=d" (result), "=&d" (reg), "=m" (rw->lock)
+                            : "a" (&rw->lock), "m" (rw->lock), "0" (0)
                             : "cc", "memory" );
        return result == 0;
 }
index 2bd6ebd6d992cd781051a08d6eadc704bc153d99..c605067121c3f62424e8689358d4852b98934a27 100644 (file)
@@ -543,19 +543,14 @@ static inline pid_t waitpid(int pid, int *wait_stat, int flags)
        return sys_wait4(pid, wait_stat, flags, NULL);
 }
 struct mmap_arg_struct;
-asmlinkage long sys_mmap2(struct mmap_arg_struct *arg);
+asmlinkage long sys_mmap2(struct mmap_arg_struct __user *arg);
 
-asmlinkage int sys_execve(struct pt_regs regs);
-asmlinkage int sys_clone(struct pt_regs regs);
-asmlinkage int sys_fork(struct pt_regs regs);
-asmlinkage int sys_vfork(struct pt_regs regs);
-#ifndef CONFIG_ARCH_S390X
-#define __SYS_RETTYPE int
-#else
-#define __SYS_RETTYPE long
-#endif /* CONFIG_ARCH_S390X */
-asmlinkage __SYS_RETTYPE sys_pipe(unsigned long *fildes);
-asmlinkage int sys_ptrace(long request, long pid, long addr, long data);
+asmlinkage long sys_execve(struct pt_regs regs);
+asmlinkage long sys_clone(struct pt_regs regs);
+asmlinkage long sys_fork(struct pt_regs regs);
+asmlinkage long sys_vfork(struct pt_regs regs);
+asmlinkage long sys_pipe(unsigned long __user *fildes);
+asmlinkage long sys_ptrace(long request, long pid, long addr, long data);
 struct sigaction;
 asmlinkage long sys_rt_sigaction(int sig,
                                const struct sigaction __user *act,