OSDN Git Service

Merge tag 'tag-for-linus-3.10' of git://git.linaro.org/people/sumitsemwal/linux-dma-buf
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 1 May 2013 14:44:37 +0000 (07:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 1 May 2013 14:44:37 +0000 (07:44 -0700)
Pull dma-buf updates from Sumit Semwal:
 "Added debugfs support to dma-buf"

* tag 'tag-for-linus-3.10' of git://git.linaro.org/people/sumitsemwal/linux-dma-buf:
  dma-buf: Add debugfs support
  dma-buf: replace dma_buf_export() with dma_buf_export_named()

123 files changed:
arch/Kconfig
arch/alpha/Kconfig
arch/alpha/include/asm/linkage.h
arch/alpha/include/asm/unistd.h
arch/arm/include/asm/unistd.h
arch/arm64/kernel/sys32.S
arch/avr32/include/asm/unistd.h
arch/blackfin/include/asm/unistd.h
arch/cris/include/asm/unistd.h
arch/frv/include/asm/unistd.h
arch/h8300/include/asm/linkage.h
arch/h8300/include/asm/unistd.h
arch/hexagon/Kconfig
arch/hexagon/Makefile
arch/hexagon/include/asm/Kbuild
arch/hexagon/include/asm/atomic.h
arch/hexagon/include/asm/elf.h
arch/hexagon/include/asm/hexagon_vm.h
arch/hexagon/include/asm/io.h
arch/hexagon/include/asm/mem-layout.h
arch/hexagon/include/asm/page.h
arch/hexagon/include/asm/processor.h
arch/hexagon/include/asm/vm_mmu.h
arch/hexagon/include/uapi/asm/ptrace.h
arch/hexagon/include/uapi/asm/registers.h
arch/hexagon/include/uapi/asm/signal.h
arch/hexagon/include/uapi/asm/unistd.h
arch/hexagon/include/uapi/asm/user.h
arch/hexagon/kernel/Makefile
arch/hexagon/kernel/asm-offsets.c
arch/hexagon/kernel/dma.c
arch/hexagon/kernel/head.S
arch/hexagon/kernel/kgdb.c
arch/hexagon/kernel/process.c
arch/hexagon/kernel/ptrace.c
arch/hexagon/kernel/setup.c
arch/hexagon/kernel/signal.c
arch/hexagon/kernel/topology.c [deleted file]
arch/hexagon/kernel/traps.c
arch/hexagon/kernel/vm_entry.S
arch/hexagon/kernel/vm_events.c
arch/hexagon/kernel/vm_vectors.S
arch/hexagon/kernel/vmlinux.lds.S
arch/hexagon/mm/init.c
arch/hexagon/mm/vm_fault.c
arch/ia64/include/asm/linkage.h
arch/ia64/include/asm/unistd.h
arch/m32r/include/asm/unistd.h
arch/m68k/include/asm/unistd.h
arch/microblaze/include/asm/unistd.h
arch/mips/Kconfig
arch/mips/include/asm/linkage.h
arch/mips/include/asm/unistd.h
arch/mips/kernel/linux32.c
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/mn10300/include/asm/unistd.h
arch/openrisc/Kconfig
arch/parisc/include/asm/unistd.h
arch/parisc/kernel/sys_parisc32.c
arch/parisc/kernel/syscall_table.S
arch/powerpc/Kconfig
arch/powerpc/include/asm/linkage.h [new file with mode: 0644]
arch/powerpc/include/asm/systbl.h
arch/powerpc/include/asm/unistd.h
arch/powerpc/include/uapi/asm/linkage.h [deleted file]
arch/powerpc/kernel/sys_ppc32.c
arch/s390/Kconfig
arch/s390/include/asm/unistd.h
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_linux.h
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/sys_s390.c
arch/s390/kernel/syscalls.S
arch/sh/include/asm/unistd.h
arch/sparc/Kconfig
arch/sparc/include/asm/unistd.h
arch/sparc/kernel/sys32.S
arch/sparc/kernel/sys_sparc32.c
arch/sparc/kernel/sys_sparc_64.c
arch/sparc/kernel/systbls_64.S
arch/tile/Kconfig
arch/tile/kernel/compat.c
arch/x86/ia32/Makefile
arch/x86/ia32/ipc32.c [deleted file]
arch/x86/ia32/sys_ia32.c
arch/x86/include/asm/sys_ia32.h
arch/x86/include/asm/syscalls.h
arch/x86/include/asm/unistd.h
arch/x86/kernel/tls.c
arch/x86/syscalls/syscall_32.tbl
arch/x86/um/tls_32.c
arch/xtensa/include/asm/unistd.h
drivers/tty/pty.c
drivers/tty/tty_io.c
fs/aio.c
fs/compat.c
fs/dcookies.c
fs/eventpoll.c
fs/notify/fanotify/fanotify_user.c
fs/open.c
fs/read_write.c
fs/read_write.h
fs/signalfd.c
fs/splice.c
fs/sync.c
include/asm-generic/unistd.h
include/linux/compat.h
include/linux/linkage.h
include/linux/mm.h
include/linux/syscalls.h
ipc/compat.c
ipc/sem.c
ipc/syscall.c
kernel/compat.c
kernel/exit.c
kernel/fork.c
kernel/sys.c
kernel/sys_ni.c
kernel/uid16.c
mm/fadvise.c
mm/nommu.c
mm/readahead.c

index 1455579..99f0e17 100644 (file)
@@ -157,9 +157,6 @@ config ARCH_USE_BUILTIN_BSWAP
         instructions should set this. And it shouldn't hurt to set it
         on architectures that don't have such instructions.
 
-config HAVE_SYSCALL_WRAPPERS
-       bool
-
 config KRETPROBES
        def_bool y
        depends on KPROBES && HAVE_KRETPROBES
index 8a33ba0..8629127 100644 (file)
@@ -4,7 +4,6 @@ config ALPHA
        select HAVE_AOUT
        select HAVE_IDE
        select HAVE_OPROFILE
-       select HAVE_SYSCALL_WRAPPERS
        select HAVE_PCSPKR_PLATFORM
        select HAVE_PERF_EVENTS
        select HAVE_DMA_ATTRS
index 291c2d0..7cfd06e 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef __ASM_LINKAGE_H
 #define __ASM_LINKAGE_H
 
-/* Nothing to see here... */
+#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall")
+#define SYSCALL_ALIAS(alias, name)                                     \
+       asm ( #alias " = " #name "\n\t.globl " #alias)
 
 #endif
index 6d6fe7a..43baee1 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/* "Conditional" syscalls.  What we want is
-
-       __attribute__((weak,alias("sys_ni_syscall")))
-
-   but that raises the problem of what type to give the symbol.  If we use
-   a prototype, it'll conflict with the definition given in this file and
-   others.  If we use __typeof, we discover that not all symbols actually
-   have declarations.  If we use no prototype, then we get warnings from
-   -Wstrict-prototypes.  Ho hum.  */
-
-#define cond_syscall(x)  asm(".weak\t" #x "\n" #x " = sys_ni_syscall")
-
 #endif /* _ALPHA_UNISTD_H */
index e4ddfb3..141baa3 100644 (file)
 #define __ARCH_WANT_SYS_CLONE
 
 /*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
-/*
  * Unimplemented (or alternatively implemented) syscalls
  */
 #define __IGNORE_fadvise64_64
index 9416d04..db01aa9 100644 (file)
@@ -84,13 +84,6 @@ compat_sys_readahead_wrapper:
        b       sys_readahead
 ENDPROC(compat_sys_readahead_wrapper)
 
-compat_sys_lookup_dcookie:
-       orr     x0, x0, x1, lsl #32
-       mov     w1, w2
-       mov     w2, w3
-       b       sys_lookup_dcookie
-ENDPROC(compat_sys_lookup_dcookie)
-
 compat_sys_fadvise64_64_wrapper:
        mov     w6, w1
        orr     x1, x2, x3, lsl #32
index dc4d5a9..c1eb080 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-
 #endif /* __ASM_AVR32_UNISTD_H */
index 04e83ea..c35414b 100644 (file)
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_VFORK
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t_" #x "\n\t.set\t_" #x ",_sys_ni_syscall");
-
 #endif                         /* __ASM_BFIN_UNISTD_H */
index be57a98..0ff3f68 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _ASM_CRIS_UNISTD_H_ */
index 4cfcc7b..70ec729 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-#endif
-
 #endif /* _ASM_UNISTD_H_ */
index 6f4df7d..1d81604 100644 (file)
@@ -2,7 +2,5 @@
 #define _H8300_LINKAGE_H
 
 #undef SYMBOL_NAME_LABEL
-#undef SYMBOL_NAME
 #define SYMBOL_NAME_LABEL(_name_) _##_name_##:
-#define SYMBOL_NAME(_name_) _##_name_
 #endif
index 6721856..ab671ec 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- */
-#define cond_syscall(name)                                             \
-  asm (".weak\t_" #name "\n"                           \
-       ".set\t_" #name ",_sys_ni_syscall");
-
 #endif /* _ASM_H8300_UNISTD_H_ */
index e4decc6..04dff5b 100644 (file)
@@ -29,21 +29,17 @@ config HEXAGON
        select GENERIC_CLOCKEVENTS
        select GENERIC_CLOCKEVENTS_BROADCAST
        select MODULES_USE_ELF_RELA
+       select GENERIC_CPU_DEVICES
+       select GENERIC_KERNEL_THREAD
+       select GENERIC_KERNEL_EXECVE
        ---help---
          Qualcomm Hexagon is a processor architecture designed for high
          performance and low power across a wide variety of applications.
 
-config HEXAGON_ARCH_V1
-       bool
-
-config HEXAGON_ARCH_V2
-       bool
-
-config HEXAGON_ARCH_V3
-       bool
-
-config HEXAGON_ARCH_V4
-       bool
+config HEXAGON_PHYS_OFFSET
+       def_bool y
+       ---help---
+         Platforms that don't load the kernel at zero set this.
 
 config FRAME_POINTER
        def_bool y
@@ -81,9 +77,6 @@ config RWSEM_GENERIC_SPINLOCK
 config RWSEM_XCHGADD_ALGORITHM
        def_bool y
 
-config GENERIC_FIND_NEXT_BIT
-       def_bool y
-
 config GENERIC_HWEIGHT
        def_bool y
 
@@ -103,14 +96,14 @@ choice
 
 config HEXAGON_COMET
        bool "Comet Board"
-       select HEXAGON_ARCH_V2
        ---help---
          Support for the Comet platform.
 
 endchoice
 
-config HEXAGON_VM
-       def_bool y
+config HEXAGON_ARCH_VERSION
+       int "Architecture version"
+       default 2
 
 config CMDLINE
        string "Default kernel command string"
@@ -122,12 +115,6 @@ config CMDLINE
          minimum, you should specify the memory size and the root device
          (e.g., mem=64M root=/dev/nfs).
 
-config HEXAGON_ANGEL_TRAPS
-       bool "Use Angel Traps"
-       default n
-       ---help---
-         Enable angel debug traps (for printk's).
-
 config SMP
        bool "Multi-Processing support"
        ---help---
index d00d900..207711a 100644 (file)
@@ -15,20 +15,9 @@ KBUILD_CFLAGS += -fno-short-enums
 # LDFLAGS_MODULE += -shared
 CFLAGS_MODULE += -mlong-calls
 
-cflags-$(CONFIG_HEXAGON_ARCH_V1) += $(call cc-option,-mv1)
-cflags-$(CONFIG_HEXAGON_ARCH_V2) += $(call cc-option,-mv2)
-cflags-$(CONFIG_HEXAGON_ARCH_V3) += $(call cc-option,-mv3)
-cflags-$(CONFIG_HEXAGON_ARCH_V4) += $(call cc-option,-mv4)
-
-aflags-$(CONFIG_HEXAGON_ARCH_V1) += $(call cc-option,-mv1)
-aflags-$(CONFIG_HEXAGON_ARCH_V2) += $(call cc-option,-mv2)
-aflags-$(CONFIG_HEXAGON_ARCH_V3) += $(call cc-option,-mv3)
-aflags-$(CONFIG_HEXAGON_ARCH_V4) += $(call cc-option,-mv4)
-
-ldflags-$(CONFIG_HEXAGON_ARCH_V1) += $(call cc-option,-mv1)
-ldflags-$(CONFIG_HEXAGON_ARCH_V2) += $(call cc-option,-mv2)
-ldflags-$(CONFIG_HEXAGON_ARCH_V3) += $(call cc-option,-mv3)
-ldflags-$(CONFIG_HEXAGON_ARCH_V4) += $(call cc-option,-mv4)
+cflags-y += $(call cc-option,-mv${CONFIG_HEXAGON_ARCH_VERSION})
+aflags-y += $(call cc-option,-mv${CONFIG_HEXAGON_ARCH_VERSION})
+ldflags-y += $(call cc-option,-mv${CONFIG_HEXAGON_ARCH_VERSION})
 
 KBUILD_CFLAGS += $(cflags-y)
 KBUILD_AFLAGS += $(aflags-y)
index bdb54ce..1da17ca 100644 (file)
@@ -25,7 +25,6 @@ generic-y += kdebug.h
 generic-y += kmap_types.h
 generic-y += local64.h
 generic-y += local.h
-generic-y += local.h
 generic-y += mman.h
 generic-y += msgbuf.h
 generic-y += pci.h
@@ -41,6 +40,7 @@ generic-y += sembuf.h
 generic-y += shmbuf.h
 generic-y += shmparam.h
 generic-y += siginfo.h
+generic-y += sizes.h
 generic-y += socket.h
 generic-y += sockios.h
 generic-y += statfs.h
index 468fbb0..8a64ff2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Atomic operations for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  *
  * This program is free software; you can redistribute it and/or modify
@@ -117,35 +117,37 @@ static inline int atomic_sub_return(int i, atomic_t *v)
 #define atomic_sub(i, v) atomic_sub_return(i, (v))
 
 /**
- * atomic_add_unless - add unless the number is a given value
+ * __atomic_add_unless - add unless the number is a given value
  * @v: pointer to value
  * @a: amount to add
  * @u: unless value is equal to u
  *
- * Returns 1 if the add happened, 0 if it didn't.
+ * Returns old value.
+ *
  */
+
 static inline int __atomic_add_unless(atomic_t *v, int a, int u)
 {
-       int output, __oldval;
+       int __oldval;
+       register int tmp;
+
        asm volatile(
                "1:     %0 = memw_locked(%2);"
                "       {"
                "               p3 = cmp.eq(%0, %4);"
                "               if (p3.new) jump:nt 2f;"
-               "               %0 = add(%0, %3);"
-               "               %1 = #0;"
+               "               %1 = add(%0, %3);"
                "       }"
-               "       memw_locked(%2, p3) = %0;"
+               "       memw_locked(%2, p3) = %1;"
                "       {"
                "               if !p3 jump 1b;"
-               "               %1 = #1;"
                "       }"
                "2:"
-               : "=&r" (__oldval), "=&r" (output)
+               : "=&r" (__oldval), "=&r" (tmp)
                : "r" (v), "r" (a), "r" (u)
                : "memory", "p3"
        );
-       return output;
+       return __oldval;
 }
 
 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
index 1f14e08..e1b933a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * ELF definitions for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -104,6 +104,16 @@ typedef unsigned long elf_fpregset_t;
  * Bypass the whole "regsets" thing for now and use the define.
  */
 
+#if CONFIG_HEXAGON_ARCH_VERSION >= 4
+#define CS_COPYREGS(DEST,REGS) \
+do {\
+       DEST.cs0 = REGS->cs0;\
+       DEST.cs1 = REGS->cs1;\
+} while (0)
+#else
+#define CS_COPYREGS(DEST,REGS)
+#endif
+
 #define ELF_CORE_COPY_REGS(DEST, REGS) \
 do {                                   \
        DEST.r0 = REGS->r00;            \
@@ -148,13 +158,12 @@ do {                                      \
        DEST.p3_0 = REGS->preds;        \
        DEST.gp = REGS->gp;             \
        DEST.ugp = REGS->ugp;           \
-       DEST.pc = pt_elr(REGS); \
+       CS_COPYREGS(DEST,REGS);         \
+       DEST.pc = pt_elr(REGS);         \
        DEST.cause = pt_cause(REGS);    \
        DEST.badva = pt_badva(REGS);    \
 } while (0);
 
-
-
 /*
  * This is used to ensure we don't load something for the wrong architecture.
  * Checks the machine and ABI type.
@@ -168,15 +177,15 @@ do {                                      \
 #define ELF_DATA       ELFDATA2LSB
 #define ELF_ARCH       EM_HEXAGON
 
-#ifdef CONFIG_HEXAGON_ARCH_V2
+#if CONFIG_HEXAGON_ARCH_VERSION == 2
 #define ELF_CORE_EFLAGS 0x1
 #endif
 
-#ifdef CONFIG_HEXAGON_ARCH_V3
+#if CONFIG_HEXAGON_ARCH_VERSION == 3
 #define ELF_CORE_EFLAGS 0x2
 #endif
 
-#ifdef CONFIG_HEXAGON_ARCH_V4
+#if CONFIG_HEXAGON_ARCH_VERSION == 4
 #define ELF_CORE_EFLAGS 0x3
 #endif
 
index c144bee..67bb6d6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Declarations for to Hexagon Virtal Machine.
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
  * for tracing/debugging.
  */
 
-/*
- * Lets make this stuff visible only if configured,
- * so we can unconditionally include the file.
- */
+#define HVM_TRAP1_VMVERSION            0
+#define HVM_TRAP1_VMRTE                        1
+#define HVM_TRAP1_VMSETVEC             2
+#define HVM_TRAP1_VMSETIE              3
+#define HVM_TRAP1_VMGETIE              4
+#define HVM_TRAP1_VMINTOP              5
+#define HVM_TRAP1_VMCLRMAP             10
+#define HVM_TRAP1_VMNEWMAP             11
+#define HVM_TRAP1_FORMERLY_VMWIRE      12
+#define HVM_TRAP1_VMCACHE              13
+#define HVM_TRAP1_VMGETTIME            14
+#define HVM_TRAP1_VMSETTIME            15
+#define HVM_TRAP1_VMWAIT               16
+#define HVM_TRAP1_VMYIELD              17
+#define HVM_TRAP1_VMSTART              18
+#define HVM_TRAP1_VMSTOP               19
+#define HVM_TRAP1_VMVPID               20
+#define HVM_TRAP1_VMSETREGS            21
+#define HVM_TRAP1_VMGETREGS            22
+#define HVM_TRAP1_VMTIMEROP            24
 
 #ifndef __ASSEMBLY__
 
@@ -175,31 +191,19 @@ static inline long __vmintop_clear(long i)
 
 #else /* Only assembly code should reference these */
 
-#define HVM_TRAP1_VMRTE                        1
-#define HVM_TRAP1_VMSETVEC             2
-#define HVM_TRAP1_VMSETIE              3
-#define HVM_TRAP1_VMGETIE              4
-#define HVM_TRAP1_VMINTOP              5
-#define HVM_TRAP1_VMCLRMAP             10
-#define HVM_TRAP1_VMNEWMAP             11
-#define HVM_TRAP1_FORMERLY_VMWIRE      12
-#define HVM_TRAP1_VMCACHE              13
-#define HVM_TRAP1_VMGETTIME            14
-#define HVM_TRAP1_VMSETTIME            15
-#define HVM_TRAP1_VMWAIT               16
-#define HVM_TRAP1_VMYIELD              17
-#define HVM_TRAP1_VMSTART              18
-#define HVM_TRAP1_VMSTOP               19
-#define HVM_TRAP1_VMVPID               20
-#define HVM_TRAP1_VMSETREGS            21
-#define HVM_TRAP1_VMGETREGS            22
-
 #endif /* __ASSEMBLY__ */
 
 /*
  * Constants for virtual instruction parameters and return values
  */
 
+/* vmnewmap arguments */
+
+#define VM_TRANS_TYPE_LINEAR 0
+#define VM_TRANS_TYPE_TABLE 1
+#define VM_TLB_INVALIDATE_FALSE 0
+#define VM_TLB_INVALIDATE_TRUE 1
+
 /* vmsetie arguments */
 
 #define VM_INT_DISABLE 0
@@ -224,6 +228,8 @@ static inline long __vmintop_clear(long i)
 #define HVM_VMEST_UM_MSK       1
 #define HVM_VMEST_IE_SFT       30
 #define HVM_VMEST_IE_MSK       1
+#define HVM_VMEST_SS_SFT       29
+#define HVM_VMEST_SS_MSK       1
 #define HVM_VMEST_EVENTNUM_SFT 16
 #define HVM_VMEST_EVENTNUM_MSK 0xff
 #define HVM_VMEST_CAUSE_SFT    0
@@ -260,6 +266,8 @@ static inline long __vmintop_clear(long i)
 #define HVM_GE_C_INVI  0x15
 #define HVM_GE_C_PRIVI 0x1B
 #define HVM_GE_C_XMAL  0x1C
+#define HVM_GE_C_WREG  0x1D
+#define HVM_GE_C_PCAL  0x1E
 #define HVM_GE_C_RMAL  0x20
 #define HVM_GE_C_WMAL  0x21
 #define HVM_GE_C_RPROT 0x22
index e527cfe..1b7698e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * IO definitions for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -40,6 +40,8 @@
 #define IO_SPACE_LIMIT 0xffff
 #define _IO_BASE ((void __iomem *)0xfe000000)
 
+#define IOMEM(x)        ((void __force __iomem *)(x))
+
 extern int remap_area_pages(unsigned long start, unsigned long phys_addr,
                                unsigned long end, unsigned long flags);
 
@@ -176,6 +178,18 @@ static inline void writel(u32 data, volatile void __iomem *addr)
 #define __raw_readl readl
 
 /*
+ * http://comments.gmane.org/gmane.linux.ports.arm.kernel/117626
+ */
+
+#define readb_relaxed __raw_readb
+#define readw_relaxed __raw_readw
+#define readl_relaxed __raw_readl
+
+#define writeb_relaxed __raw_writeb
+#define writew_relaxed __raw_writew
+#define writel_relaxed __raw_writel
+
+/*
  * Need an mtype somewhere in here, for cache type deals?
  * This is probably too long for an inline.
  */
index af16e97..60556f8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Memory layout definitions for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
 #define PAGE_OFFSET                    _AC(0xc0000000, UL)
 
 /*
- * LOAD_ADDRESS is the physical/linear address of where in memory
- * the kernel gets loaded. The 12 least significant bits must be zero (0)
- * due to limitations on setting the EVB
- *
+ * Compiling for a platform that needs a crazy physical offset
+ * (like if the memory starts at 1GB and up) means we need
+ * an actual PHYS_OFFSET.  Should be set up in head.S.
  */
 
-#ifndef LOAD_ADDRESS
-#define LOAD_ADDRESS                   0x00000000
+#ifdef CONFIG_HEXAGON_PHYS_OFFSET
+#ifndef __ASSEMBLY__
+extern unsigned long   __phys_offset;
+#endif
+#define PHYS_OFFSET    __phys_offset
+#endif
+
+#ifndef PHYS_OFFSET
+#define PHYS_OFFSET    0
 #endif
 
+#define PHYS_PFN_OFFSET        (PHYS_OFFSET >> PAGE_SHIFT)
+#define ARCH_PFN_OFFSET        PHYS_PFN_OFFSET
+
 #define TASK_SIZE                      (PAGE_OFFSET)
 
 /*  not sure how these are used yet  */
@@ -55,7 +64,7 @@ enum fixed_addresses {
        __end_of_fixed_addresses
 };
 
-#define MIN_KERNEL_SEG 0x300   /* From 0xc0000000 */
+#define MIN_KERNEL_SEG (PAGE_OFFSET >> PGDIR_SHIFT)   /* L1 shift is 22 bits */
 extern int max_kernel_seg;
 
 /*
@@ -63,8 +72,7 @@ extern int max_kernel_seg;
  * supposed to be based on the amount of physical memory available
  */
 
-#define VMALLOC_START (PAGE_OFFSET + VMALLOC_OFFSET + \
-       (unsigned long)high_memory)
+#define VMALLOC_START ((unsigned long) __va(high_memory + VMALLOC_OFFSET))
 
 /* Gap between physical ram and vmalloc space for guard purposes. */
 #define VMALLOC_OFFSET PAGE_SIZE
index 692adc2..93f5669 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Page management definitions for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -96,8 +96,8 @@ typedef struct page *pgtable_t;
  * MIPS says they're only used during mem_init.
  * also, check if we need a PHYS_OFFSET.
  */
-#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET)
-#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
+#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
+#define __va(x) ((void *)((unsigned long)(x) - PHYS_OFFSET + PAGE_OFFSET))
 
 /* The "page frame" descriptor is defined in linux/mm.h */
 struct page;
@@ -140,6 +140,11 @@ static inline void clear_page(void *page)
  */
 #define page_to_phys(page)      (page_to_pfn(page) << PAGE_SHIFT)
 
+#define virt_to_pfn(kaddr)      (__pa(kaddr) >> PAGE_SHIFT)
+#define pfn_to_virt(pfn)        __va((pfn) << PAGE_SHIFT)
+
+#define page_to_virt(page)     __va(page_to_phys(page))
+
 /*
  * For port to Hexagon Virtual Machine, MAYBE we check for attempts
  * to reference reserved HVM space, but in any case, the VM will be
@@ -147,6 +152,7 @@ static inline void clear_page(void *page)
  */
 #define kern_addr_valid(addr)   (1)
 
+#include <asm/mem-layout.h>
 #include <asm-generic/memory_model.h>
 /* XXX Todo: implement assembly-optimized version of getorder. */
 #include <asm-generic/getorder.h>
index 6dd5d37..45a8254 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Process/processor support for the Hexagon architecture
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -100,12 +100,49 @@ extern unsigned long get_wchan(struct task_struct *p);
  */
 
 struct hexagon_switch_stack {
-       unsigned long long      r1716;
-       unsigned long long      r1918;
-       unsigned long long      r2120;
-       unsigned long long      r2322;
-       unsigned long long      r2524;
-       unsigned long long      r2726;
+       union {
+               struct {
+                       unsigned long r16;
+                       unsigned long r17;
+               };
+               unsigned long long      r1716;
+       };
+       union {
+               struct {
+                       unsigned long r18;
+                       unsigned long r19;
+               };
+               unsigned long long      r1918;
+       };
+       union {
+               struct {
+                       unsigned long r20;
+                       unsigned long r21;
+               };
+               unsigned long long      r2120;
+       };
+       union {
+               struct {
+                       unsigned long r22;
+                       unsigned long r23;
+               };
+               unsigned long long      r2322;
+       };
+       union {
+               struct {
+                       unsigned long r24;
+                       unsigned long r25;
+               };
+               unsigned long long      r2524;
+       };
+       union {
+               struct {
+                       unsigned long r26;
+                       unsigned long r27;
+               };
+               unsigned long long      r2726;
+       };
+
        unsigned long           fp;
        unsigned long           lr;
 };
index 9a94de7..096537d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Hexagon VM page table entry definitions
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2011,2013 The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
 
 #define __HEXAGON_C_WB         0x0     /* Write-back, no L2 */
 #define        __HEXAGON_C_WT          0x1     /* Write-through, no L2 */
+#define        __HEXAGON_C_UNC         0x6     /* Uncached memory */
+#if CONFIG_HEXAGON_ARCH_VERSION >= 2
 #define        __HEXAGON_C_DEV         0x4     /* Device register space */
-#define        __HEXAGON_C_WT_L2       0x5     /* Write-through, with L2 */
-/* this really should be #if CONFIG_HEXAGON_ARCH = 2 but that's not defined */
-#if defined(CONFIG_HEXAGON_COMET) || defined(CONFIG_QDSP6_ST1)
-#define __HEXAGON_C_UNC                __HEXAGON_C_DEV
 #else
-#define        __HEXAGON_C_UNC         0x6     /* Uncached memory */
+#define __HEXAGON_C_DEV                __HEXAGON_C_UNC
 #endif
+#define        __HEXAGON_C_WT_L2       0x5     /* Write-through, with L2 */
 #define        __HEXAGON_C_WB_L2       0x7     /* Write-back, with L2 */
 
 /*
index 1ffce0c..065e5b3 100644 (file)
@@ -36,4 +36,9 @@ extern const char *regs_query_register_name(unsigned int offset);
        ((struct pt_regs *) \
         ((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
 
+#if CONFIG_HEXAGON_ARCH_VERSION >= 4
+#define arch_has_single_step() (1)
+#endif
+
+
 #endif
index c20406f..487d6ce 100644 (file)
@@ -57,10 +57,17 @@ struct pt_regs {
        };
        union {
                struct {
-                       unsigned long gp;
                        unsigned long ugp;
+                       unsigned long gp;
                };
-               long long int ugpgp;
+               long long int gpugp;
+       };
+       union {
+               struct {
+                       unsigned long cs0;
+                       unsigned long cs1;
+               };
+               long long int cs1cs0;
        };
        /*
        * Be extremely careful with rearranging these, if at all.  Some code
@@ -204,9 +211,11 @@ struct pt_regs {
 #define pt_psp(regs) ((regs)->hvmer.vmpsp)
 #define pt_badva(regs) ((regs)->hvmer.vmbadva)
 
+#define pt_set_singlestep(regs) ((regs)->hvmer.vmest |= (1<<HVM_VMEST_SS_SFT))
+#define pt_clr_singlestep(regs) ((regs)->hvmer.vmest &= ~(1<<HVM_VMEST_SS_SFT))
+
 #define pt_set_rte_sp(regs, sp) do {\
-       pt_psp(regs) = (sp);\
-       (regs)->SP = (unsigned long) &((regs)->hvmer);\
+       pt_psp(regs) = (regs)->SP = (sp);\
        } while (0)
 
 #define pt_set_kmode(regs) \
index 9395568..98106e5 100644 (file)
 #ifndef _ASM_SIGNAL_H
 #define _ASM_SIGNAL_H
 
+#include <uapi/asm/registers.h>
+
 extern unsigned long __rt_sigtramp_template[2];
 
+void do_signal(struct pt_regs *regs);
+
 #include <asm-generic/signal.h>
 
 #endif
index 4a87cc4..ffee405 100644 (file)
@@ -27,6 +27,9 @@
  */
 
 #define sys_mmap2 sys_mmap_pgoff
+#define __ARCH_WANT_SYS_EXECVE
 #define __ARCH_WANT_SYS_CLONE
+#define __ARCH_WANT_SYS_VFORK
+#define __ARCH_WANT_SYS_FORK
 
 #include <asm-generic/unistd.h>
index cef13ee..3dae94d 100644 (file)
@@ -55,9 +55,15 @@ struct user_regs_struct {
        unsigned long pc;
        unsigned long cause;
        unsigned long badva;
+#if CONFIG_HEXAGON_ARCH_VERSION < 4
        unsigned long pad1;  /* pad out to 48 words total */
        unsigned long pad2;  /* pad out to 48 words total */
        unsigned long pad3;  /* pad out to 48 words total */
+#else
+       unsigned long cs0;
+       unsigned long cs1;
+       unsigned long pad1;  /* pad out to 48 words total */
+#endif
 };
 
 #endif
index 6c19501..29fc933 100644 (file)
@@ -1,6 +1,6 @@
 extra-y := head.o vmlinux.lds
 
-obj-$(CONFIG_SMP) += smp.o topology.o
+obj-$(CONFIG_SMP) += smp.o
 
 obj-y += setup.o irq_cpu.o traps.o syscalltab.o signal.o time.o
 obj-y += process.o trampoline.o reset.o ptrace.o vdso.o
index 2d5e84d..308be68 100644 (file)
@@ -5,7 +5,7 @@
  * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
  * Copyright (C) 2000 MIPS Technologies, Inc.
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -44,7 +44,8 @@ int main(void)
 
        COMMENT("Hexagon pt_regs definitions");
        OFFSET(_PT_SYSCALL_NR, pt_regs, syscall_nr);
-       OFFSET(_PT_UGPGP, pt_regs, ugpgp);
+       OFFSET(_PT_GPUGP, pt_regs, gpugp);
+       OFFSET(_PT_CS1CS0, pt_regs, cs1cs0);
        OFFSET(_PT_R3130, pt_regs, r3130);
        OFFSET(_PT_R2928, pt_regs, r2928);
        OFFSET(_PT_R2726, pt_regs, r2726);
index 65c7bdc..b74f9ba 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * DMA implementation for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
 #include <linux/genalloc.h>
 #include <asm/dma-mapping.h>
 #include <linux/module.h>
+#include <asm/page.h>
 
 struct dma_map_ops *dma_ops;
 EXPORT_SYMBOL(dma_ops);
 
 int bad_dma_address;  /*  globals are automatically initialized to zero  */
 
+static inline void *dma_addr_to_virt(dma_addr_t dma_addr)
+{
+       return phys_to_virt((unsigned long) dma_addr);
+}
+
 int dma_supported(struct device *dev, u64 mask)
 {
        if (mask == DMA_BIT_MASK(32))
@@ -60,6 +66,12 @@ static void *hexagon_dma_alloc_coherent(struct device *dev, size_t size,
 {
        void *ret;
 
+       /*
+        * Our max_low_pfn should have been backed off by 16MB in
+        * mm/init.c to create DMA coherent space.  Use that as the VA
+        * for the pool.
+        */
+
        if (coherent_pool == NULL) {
                coherent_pool = gen_pool_create(PAGE_SHIFT, -1);
 
@@ -67,7 +79,7 @@ static void *hexagon_dma_alloc_coherent(struct device *dev, size_t size,
                        panic("Can't create %s() memory pool!", __func__);
                else
                        gen_pool_add(coherent_pool,
-                               (PAGE_OFFSET + (max_low_pfn << PAGE_SHIFT)),
+                               pfn_to_virt(max_low_pfn),
                                hexagon_coherent_pool_size, -1);
        }
 
@@ -75,7 +87,7 @@ static void *hexagon_dma_alloc_coherent(struct device *dev, size_t size,
 
        if (ret) {
                memset(ret, 0, size);
-               *dma_addr = (dma_addr_t) (ret - PAGE_OFFSET);
+               *dma_addr = (dma_addr_t) virt_to_phys(ret);
        } else
                *dma_addr = ~0;
 
@@ -118,8 +130,8 @@ static int hexagon_map_sg(struct device *hwdev, struct scatterlist *sg,
 
                s->dma_length = s->length;
 
-               flush_dcache_range(PAGE_OFFSET + s->dma_address,
-                                  PAGE_OFFSET + s->dma_address + s->length);
+               flush_dcache_range(dma_addr_to_virt(s->dma_address),
+                                  dma_addr_to_virt(s->dma_address + s->length));
        }
 
        return nents;
@@ -149,11 +161,6 @@ static inline void dma_sync(void *addr, size_t size,
        }
 }
 
-static inline void *dma_addr_to_virt(dma_addr_t dma_addr)
-{
-       return phys_to_virt((unsigned long) dma_addr);
-}
-
 /**
  * hexagon_map_page() - maps an address for device DMA
  * @dev:       pointer to DMA device
index d859402..b9b63d0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Early kernel startup code for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  *
  * This program is free software; you can redistribute it and/or modify
@@ -25,6 +25,9 @@
 #include <asm/mem-layout.h>
 #include <asm/vm_mmu.h>
 #include <asm/page.h>
+#include <asm/hexagon_vm.h>
+
+#define SEGTABLE_ENTRIES #0x0e0
 
        __INIT
 ENTRY(stext)
@@ -43,40 +46,93 @@ ENTRY(stext)
         * Symbol is kernel segment address, but we need
         * the logical/physical address.
         */
-       r24 = asl(r24, #2)
-       r24 = lsr(r24, #2)
+       r25 = pc;
+       r2.h = #0xffc0;
+       r2.l = #0x0000;
+       r25 = and(r2,r25);      /*  R25 holds PHYS_OFFSET now  */
+       r1.h = #HI(PAGE_OFFSET);
+       r1.l = #LO(PAGE_OFFSET);
+       r24 = sub(r24,r1);      /* swapper_pg_dir - PAGE_OFFSET */
+       r24 = add(r24,r25);     /* + PHYS_OFFSET */
 
-       r0 = r24
+       r0 = r24;  /* aka __pa(swapper_pg_dir)  */
 
        /*
-        * Initialize a 16MB PTE to make the virtual and physical
+        * Initialize page dir to make the virtual and physical
         * addresses where the kernel was loaded be identical.
+        * Done in 4MB chunks.
         */
 #define PTE_BITS ( __HVM_PTE_R | __HVM_PTE_W | __HVM_PTE_X     \
                  | __HEXAGON_C_WB_L2 << 6                      \
                  | __HVM_PDE_S_4MB)
 
-       r1 = pc
-       r2.H = #0xffc0
-       r2.L = #0x0000
-       r1 = and(r1,r2)         /* round PC to 4MB boundary     */
+       /*
+        * Get number of VA=PA entries; only really needed for jump
+        * to hyperspace; gets blown away immediately after
+        */
+
+       {
+               r1.l = #LO(_end);
+               r2.l = #LO(stext);
+               r3 = #1;
+       }
+       {
+               r1.h = #HI(_end);
+               r2.h = #HI(stext);
+               r3 = asl(r3, #22);
+       }
+       {
+               r1 = sub(r1, r2);
+               r3 = add(r3, #-1);
+       }  /* r1 =  _end - stext  */
+       r1 = add(r1, r3);  /*  + (4M-1) */
+       r26 = lsr(r1, #22); /*  / 4M = # of entries */
+
+       r1 = r25;
+       r2.h = #0xffc0;
+       r2.l = #0x0000;         /* round back down to 4MB boundary  */
+       r1 = and(r1,r2);
        r2 = lsr(r1, #22)       /* 4MB page number              */
        r2 = asl(r2, #2)        /* times sizeof(PTE) (4bytes)   */
        r0 = add(r0,r2)         /* r0 = address of correct PTE  */
        r2 = #PTE_BITS
        r1 = add(r1,r2)         /* r1 = 4MB PTE for the first entry     */
        r2.h = #0x0040
-       r2.l = #0x0000          /* 4MB  */
-       memw(r0 ++ #4) = r1
-       r1 = add(r1, r2)
+       r2.l = #0x0000          /* 4MB increments */
+       loop0(1f,r26);
+1:
        memw(r0 ++ #4) = r1
+       { r1 = add(r1, r2); } :endloop0
+
+       /*  Also need to overwrite the initial 0xc0000000 entries  */
+       /*  PAGE_OFFSET >> (4MB shift - 4 bytes per entry shift)  */
+       R1.H = #HI(PAGE_OFFSET >> (22 - 2))
+       R1.L = #LO(PAGE_OFFSET >> (22 - 2))
+
+       r0 = add(r1, r24);      /* advance to 0xc0000000 entry */
+       r1 = r25;
+       r2.h = #0xffc0;
+       r2.l = #0x0000;         /* round back down to 4MB boundary  */
+       r1 = and(r1,r2);        /* for huge page */
+       r2 = #PTE_BITS
+       r1 = add(r1,r2);
+       r2.h = #0x0040
+       r2.l = #0x0000          /* 4MB increments */
 
-       r0 = r24
+       loop0(1f,SEGTABLE_ENTRIES);
+1:
+       memw(r0 ++ #4) = r1;
+       { r1 = add(r1,r2); } :endloop0
+
+       r0 = r24;
 
        /*
         * The subroutine wrapper around the virtual instruction touches
         * no memory, so we should be able to use it even here.
+        * Note that in this version, R1 and R2 get "clobbered"; see
+        * vm_ops.S
         */
+       r1 = #VM_TRANS_TYPE_TABLE
        call    __vmnewmap;
 
        /*  Jump into virtual address range.  */
@@ -90,17 +146,29 @@ ENTRY(stext)
 __head_s_vaddr_target:
        /*
         * Tear down VA=PA translation now that we are running
-        * in the desgnated kernel segments.
+        * in kernel virtual space.
         */
        r0 = #__HVM_PDE_S_INVALID
-       r1 = r24
-       loop0(1f,#0x100)
+
+       r1.h = #0xffc0;
+       r1.l = #0x0000;
+       r2 = r25;               /* phys_offset */
+       r2 = and(r1,r2);
+
+       r1.l = #lo(swapper_pg_dir)
+       r1.h = #hi(swapper_pg_dir)
+       r2 = lsr(r2, #22)       /* 4MB page number              */
+       r2 = asl(r2, #2)        /* times sizeof(PTE) (4bytes)   */
+       r1 = add(r1,r2);
+       loop0(1f,r26)
+
 1:
        {
                memw(R1 ++ #4) = R0
        }:endloop0
 
        r0 = r24
+       r1 = #VM_TRANS_TYPE_TABLE
        call __vmnewmap
 
        /*  Go ahead and install the trap0 return so angel calls work  */
@@ -143,6 +211,13 @@ __head_s_vaddr_target:
        r2 = sub(r2,r0);
        call memset;
 
+       /*  Set PHYS_OFFSET; should be in R25 */
+#ifdef CONFIG_HEXAGON_PHYS_OFFSET
+       r0.l = #LO(__phys_offset);
+       r0.h = #HI(__phys_offset);
+       memw(r0) = r25;
+#endif
+
        /* Time to make the doughnuts.   */
        call start_kernel
 
index 3446453..82d5c25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/hexagon/kernel/kgdb.c - Hexagon KGDB Support
  *
- * Copyright (c) 2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -70,6 +70,8 @@ struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] = {
        { "lc1", GDB_SIZEOF_REG, offsetof(struct pt_regs, lc1)},
        { " gp", GDB_SIZEOF_REG, offsetof(struct pt_regs, gp)},
        { "ugp", GDB_SIZEOF_REG, offsetof(struct pt_regs, ugp)},
+       { "cs0", GDB_SIZEOF_REG, offsetof(struct pt_regs, cs0)},
+       { "cs1", GDB_SIZEOF_REG, offsetof(struct pt_regs, cs1)},
        { "psp", GDB_SIZEOF_REG, offsetof(struct pt_regs, hvmer.vmpsp)},
        { "elr", GDB_SIZEOF_REG, offsetof(struct pt_regs, hvmer.vmel)},
        { "est", GDB_SIZEOF_REG, offsetof(struct pt_regs, hvmer.vmest)},
index 9b948c6..0a0dd5c 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/tick.h>
 #include <linux/uaccess.h>
 #include <linux/slab.h>
+#include <linux/tracehook.h>
 
 /*
  * Program thread launch.  Often defined as a macro in processor.h,
@@ -95,7 +96,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
        if (unlikely(p->flags & PF_KTHREAD)) {
                memset(childregs, 0, sizeof(struct pt_regs));
                /* r24 <- fn, r25 <- arg */
-               ss->r2524 = usp | ((u64)arg << 32);
+               ss->r24 = usp;
+               ss->r25 = arg;
                pt_set_kmode(childregs);
                return 0;
        }
@@ -185,3 +187,41 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
 {
        return 0;
 }
+
+
+/*
+ * Called on the exit path of event entry; see vm_entry.S
+ *
+ * Interrupts will already be disabled.
+ *
+ * Returns 0 if there's no need to re-check for more work.
+ */
+
+int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
+{
+       if (!(thread_info_flags & _TIF_WORK_MASK)) {
+               return 0;
+       }  /* shortcut -- no work to be done */
+
+       local_irq_enable();
+
+       if (thread_info_flags & _TIF_NEED_RESCHED) {
+               schedule();
+               return 1;
+       }
+
+       if (thread_info_flags & _TIF_SIGPENDING) {
+               do_signal(regs);
+               return 1;
+       }
+
+       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
+               clear_thread_flag(TIF_NOTIFY_RESUME);
+               tracehook_notify_resume(regs);
+               return 1;
+       }
+
+       /* Should not even reach here */
+       panic("%s: bad thread_info flags 0x%08x\n", __func__,
+               thread_info_flags);
+}
index 670b1b0..de829eb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Ptrace support for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
 
 #include <asm/user.h>
 
+#if arch_has_single_step()
+/*  Both called from ptrace_resume  */
+void user_enable_single_step(struct task_struct *child)
+{
+       pt_set_singlestep(task_pt_regs(child));
+       set_tsk_thread_flag(child, TIF_SINGLESTEP);
+}
+
+void user_disable_single_step(struct task_struct *child)
+{
+       pt_clr_singlestep(task_pt_regs(child));
+       clear_tsk_thread_flag(child, TIF_SINGLESTEP);
+}
+#endif
+
 static int genregs_get(struct task_struct *target,
                   const struct user_regset *regset,
                   unsigned int pos, unsigned int count,
@@ -76,6 +91,10 @@ static int genregs_get(struct task_struct *target,
        dummy = pt_cause(regs);
        ONEXT(&dummy, cause);
        ONEXT(&pt_badva(regs), badva);
+#if CONFIG_HEXAGON_ARCH_VERSION >=4
+       ONEXT(&regs->cs0, cs0);
+       ONEXT(&regs->cs1, cs1);
+#endif
 
        /* Pad the rest with zeros, if needed */
        if (!ret)
@@ -123,6 +142,11 @@ static int genregs_set(struct task_struct *target,
        INEXT(&bucket, cause);
        INEXT(&bucket, badva);
 
+#if CONFIG_HEXAGON_ARCH_VERSION >=4
+       INEXT(&regs->cs0, cs0);
+       INEXT(&regs->cs1, cs1);
+#endif
+
        /* Ignore the rest, if needed */
        if (!ret)
                ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
index 94a3878..bfe1331 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Arch related setup for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -68,6 +68,8 @@ void __init setup_arch(char **cmdline_p)
         */
        __vmsetvec(_K_VM_event_vector);
 
+       printk(KERN_INFO "PHYS_OFFSET=0x%08x\n", PHYS_OFFSET);
+
        /*
         * Simulator has a few differences from the hardware.
         * For now, check uninitialized-but-mapped memory
@@ -128,6 +130,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
 {
        int cpu = (unsigned long) v - 1;
 
+#ifdef CONFIG_SMP
+       if (!cpu_online(cpu))
+               return 0;
+#endif
+
        seq_printf(m, "processor\t: %d\n", cpu);
        seq_printf(m, "model name\t: Hexagon Virtual Machine\n");
        seq_printf(m, "BogoMips\t: %lu.%02lu\n",
index 60fa2ca..d7c7387 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Signal support for Hexagon processor
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -41,6 +41,10 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
 {
        unsigned long sp = regs->r29;
 
+       /* check if we would overflow the alt stack */
+       if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size)))
+               return (void __user __force *)-1UL;
+
        /* Switch to signal stack if appropriate */
        if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0))
                sp = current->sas_ss_sp + current->sas_ss_size;
@@ -66,7 +70,10 @@ static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
        err |= __put_user(regs->preds, &sc->sc_regs.p3_0);
        err |= __put_user(regs->gp, &sc->sc_regs.gp);
        err |= __put_user(regs->ugp, &sc->sc_regs.ugp);
-
+#if CONFIG_HEXAGON_ARCH_VERSION >= 4
+       err |= __put_user(regs->cs0, &sc->sc_regs.cs0);
+       err |= __put_user(regs->cs1, &sc->sc_regs.cs1);
+#endif
        tmp = pt_elr(regs); err |= __put_user(tmp, &sc->sc_regs.pc);
        tmp = pt_cause(regs); err |= __put_user(tmp, &sc->sc_regs.cause);
        tmp = pt_badva(regs); err |= __put_user(tmp, &sc->sc_regs.badva);
@@ -93,7 +100,10 @@ static int restore_sigcontext(struct pt_regs *regs,
        err |= __get_user(regs->preds, &sc->sc_regs.p3_0);
        err |= __get_user(regs->gp, &sc->sc_regs.gp);
        err |= __get_user(regs->ugp, &sc->sc_regs.ugp);
-
+#if CONFIG_HEXAGON_ARCH_VERSION >= 4
+       err |= __get_user(regs->cs0, &sc->sc_regs.cs0);
+       err |= __get_user(regs->cs1, &sc->sc_regs.cs1);
+#endif
        err |= __get_user(tmp, &sc->sc_regs.pc); pt_set_elr(regs, tmp);
 
        return err;
@@ -193,7 +203,7 @@ static void handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
 /*
  * Called from return-from-event code.
  */
-static void do_signal(struct pt_regs *regs)
+void do_signal(struct pt_regs *regs)
 {
        struct k_sigaction sigact;
        siginfo_t info;
@@ -210,8 +220,9 @@ static void do_signal(struct pt_regs *regs)
        }
 
        /*
-        * If we came from a system call, handle the restart.
+        * No (more) signals; if we came from a system call, handle the restart.
         */
+
        if (regs->syscall_nr >= 0) {
                switch (regs->r00) {
                case -ERESTARTNOHAND:
@@ -234,17 +245,6 @@ no_restart:
        restore_saved_sigmask();
 }
 
-void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
-{
-       if (thread_info_flags & _TIF_SIGPENDING)
-               do_signal(regs);
-
-       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
-               clear_thread_flag(TIF_NOTIFY_RESUME);
-               tracehook_notify_resume(regs);
-       }
-}
-
 /*
  * Architecture-specific wrappers for signal-related system calls
  */
@@ -272,21 +272,12 @@ asmlinkage int sys_rt_sigreturn(void)
        /* Restore the user's stack as well */
        pt_psp(regs) = regs->r29;
 
-       /*
-        * Leave a trace in the stack frame that this was a sigreturn.
-        * If the system call is to replay, we've already restored the
-        * number in the GPR slot and it will be regenerated on the
-        * new system call trap entry. Note that if restore_sigcontext()
-        * did something other than a bulk copy of the pt_regs struct,
-        * we could avoid this assignment by simply not overwriting
-        * regs->syscall_nr.
-        */
-       regs->syscall_nr = __NR_rt_sigreturn;
+       regs->syscall_nr = -1;
 
        if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
-       return 0;
+       return regs->r00;
 
 badframe:
        force_sig(SIGSEGV, current);
diff --git a/arch/hexagon/kernel/topology.c b/arch/hexagon/kernel/topology.c
deleted file mode 100644 (file)
index 352f27e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * CPU topology for Hexagon
- *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- */
-
-#include <linux/cpu.h>
-#include <linux/cpumask.h>
-#include <linux/init.h>
-#include <linux/node.h>
-#include <linux/nodemask.h>
-#include <linux/percpu.h>
-
-/*  Swiped from MIPS.  */
-
-static DEFINE_PER_CPU(struct cpu, cpu_devices);
-
-static int __init topology_init(void)
-{
-       int i, ret;
-
-       for_each_present_cpu(i) {
-
-               /*
-                * register_cpu takes a per_cpu pointer and
-                * just points it at another per_cpu struct...
-                */
-
-               ret = register_cpu(&per_cpu(cpu_devices, i), i);
-               if (ret)
-                       printk(KERN_WARNING "topology_init: register_cpu %d "
-                              "failed (%d)\n", i, ret);
-       }
-
-       return 0;
-}
-
-subsys_initcall(topology_init);
index cc2171b..7858663 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Kernel traps/events for Hexagon processor
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -65,6 +65,10 @@ static const char *ex_name(int ex)
                return "Write protection fault";
        case HVM_GE_C_XMAL:
                return "Misaligned instruction";
+       case HVM_GE_C_WREG:
+               return "Multiple writes to same register in packet";
+       case HVM_GE_C_PCAL:
+               return "Program counter values that are not properly aligned";
        case HVM_GE_C_RMAL:
                return "Misaligned data load";
        case HVM_GE_C_WMAL:
@@ -316,6 +320,12 @@ void do_genex(struct pt_regs *regs)
        case HVM_GE_C_XMAL:
                misaligned_instruction(regs);
                break;
+       case HVM_GE_C_WREG:
+               illegal_instruction(regs);
+               break;
+       case HVM_GE_C_PCAL:
+               misaligned_instruction(regs);
+               break;
        case HVM_GE_C_RMAL:
                misaligned_data_load(regs);
                break;
@@ -348,7 +358,6 @@ long sys_syscall(void)
 
 void do_trap0(struct pt_regs *regs)
 {
-       unsigned long syscallret = 0;
        syscall_fn syscall;
 
        switch (pt_cause(regs)) {
@@ -388,21 +397,11 @@ void do_trap0(struct pt_regs *regs)
                } else {
                        syscall = (syscall_fn)
                                  (sys_call_table[regs->syscall_nr]);
-                       syscallret = syscall(regs->r00, regs->r01,
+                       regs->r00 = syscall(regs->r00, regs->r01,
                                   regs->r02, regs->r03,
                                   regs->r04, regs->r05);
                }
 
-               /*
-                * If it was a sigreturn system call, don't overwrite
-                * r0 value in stack frame with return value.
-                *
-                * __NR_sigreturn doesn't seem to exist in new unistd.h
-                */
-
-               if (regs->syscall_nr != __NR_rt_sigreturn)
-                       regs->r00 = syscallret;
-
                /* allow strace to get the syscall return state  */
                if (unlikely(test_thread_flag(TIF_SYSCALL_TRACE)))
                        tracehook_report_syscall_exit(regs, 0);
@@ -444,3 +443,14 @@ void do_machcheck(struct pt_regs *regs)
        /* Halt and catch fire */
        __vmstop();
 }
+
+/*
+ * Treat this like the old 0xdb trap.
+ */
+
+void do_debug_exception(struct pt_regs *regs)
+{
+       regs->hvmer.vmest &= ~HVM_VMEST_CAUSE_MSK;
+       regs->hvmer.vmest |= (TRAP_DEBUG << HVM_VMEST_CAUSE_SFT);
+       do_trap0(regs);
+}
index 425e50c..e308618 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Event entry/exit for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
  * number in the case where we decode a system call (trap0(#1)).
  */
 
+#if CONFIG_HEXAGON_ARCH_VERSION < 4
 #define save_pt_regs()\
-       memd(R0 + #_PT_R3130) = R31:30; \
+ memd(R0 + #_PT_R3130) = R31:30; \
+ { memw(R0 + #_PT_R2928) = R28; \
+   R31 = memw(R0 + #_PT_ER_VMPSP); }\
+ { memw(R0 + #(_PT_R2928 + 4)) = R31; \
+   R31 = ugp; } \
+ { memd(R0 + #_PT_R2726) = R27:26; \
+   R30 = gp ; } \
+ memd(R0 + #_PT_R2524) = R25:24; \
+ memd(R0 + #_PT_R2322) = R23:22; \
+ memd(R0 + #_PT_R2120) = R21:20; \
+ memd(R0 + #_PT_R1918) = R19:18; \
+ memd(R0 + #_PT_R1716) = R17:16; \
+ memd(R0 + #_PT_R1514) = R15:14; \
+ memd(R0 + #_PT_R1312) = R13:12; \
+ { memd(R0 + #_PT_R1110) = R11:10; \
+   R15 = lc0; } \
+ { memd(R0 + #_PT_R0908) = R9:8; \
+   R14 = sa0; } \
+ { memd(R0 + #_PT_R0706) = R7:6; \
+   R13 = lc1; } \
+ { memd(R0 + #_PT_R0504) = R5:4; \
+   R12 = sa1; } \
+ { memd(R0 + #_PT_GPUGP) = R31:30; \
+   R11 = m1; \
+   R2.H = #HI(_THREAD_SIZE); } \
+ { memd(R0 + #_PT_LC0SA0) = R15:14; \
+   R10 = m0; \
+   R2.L = #LO(_THREAD_SIZE); } \
+ { memd(R0 + #_PT_LC1SA1) = R13:12; \
+   R15 = p3:0; \
+   R2 = neg(R2); } \
+ { memd(R0 + #_PT_M1M0) = R11:10; \
+   R14  = usr; \
+   R2 = and(R0,R2); } \
+ { memd(R0 + #_PT_PREDSUSR) =  R15:14; \
+   THREADINFO_REG = R2; } \
+ { r24 = memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS); \
+   memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS) = R0; \
+   R2 = #-1; } \
+ { memw(R0 + #_PT_SYSCALL_NR) = R2; \
+   R30 = #0; }
+#else
+/* V4+ */
+/* the # ## # syntax inserts a literal ## */
+#define save_pt_regs()\
+       { memd(R0 + #_PT_R3130) = R31:30; \
+               R30 = memw(R0 + #_PT_ER_VMPSP); }\
        { memw(R0 + #_PT_R2928) = R28; \
-         R31 = memw(R0 + #_PT_ER_VMPSP); }\
-       { memw(R0 + #(_PT_R2928 + 4)) = R31; \
-         R31 = ugp; } \
-       { memd(R0 + #_PT_R2726) = R27:26; \
-         R30 = gp ; } \
-       memd(R0 + #_PT_R2524) = R25:24; \
-       memd(R0 + #_PT_R2322) = R23:22; \
-       memd(R0 + #_PT_R2120) = R21:20; \
-       memd(R0 + #_PT_R1918) = R19:18; \
-       memd(R0 + #_PT_R1716) = R17:16; \
-       memd(R0 + #_PT_R1514) = R15:14; \
-       memd(R0 + #_PT_R1312) = R13:12; \
+               memw(R0 + #(_PT_R2928 + 4)) = R30; }\
+       { R31:30 = C11:10; \
+               memd(R0 + #_PT_R2726) = R27:26; \
+               memd(R0 + #_PT_R2524) = R25:24; }\
+       { memd(R0 + #_PT_R2322) = R23:22; \
+               memd(R0 + #_PT_R2120) = R21:20; }\
+       { memd(R0 + #_PT_R1918) = R19:18; \
+               memd(R0 + #_PT_R1716) = R17:16; }\
+       { memd(R0 + #_PT_R1514) = R15:14; \
+               memd(R0 + #_PT_R1312) = R13:12; \
+               R17:16 = C13:12; }\
        { memd(R0 + #_PT_R1110) = R11:10; \
-         R15 = lc0; } \
-       { memd(R0 + #_PT_R0908) = R9:8; \
-         R14 = sa0; } \
+               memd(R0 + #_PT_R0908) = R9:8; \
+         R15:14 = C1:0; } \
        { memd(R0 + #_PT_R0706) = R7:6; \
-         R13 = lc1; } \
-       { memd(R0 + #_PT_R0504) = R5:4; \
-         R12 = sa1; } \
-       { memd(R0 + #_PT_UGPGP) = R31:30; \
-         R11 = m1; \
-         R2.H = #HI(_THREAD_SIZE); } \
-       { memd(R0 + #_PT_LC0SA0) = R15:14; \
-         R10 = m0; \
-         R2.L = #LO(_THREAD_SIZE); } \
-       { memd(R0 + #_PT_LC1SA1) = R13:12; \
-         R15 = p3:0; \
-         R2 = neg(R2); } \
+               memd(R0 + #_PT_R0504) = R5:4; \
+    R13:12 = C3:2; } \
+       { memd(R0 + #_PT_GPUGP) = R31:30; \
+               memd(R0 + #_PT_LC0SA0) = R15:14; \
+         R11:10 = C7:6; }\
+       {       THREADINFO_REG = and(R0, # ## #-_THREAD_SIZE); \
+               memd(R0 + #_PT_LC1SA1) = R13:12; \
+         R15 = p3:0; }\
        { memd(R0 + #_PT_M1M0) = R11:10; \
-         R14  = usr; \
-         R2 = and(R0,R2); } \
-       { memd(R0 + #_PT_PREDSUSR) =  R15:14; \
-         THREADINFO_REG = R2; } \
+               memw(R0 + #_PT_PREDSUSR + 4) =  R15; }\
        { r24 = memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS); \
          memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS) = R0; \
          R2 = #-1; } \
        { memw(R0 + #_PT_SYSCALL_NR) = R2; \
+               memd(R0 + #_PT_CS1CS0) = R17:16; \
          R30 = #0; }
+#endif
 
 /*
  * Restore registers and thread_info.regs state. THREADINFO_REG
  * preserved. Don't restore R29 (SP) until later.
  */
 
+#if CONFIG_HEXAGON_ARCH_VERSION < 4
 #define restore_pt_regs() \
        { memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS) = R24; \
          R15:14 = memd(R0 + #_PT_PREDSUSR); } \
          R23:22 = memd(R0 + #_PT_R2322); } \
        { R25:24 = memd(R0 + #_PT_R2524); \
          R27:26 = memd(R0 + #_PT_R2726); } \
-       R31:30 = memd(R0 + #_PT_UGPGP); \
+       R31:30 = memd(R0 + #_PT_GPUGP); \
        { R28 = memw(R0 + #_PT_R2928); \
          ugp = R31; } \
        { R31:30 = memd(R0 + #_PT_R3130); \
          gp = R30; }
+#else
+/* V4+ */
+#define restore_pt_regs() \
+       { memw(THREADINFO_REG + #_THREAD_INFO_PT_REGS) = R24; \
+         R15:14 = memd(R0 + #_PT_PREDSUSR); } \
+       { R11:10 = memd(R0 + #_PT_M1M0); \
+               R13:12 = memd(R0 + #_PT_LC1SA1); \
+               p3:0 = R15; } \
+       { R15:14 = memd(R0 + #_PT_LC0SA0); \
+               R3:2 = memd(R0 + #_PT_R0302); \
+               usr = R14; } \
+       { R5:4 = memd(R0 + #_PT_R0504); \
+               R7:6 = memd(R0 + #_PT_R0706); \
+               C7:6 = R11:10; }\
+       { R9:8 = memd(R0 + #_PT_R0908); \
+               R11:10 = memd(R0 + #_PT_R1110); \
+    C3:2 = R13:12; }\
+       { R13:12 = memd(R0 + #_PT_R1312); \
+         R15:14 = memd(R0 + #_PT_R1514); \
+               C1:0 = R15:14; }\
+       { R17:16 = memd(R0 + #_PT_R1716); \
+         R19:18 = memd(R0 + #_PT_R1918); } \
+       { R21:20 = memd(R0 + #_PT_R2120); \
+         R23:22 = memd(R0 + #_PT_R2322); } \
+       { R25:24 = memd(R0 + #_PT_R2524); \
+         R27:26 = memd(R0 + #_PT_R2726); } \
+       R31:30 = memd(R0 + #_PT_CS1CS0); \
+       { C13:12 = R31:30; \
+               R31:30 = memd(R0 + #_PT_GPUGP) ; \
+               R28 = memw(R0 + #_PT_R2928); }\
+       { C11:10 = R31:30; \
+               R31:30 = memd(R0 + #_PT_R3130); }
+#endif
 
        /*
         * Clears off enough space for the rest of pt_regs; evrec is a part
  * Need to save off R0, R1, R2, R3 immediately.
  */
 
+#if CONFIG_HEXAGON_ARCH_VERSION < 4
 #define        vm_event_entry(CHandler) \
        { \
                R29 = add(R29, #-(_PT_REGS_SIZE)); \
                R1.H = #HI(CHandler); \
                jump event_dispatch; \
        }
+#else
+/* V4+ */
+/* turn on I$ prefetch early */
+/* the # ## # syntax inserts a literal ## */
+#define        vm_event_entry(CHandler) \
+       { \
+               R29 = add(R29, #-(_PT_REGS_SIZE)); \
+               memd(R29 + #(_PT_R0100 + -_PT_REGS_SIZE)) = R1:0; \
+               memd(R29 + #(_PT_R0302 + -_PT_REGS_SIZE)) = R3:2; \
+               R0 = usr; \
+       } \
+       { \
+               memw(R29 + #_PT_PREDSUSR) = R0; \
+               R0 = setbit(R0, #16); \
+       } \
+       usr = R0; \
+       R1:0 = G1:0; \
+       { \
+               memd(R29 + #_PT_ER_VMEL) = R1:0; \
+               R1 = # ## #(CHandler); \
+               R3:2 = G3:2; \
+       } \
+       { \
+               R0 = R29; \
+               memd(R29 + #_PT_ER_VMPSP) = R3:2; \
+               jump event_dispatch; \
+       }
+#endif
 
 .text
        /*
@@ -171,6 +274,9 @@ event_dispatch:
        callr   r1
 
        /*
+        * Coming back from the C-world, our thread info pointer
+        * should be in the designated register (usually R19)
+        *
         * If we were in kernel mode, we don't need to check scheduler
         * or signals if CONFIG_PREEMPT is not set.  If set, then it has
         * to jump to a need_resched kind of block.
@@ -183,69 +289,68 @@ event_dispatch:
 #endif
 
        /*  "Nested control path" -- if the previous mode was kernel  */
-       R0 = memw(R29 + #_PT_ER_VMEST);
-       P0 = tstbit(R0, #HVM_VMEST_UM_SFT);
-       if !P0 jump restore_all;
-       /*
-        * Returning from system call, normally coming back from user mode
-        */
-return_from_syscall:
-       /*  Disable interrupts while checking TIF  */
-       R0 = #VM_INT_DISABLE
-       trap1(#HVM_TRAP1_VMSETIE)
-
-       /*
-        * Coming back from the C-world, our thread info pointer
-        * should be in the designated register (usually R19)
-        */
-       R1.L = #LO(_TIF_ALLWORK_MASK)
        {
-               R1.H = #HI(_TIF_ALLWORK_MASK);
-               R0 = memw(THREADINFO_REG + #_THREAD_INFO_FLAGS);
+               R0 = memw(R29 + #_PT_ER_VMEST);
+               R16.L = #LO(do_work_pending);
+       }
+       {
+               P0 = tstbit(R0, #HVM_VMEST_UM_SFT);
+               if (!P0.new) jump:nt restore_all;
+               R16.H = #HI(do_work_pending);
+               R0 = #VM_INT_DISABLE;
        }
 
        /*
-        * Compare against the "return to userspace" _TIF_WORK_MASK
+        * Check also the return from fork/system call, normally coming back from
+        * user mode
+        *
+        * R16 needs to have do_work_pending, and R0 should have VM_INT_DISABLE
         */
-       R1 = and(R1,R0);
-       { P0 = cmp.eq(R1,#0); if (!P0.new) jump:t work_pending;}
-       jump restore_all;  /*  we're outta here!  */
 
-work_pending:
+check_work_pending:
+       /*  Disable interrupts while checking TIF  */
+       trap1(#HVM_TRAP1_VMSETIE)
        {
-               P0 = tstbit(R1, #TIF_NEED_RESCHED);
-               if (!P0.new) jump:nt work_notifysig;
+               R0 = R29;  /*  regs should still be at top of stack  */
+               R1 = memw(THREADINFO_REG + #_THREAD_INFO_FLAGS);
+               callr R16;
        }
-       call schedule
-       jump return_from_syscall;  /*  check for more work  */
 
-work_notifysig:
-       /*  this is the part that's kind of fuzzy.  */
-       R1 = and(R0, #(_TIF_SIGPENDING | _TIF_NOTIFY_RESUME));
-       P0 = cmp.eq(R1, #0);
-       if P0 jump restore_all
-       R1 = R0;        /* unsigned long thread_info_flags */
-       R0 = R29;       /* regs should still be at top of stack  */
-       call do_notify_resume
+       {
+               P0 = cmp.eq(R0, #0); if (!P0.new) jump:nt check_work_pending;
+               R0 = #VM_INT_DISABLE;
+       }
 
 restore_all:
-       /* Disable interrupts, if they weren't already, before reg restore.  */
-       R0 = #VM_INT_DISABLE
+       /*
+        * Disable interrupts, if they weren't already, before reg restore.
+        * R0 gets preloaded with #VM_INT_DISABLE before we get here.
+        */
        trap1(#HVM_TRAP1_VMSETIE)
 
        /*  do the setregs here for VM 0.5  */
        /*  R29 here should already be pointing at pt_regs  */
-       R1:0 = memd(R29 + #_PT_ER_VMEL);
-       R3:2 = memd(R29 + #_PT_ER_VMPSP);
+       {
+               R1:0 = memd(R29 + #_PT_ER_VMEL);
+               R3:2 = memd(R29 + #_PT_ER_VMPSP);
+       }
+#if CONFIG_HEXAGON_ARCH_VERSION < 4
        trap1(#HVM_TRAP1_VMSETREGS);
+#else
+       G1:0 = R1:0;
+       G3:2 = R3:2;
+#endif
 
        R0 = R29
        restore_pt_regs()
-       R1:0 = memd(R29 + #_PT_R0100);
-       R29 = add(R29, #_PT_REGS_SIZE);
+       {
+               R1:0 = memd(R29 + #_PT_R0100);
+               R29 = add(R29, #_PT_REGS_SIZE);
+       }
        trap1(#HVM_TRAP1_VMRTE)
        /* Notreached */
 
+
        .globl _K_enter_genex
 _K_enter_genex:
        vm_event_entry(do_genex)
@@ -262,12 +367,27 @@ _K_enter_trap0:
 _K_enter_machcheck:
        vm_event_entry(do_machcheck)
 
+       .globl _K_enter_debug
+_K_enter_debug:
+       vm_event_entry(do_debug_exception)
 
        .globl ret_from_fork
 ret_from_fork:
-       call schedule_tail
-       P0 = cmp.eq(R24, #0);
-       if P0 jump return_from_syscall
-       R0 = R25;
-       callr R24
-       jump return_from_syscall
+       {
+               call schedule_tail
+               R16.H = #HI(do_work_pending);
+       }
+       {
+               P0 = cmp.eq(R24, #0);
+               R16.L = #LO(do_work_pending);
+               R0 = #VM_INT_DISABLE;
+       }
+       if P0 jump check_work_pending
+       {
+               R0 = R25;
+               callr R24
+       }
+       {
+               jump check_work_pending
+               R0 = #VM_INT_DISABLE;
+       }
index f337281..741aaa9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Mostly IRQ support for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -44,6 +44,8 @@ void show_regs(struct pt_regs *regs)
               regs->lc1, regs->sa1, regs->m1);
        printk(KERN_EMERG "gp: \t0x%08lx   ugp: 0x%08lx   usr: 0x%08lx\n",
               regs->gp, regs->ugp, regs->usr);
+       printk(KERN_EMERG "cs0: \t0x%08lx   cs1: 0x%08lx\n",
+              regs->cs0, regs->cs1);
        printk(KERN_EMERG "r0: \t0x%08lx %08lx %08lx %08lx\n", regs->r00,
                regs->r01,
                regs->r02,
index 620f42c..791a742 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Event jump tables
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2012,2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -41,7 +41,7 @@ _K_VM_event_vector:
        jump 1b;  /*  Reset  */
        jump _K_enter_machcheck;
        jump _K_enter_genex;
-       jump 1b;  /*  3 Rsvd  */
+       jump _K_enter_debug;
        jump 1b;  /*  4 Rsvd  */
        jump _K_enter_trap0;
        jump 1b;  /*  6 Rsvd  */
index 14e793f..44d8c47 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Linker script for Hexagon kernel
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -18,8 +18,6 @@
  * 02110-1301, USA.
  */
 
-#define LOAD_OFFSET PAGE_OFFSET
-
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/asm-offsets.h>   /*  Most of the kernel defines are here  */
 #include <asm/mem-layout.h>    /*  except for page_offset  */
@@ -36,13 +34,9 @@ See asm-generic/sections.h for seemingly required labels.
 
 #define PAGE_SIZE _PAGE_SIZE
 
-/*  This LOAD_OFFSET is temporary for debugging on the simulator; it may change
-    for hypervisor pseudo-physical memory.  */
-
-
 SECTIONS
 {
-       . = PAGE_OFFSET + LOAD_ADDRESS;
+       . = PAGE_OFFSET;
 
        __init_begin = .;
        HEAD_TEXT_SECTION
@@ -52,7 +46,7 @@ SECTIONS
 
         . = ALIGN(_PAGE_SIZE);
        _stext = .;
-       .text : AT(ADDR(.text) - LOAD_OFFSET) {
+       .text : AT(ADDR(.text)) {
                _text = .;
                TEXT_TEXT
                SCHED_TEXT
index 69ffcfd..2561d25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Memory subsystem initialization for Hexagon
  *
- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
  * Define a startpg just past the end of the kernel image and a lastpg
  * that corresponds to the end of real or simulated platform memory.
  */
-#define bootmem_startpg (PFN_UP(((unsigned long) _end) - PAGE_OFFSET))
+#define bootmem_startpg (PFN_UP(((unsigned long) _end) - PAGE_OFFSET + PHYS_OFFSET))
 
-unsigned long bootmem_lastpg;  /*  Should be set by platform code  */
+unsigned long bootmem_lastpg;  /*  Should be set by platform code  */
+unsigned long __phys_offset;   /*  physical kernel offset >> 12  */
 
 /*  Set as variable to limit PMD copies  */
 int max_kernel_seg = 0x303;
@@ -44,7 +45,6 @@ unsigned long zero_page_mask;
 /*  indicate pfn's of high memory  */
 unsigned long highstart_pfn, highend_pfn;
 
-/* struct mmu_gather defined in asm-generic.h;  */
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
 /* Default cache attribute for newly created page tables */
@@ -71,7 +71,7 @@ void __init mem_init(void)
 {
        /*  No idea where this is actually declared.  Seems to evade LXR.  */
        totalram_pages += free_all_bootmem();
-       num_physpages = bootmem_lastpg; /*  seriously, what?  */
+       num_physpages = bootmem_lastpg-ARCH_PFN_OFFSET;
 
        printk(KERN_INFO "totalram_pages = %ld\n", totalram_pages);
 
@@ -193,6 +193,9 @@ void __init setup_arch_memory(void)
         * This needs to change for highmem setups.
         */
 
+       /*  Prior to this, bootmem_lastpg is actually mem size  */
+       bootmem_lastpg += ARCH_PFN_OFFSET;
+
        /* Memory size needs to be a multiple of 16M */
        bootmem_lastpg = PFN_DOWN((bootmem_lastpg << PAGE_SHIFT) &
                ~((BIG_KERNEL_PAGE_SIZE) - 1));
@@ -201,12 +204,15 @@ void __init setup_arch_memory(void)
         * Reserve the top DMA_RESERVE bytes of RAM for DMA (uncached)
         * memory allocation
         */
-       bootmap_size = init_bootmem(bootmem_startpg, bootmem_lastpg -
-                                   PFN_DOWN(DMA_RESERVED_BYTES));
+
+       max_low_pfn = bootmem_lastpg - PFN_DOWN(DMA_RESERVED_BYTES);
+       min_low_pfn = ARCH_PFN_OFFSET;
+       bootmap_size =  init_bootmem_node(NODE_DATA(0), bootmem_startpg, min_low_pfn, max_low_pfn);
 
        printk(KERN_INFO "bootmem_startpg:  0x%08lx\n", bootmem_startpg);
        printk(KERN_INFO "bootmem_lastpg:  0x%08lx\n", bootmem_lastpg);
        printk(KERN_INFO "bootmap_size:  %d\n", bootmap_size);
+       printk(KERN_INFO "min_low_pfn:  0x%08lx\n", min_low_pfn);
        printk(KERN_INFO "max_low_pfn:  0x%08lx\n", max_low_pfn);
 
        /*
@@ -221,14 +227,17 @@ void __init setup_arch_memory(void)
        /*  this actually only goes to the end of the first gig  */
        segtable_end = segtable + (1<<(30-22));
 
-       /*  Move forward to the start of empty pages  */
-       segtable += bootmem_lastpg >> (22-PAGE_SHIFT);
+       /*
+        * Move forward to the start of empty pages; take into account
+        * phys_offset shift.
+        */
 
+       segtable += (bootmem_lastpg-ARCH_PFN_OFFSET)>>(22-PAGE_SHIFT);
        {
-           int i;
+               int i;
 
-           for (i = 1 ; i <= DMA_RESERVE ; i++)
-               segtable[-i] = ((segtable[-i] & __HVM_PTE_PGMASK_4MB)
+               for (i = 1 ; i <= DMA_RESERVE ; i++)
+                       segtable[-i] = ((segtable[-i] & __HVM_PTE_PGMASK_4MB)
                                | __HVM_PTE_R | __HVM_PTE_W | __HVM_PTE_X
                                | __HEXAGON_C_UNC << 6
                                | __HVM_PDE_S_4MB);
@@ -256,7 +265,7 @@ void __init setup_arch_memory(void)
         * Free all the memory that wasn't taken up by the bootmap, the DMA
         * reserve, or kernel itself.
         */
-       free_bootmem(PFN_PHYS(bootmem_startpg)+bootmap_size,
+       free_bootmem(PFN_PHYS(bootmem_startpg) + bootmap_size,
                     PFN_PHYS(bootmem_lastpg - bootmem_startpg) - bootmap_size -
                     DMA_RESERVED_BYTES);
 
index 308ef0c..1bd276d 100644 (file)
@@ -147,7 +147,7 @@ good_area:
        }
        info.si_errno = 0;
        info.si_addr = (void __user *)address;
-       force_sig_info(info.si_code, &info, current);
+       force_sig_info(info.si_signo, &info, current);
        return;
 
 bad_area:
@@ -158,7 +158,7 @@ bad_area:
                info.si_errno = 0;
                info.si_code = si_code;
                info.si_addr = (void *)address;
-               force_sig_info(SIGSEGV, &info, current);
+               force_sig_info(info.si_signo, &info, current);
                return;
        }
        /* Kernel-mode fault falls through */
index ef22a45..7875757 100644 (file)
@@ -11,4 +11,8 @@
 
 #endif
 
+#define cond_syscall(x) asm(".weak\t" #x "#\n" #x "#\t=\tsys_ni_syscall#")
+#define SYSCALL_ALIAS(alias, name)                                     \
+       asm ( #alias "# = " #name "#\n\t.globl " #alias "#")
+
 #endif
index 0963738..afd45e0 100644 (file)
@@ -46,15 +46,5 @@ asmlinkage unsigned long sys_mmap2(
 struct pt_regs;
 asmlinkage long sys_ia64_pipe(void);
 
-/*
- * "Conditional" syscalls
- *
- * Note, this macro can only be used in the file which defines sys_ni_syscall, i.e., in
- * kernel/sys_ni.c.  This version causes warnings because the declaration isn't a
- * proper prototype, but we can't use __typeof__ either, because not all cond_syscall()
- * declarations have prototypes at the moment.
- */
-#define cond_syscall(x) asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall")))
-
 #endif /* !__ASSEMBLY__ */
 #endif /* _ASM_IA64_UNISTD_H */
index 555629b..59db801 100644 (file)
 #define __IGNORE_getresgid
 #define __IGNORE_chown
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-#endif
-
 #endif /* _ASM_M32R_UNISTD_H */
index 6cd9267..014f288 100644 (file)
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _ASM_M68K_UNISTD_H_ */
index b377839..6dece2d 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_FORK
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_MICROBLAZE_UNISTD_H */
index 007a917..e5f3794 100644 (file)
@@ -1739,7 +1739,6 @@ config 32BIT
 config 64BIT
        bool "64-bit kernel"
        depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL
-       select HAVE_SYSCALL_WRAPPERS
        help
          Select this option if you want to build a 64-bit kernel.
 
index e9a940d..2767dda 100644 (file)
@@ -6,5 +6,8 @@
 #endif
 
 #define __weak __attribute__((weak))
+#define cond_syscall(x) asm(".weak\t" #x "\n" #x "\t=\tsys_ni_syscall")
+#define SYSCALL_ALIAS(alias, name)                                     \
+       asm ( #alias " = " #name "\n\t.globl " #alias)
 
 #endif
index 64f661e..63c9c88 100644 (file)
 
 #endif /* !__ASSEMBLY__ */
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n" #x "\t=\tsys_ni_syscall")
-
 #endif /* _ASM_UNISTD_H */
index db9655f..d1d576b 100644 (file)
@@ -119,99 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
        return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
 }
 
-#ifdef CONFIG_SYSVIPC
-
-SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
-       unsigned long, ptr, unsigned long, fifth)
-{
-       int version, err;
-
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-
-       switch (call) {
-       case SEMOP:
-               /* struct sembuf is the same on 32 and 64bit :)) */
-               err = sys_semtimedop(first, compat_ptr(ptr), second, NULL);
-               break;
-       case SEMTIMEDOP:
-               err = compat_sys_semtimedop(first, compat_ptr(ptr), second,
-                                           compat_ptr(fifth));
-               break;
-       case SEMGET:
-               err = sys_semget(first, second, third);
-               break;
-       case SEMCTL:
-               err = compat_sys_semctl(first, second, third, compat_ptr(ptr));
-               break;
-       case MSGSND:
-               err = compat_sys_msgsnd(first, second, third, compat_ptr(ptr));
-               break;
-       case MSGRCV:
-               err = compat_sys_msgrcv(first, second, fifth, third,
-                                       version, compat_ptr(ptr));
-               break;
-       case MSGGET:
-               err = sys_msgget((key_t) first, second);
-               break;
-       case MSGCTL:
-               err = compat_sys_msgctl(first, second, compat_ptr(ptr));
-               break;
-       case SHMAT:
-               err = compat_sys_shmat(first, second, third, version,
-                                      compat_ptr(ptr));
-               break;
-       case SHMDT:
-               err = sys_shmdt(compat_ptr(ptr));
-               break;
-       case SHMGET:
-               err = sys_shmget(first, (unsigned)second, third);
-               break;
-       case SHMCTL:
-               err = compat_sys_shmctl(first, second, compat_ptr(ptr));
-               break;
-       default:
-               err = -ENOSYS;
-               break;
-       }
-
-       return err;
-}
-
-#else
-
-SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third,
-       u32, ptr, u32, fifth)
-{
-       return -ENOSYS;
-}
-
-#endif /* CONFIG_SYSVIPC */
-
-#ifdef CONFIG_MIPS32_N32
-SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg)
-{
-       /* compat_sys_semctl expects a pointer to union semun */
-       u32 __user *uptr = compat_alloc_user_space(sizeof(u32));
-       if (put_user(arg, uptr))
-               return -EFAULT;
-       return compat_sys_semctl(semid, semnum, cmd, uptr);
-}
-
-SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz,
-       int, msgflg)
-{
-       return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp));
-}
-
-SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
-       int, msgtyp, int, msgflg)
-{
-       return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64,
-                                compat_ptr(msgp));
-}
-#endif
-
 SYSCALL_DEFINE1(32_personality, unsigned long, personality)
 {
        unsigned int p = personality & 0xffffffff;
@@ -226,26 +133,6 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality)
        return ret;
 }
 
-SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd,
-       compat_off_t __user *, offset, s32, count)
-{
-       mm_segment_t old_fs = get_fs();
-       int ret;
-       off_t of;
-
-       if (offset && get_user(of, offset))
-               return -EFAULT;
-
-       set_fs(KERNEL_DS);
-       ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL, count);
-       set_fs(old_fs);
-
-       if (offset && put_user(of, offset))
-               return -EFAULT;
-
-       return ret;
-}
-
 asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3,
                                   size_t count)
 {
@@ -279,12 +166,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
                             merge_64(len_a4, len_a5));
 }
 
-asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf,
-       size_t len)
-{
-       return sys_lookup_dcookie(merge_64(a0, a1), buf, len);
-}
-
 SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,
                u64, a3, u64, a4, int, dfd, const char  __user *, pathname)
 {
index 693d60b..edcb659 100644 (file)
@@ -143,7 +143,7 @@ EXPORT(sysn32_call_table)
        PTR     compat_sys_setitimer
        PTR     sys_alarm
        PTR     sys_getpid
-       PTR     sys_32_sendfile
+       PTR     compat_sys_sendfile
        PTR     sys_socket                      /* 6040 */
        PTR     sys_connect
        PTR     sys_accept
@@ -168,11 +168,11 @@ EXPORT(sysn32_call_table)
        PTR     sys_newuname
        PTR     sys_semget
        PTR     sys_semop
-       PTR     sys_n32_semctl
+       PTR     compat_sys_semctl
        PTR     sys_shmdt                       /* 6065 */
        PTR     sys_msgget
-       PTR     sys_n32_msgsnd
-       PTR     sys_n32_msgrcv
+       PTR     compat_sys_msgsnd
+       PTR     compat_sys_msgrcv
        PTR     compat_sys_msgctl
        PTR     compat_sys_fcntl                /* 6070 */
        PTR     sys_flock
index af8887f..103bfe5 100644 (file)
@@ -309,7 +309,7 @@ sys_call_table:
        PTR     compat_sys_wait4
        PTR     sys_swapoff                     /* 4115 */
        PTR     compat_sys_sysinfo
-       PTR     sys_32_ipc
+       PTR     compat_sys_ipc
        PTR     sys_fsync
        PTR     sys32_sigreturn
        PTR     __sys_clone                     /* 4120 */
@@ -399,7 +399,7 @@ sys_call_table:
        PTR     sys_capget
        PTR     sys_capset                      /* 4205 */
        PTR     compat_sys_sigaltstack
-       PTR     sys_32_sendfile
+       PTR     compat_sys_sendfile
        PTR     sys_ni_syscall
        PTR     sys_ni_syscall
        PTR     sys_mips_mmap2                  /* 4210 */
@@ -439,7 +439,7 @@ sys_call_table:
        PTR     compat_sys_io_submit
        PTR     sys_io_cancel                   /* 4245 */
        PTR     sys_exit_group
-       PTR     sys32_lookup_dcookie
+       PTR     compat_sys_lookup_dcookie
        PTR     sys_epoll_create
        PTR     sys_epoll_ctl
        PTR     sys_epoll_wait                  /* 4250 */
index 7f9d9ad..9d4e2d1 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-#endif
-
 #endif /* _ASM_UNISTD_H */
index 9ab3bf2..81b9ddb 100644 (file)
@@ -55,9 +55,6 @@ config TRACE_IRQFLAGS_SUPPORT
 config GENERIC_CSUM
         def_bool y
 
-config GENERIC_FIND_NEXT_BIT
-       def_bool y
-
 source "init/Kconfig"
 
 
index ae9a46c..74d8358 100644 (file)
@@ -170,12 +170,4 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)      \
 
 #undef STR
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _ASM_PARISC_UNISTD_H_ */
index 051c8b9..f517e08 100644 (file)
@@ -60,47 +60,6 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
     return -ENOSYS;
 }
 
-/* Note: it is necessary to treat out_fd and in_fd as unsigned ints, with the
- * corresponding cast to a signed int to insure that the proper conversion
- * (sign extension) between the register representation of a signed int (msr in
- * 32-bit mode) and the register representation of a signed int (msr in 64-bit
- * mode) is performed.
- */
-asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd,
-                              compat_off_t __user *offset, compat_size_t count)
-{
-       return compat_sys_sendfile((int)out_fd, (int)in_fd, offset, count);
-}
-
-asmlinkage long sys32_sendfile64(u32 out_fd, u32 in_fd,
-                                compat_loff_t __user *offset, compat_size_t count)
-{
-       return sys_sendfile64((int)out_fd, (int)in_fd,
-                               (loff_t __user *)offset, count);
-}
-
-asmlinkage long sys32_semctl(int semid, int semnum, int cmd, union semun arg)
-{
-        union semun u;
-       
-        if (cmd == SETVAL) {
-                /* Ugh.  arg is a union of int,ptr,ptr,ptr, so is 8 bytes.
-                 * The int should be in the first 4, but our argument
-                 * frobbing has left it in the last 4.
-                 */
-                u.val = *((int *)&arg + 1);
-                return sys_semctl (semid, semnum, cmd, u);
-       }
-       return sys_semctl (semid, semnum, cmd, arg);
-}
-
-long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf,
-                         size_t len)
-{
-       return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
-                                 buf, len);
-}
-
 asmlinkage long compat_sys_fanotify_mark(int fan_fd, int flags, u32 mask_hi,
                                         u32 mask_lo, int fd,
                                         const char __user *pathname)
index f57dc13..0c91072 100644 (file)
        ENTRY_SAME(madvise)
        ENTRY_SAME(clone_wrapper)       /* 120 */
        ENTRY_SAME(setdomainname)
-       ENTRY_DIFF(sendfile)
+       ENTRY_COMP(sendfile)
        /* struct sockaddr... */
        ENTRY_SAME(recvfrom)
        /* struct timex contains longs */
        ENTRY_COMP(recvmsg)
        ENTRY_SAME(semop)               /* 185 */
        ENTRY_SAME(semget)
-       ENTRY_DIFF(semctl)
+       ENTRY_COMP(semctl)
        ENTRY_COMP(msgsnd)
        ENTRY_COMP(msgrcv)
        ENTRY_SAME(msgget)              /* 190 */
        ENTRY_SAME(gettid)
        ENTRY_OURS(readahead)
        ENTRY_SAME(tkill)
-       ENTRY_DIFF(sendfile64)
+       ENTRY_COMP(sendfile64)
        ENTRY_COMP(futex)               /* 210 */
        ENTRY_COMP(sched_setaffinity)
        ENTRY_COMP(sched_getaffinity)
        ENTRY_SAME(alloc_hugepages)     /* 220 */
        ENTRY_SAME(free_hugepages)
        ENTRY_SAME(exit_group)
-       ENTRY_DIFF(lookup_dcookie)
+       ENTRY_COMP(lookup_dcookie)
        ENTRY_SAME(epoll_create)
        ENTRY_SAME(epoll_ctl)           /* 225 */
        ENTRY_SAME(epoll_wait)
index ea5bb04..a0259ed 100644 (file)
@@ -114,7 +114,6 @@ config PPC
        select USE_GENERIC_SMP_HELPERS if SMP
        select HAVE_OPROFILE
        select HAVE_DEBUG_KMEMLEAK
-       select HAVE_SYSCALL_WRAPPERS if PPC64
        select GENERIC_ATOMIC64 if PPC32
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select HAVE_PERF_EVENTS
diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h
new file mode 100644 (file)
index 0000000..b36f650
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _ASM_POWERPC_LINKAGE_H
+#define _ASM_POWERPC_LINKAGE_H
+
+#ifdef CONFIG_PPC64
+#define cond_syscall(x) \
+       asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n"          \
+            "\t.weak ." #x "\n\t.set ." #x ", .sys_ni_syscall\n")
+#define SYSCALL_ALIAS(alias, name)                                     \
+       asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"      \
+            "\t.globl ." #alias "\n\t.set ." #alias ", ." #name)
+#endif
+
+#endif /* _ASM_POWERPC_LINKAGE_H */
index ebbec52..43523fe 100644 (file)
@@ -190,7 +190,7 @@ SYSCALL_SPU(getcwd)
 SYSCALL_SPU(capget)
 SYSCALL_SPU(capset)
 COMPAT_SYS(sigaltstack)
-SYSX_SPU(sys_sendfile,compat_sys_sendfile_wrapper,sys_sendfile)
+COMPAT_SYS_SPU(sendfile)
 SYSCALL(ni_syscall)
 SYSCALL(ni_syscall)
 PPC_SYS(vfork)
@@ -230,7 +230,7 @@ COMPAT_SYS_SPU(sched_setaffinity)
 COMPAT_SYS_SPU(sched_getaffinity)
 SYSCALL(ni_syscall)
 SYSCALL(ni_syscall)
-SYSX(sys_ni_syscall,compat_sys_sendfile64_wrapper,sys_sendfile64)
+SYS32ONLY(sendfile64)
 COMPAT_SYS_SPU(io_setup)
 SYSCALL_SPU(io_destroy)
 COMPAT_SYS_SPU(io_getevents)
@@ -239,7 +239,7 @@ SYSCALL_SPU(io_cancel)
 SYSCALL(set_tid_address)
 SYSX_SPU(sys_fadvise64,ppc32_fadvise64,sys_fadvise64)
 SYSCALL(exit_group)
-SYSX(sys_lookup_dcookie,ppc32_lookup_dcookie,sys_lookup_dcookie)
+COMPAT_SYS(lookup_dcookie)
 SYSCALL_SPU(epoll_create)
 SYSCALL_SPU(epoll_ctl)
 SYSCALL_SPU(epoll_wait)
@@ -273,8 +273,8 @@ COMPAT_SYS(mq_timedreceive)
 COMPAT_SYS(mq_notify)
 COMPAT_SYS(mq_getsetattr)
 COMPAT_SYS(kexec_load)
-COMPAT_SYS(add_key)
-COMPAT_SYS(request_key)
+SYSCALL(add_key)
+SYSCALL(request_key)
 COMPAT_SYS(keyctl)
 COMPAT_SYS(waitid)
 SYSCALL(ioprio_set)
index 1487f0f..3ca819f 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- */
-#define cond_syscall(x) \
-       asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall")))
-
 #endif         /* __ASSEMBLY__ */
 #endif /* _ASM_POWERPC_UNISTD_H_ */
diff --git a/arch/powerpc/include/uapi/asm/linkage.h b/arch/powerpc/include/uapi/asm/linkage.h
deleted file mode 100644 (file)
index e1c4ac1..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ASM_POWERPC_LINKAGE_H
-#define _ASM_POWERPC_LINKAGE_H
-
-/* Nothing to see here... */
-
-#endif /* _ASM_POWERPC_LINKAGE_H */
index d0bafc0..cd6e19d 100644 (file)
@@ -61,91 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
        return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x));
 }
 
-#ifdef CONFIG_SYSVIPC
-long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr,
-              u32 fifth)
-{
-       int version;
-
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-
-       switch (call) {
-
-       case SEMTIMEDOP:
-               if (fifth)
-                       /* sign extend semid */
-                       return compat_sys_semtimedop((int)first,
-                                                    compat_ptr(ptr), second,
-                                                    compat_ptr(fifth));
-               /* else fall through for normal semop() */
-       case SEMOP:
-               /* struct sembuf is the same on 32 and 64bit :)) */
-               /* sign extend semid */
-               return sys_semtimedop((int)first, compat_ptr(ptr), second,
-                                     NULL);
-       case SEMGET:
-               /* sign extend key, nsems */
-               return sys_semget((int)first, (int)second, third);
-       case SEMCTL:
-               /* sign extend semid, semnum */
-               return compat_sys_semctl((int)first, (int)second, third,
-                                        compat_ptr(ptr));
-
-       case MSGSND:
-               /* sign extend msqid */
-               return compat_sys_msgsnd((int)first, (int)second, third,
-                                        compat_ptr(ptr));
-       case MSGRCV:
-               /* sign extend msqid, msgtyp */
-               return compat_sys_msgrcv((int)first, second, (int)fifth,
-                                        third, version, compat_ptr(ptr));
-       case MSGGET:
-               /* sign extend key */
-               return sys_msgget((int)first, second);
-       case MSGCTL:
-               /* sign extend msqid */
-               return compat_sys_msgctl((int)first, second, compat_ptr(ptr));
-
-       case SHMAT:
-               /* sign extend shmid */
-               return compat_sys_shmat((int)first, second, third, version,
-                                       compat_ptr(ptr));
-       case SHMDT:
-               return sys_shmdt(compat_ptr(ptr));
-       case SHMGET:
-               /* sign extend key_t */
-               return sys_shmget((int)first, second, third);
-       case SHMCTL:
-               /* sign extend shmid */
-               return compat_sys_shmctl((int)first, second, compat_ptr(ptr));
-
-       default:
-               return -ENOSYS;
-       }
-
-       return -ENOSYS;
-}
-#endif
-
-/* Note: it is necessary to treat out_fd and in_fd as unsigned ints, 
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sendfile_wrapper(u32 out_fd, u32 in_fd,
-                                           compat_off_t __user *offset, u32 count)
-{
-       return compat_sys_sendfile((int)out_fd, (int)in_fd, offset, count);
-}
-
-asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
-                                             compat_loff_t __user *offset, u32 count)
-{
-       return sys_sendfile((int)out_fd, (int)in_fd,
-                           (off_t __user *)offset, count);
-}
-
 unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
                          unsigned long prot, unsigned long flags,
                          unsigned long fd, unsigned long pgoff)
@@ -195,13 +110,6 @@ asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long h
        return sys_ftruncate(fd, (high << 32) | low);
 }
 
-long ppc32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf,
-                         size_t len)
-{
-       return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
-                                 buf, len);
-}
-
 long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,
                     size_t len, int advice)
 {
@@ -209,23 +117,6 @@ long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,
                             advice);
 }
 
-asmlinkage long compat_sys_add_key(const char __user *_type,
-                             const char __user *_description,
-                             const void __user *_payload,
-                             u32 plen,
-                             u32 ringid)
-{
-       return sys_add_key(_type, _description, _payload, plen, ringid);
-}
-
-asmlinkage long compat_sys_request_key(const char __user *_type,
-                                 const char __user *_description,
-                                 const char __user *_callout_info,
-                                 u32 destringid)
-{
-       return sys_request_key(_type, _description, _callout_info, destringid);
-}
-
 asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,
                                   unsigned offset_hi, unsigned offset_lo,
                                   unsigned nbytes_hi, unsigned nbytes_lo)
index ce640af..2c9789d 100644 (file)
@@ -132,7 +132,6 @@ config S390
        select HAVE_PERF_EVENTS
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_SYSCALL_TRACEPOINTS
-       select HAVE_SYSCALL_WRAPPERS
        select HAVE_UID16 if 32BIT
        select HAVE_VIRT_CPU_ACCOUNTING
        select VIRT_TO_BUS
index a6667a9..6518863 100644 (file)
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _ASM_S390_UNISTD_H_ */
index 19f26de..8b6e4f5 100644 (file)
@@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void)
        return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
 }
 
-/*
- * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation.
- *
- * This is really horribly ugly.
- */
 #ifdef CONFIG_SYSVIPC
-asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
+COMPAT_SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second,
+               unsigned long, third, compat_uptr_t, ptr)
 {
        if (call >> 16)         /* hack for backward compatibility */
                return -EINVAL;
-       switch (call) {
-       case SEMTIMEDOP:
-               return compat_sys_semtimedop(first, compat_ptr(ptr),
-                                            second, compat_ptr(third));
-       case SEMOP:
-               /* struct sembuf is the same on 32 and 64bit :)) */
-               return sys_semtimedop(first, compat_ptr(ptr),
-                                     second, NULL);
-       case SEMGET:
-               return sys_semget(first, second, third);
-       case SEMCTL:
-               return compat_sys_semctl(first, second, third,
-                                        compat_ptr(ptr));
-       case MSGSND:
-               return compat_sys_msgsnd(first, second, third,
-                                        compat_ptr(ptr));
-       case MSGRCV:
-               return compat_sys_msgrcv(first, second, 0, third,
-                                        0, compat_ptr(ptr));
-       case MSGGET:
-               return sys_msgget((key_t) first, second);
-       case MSGCTL:
-               return compat_sys_msgctl(first, second, compat_ptr(ptr));
-       case SHMAT:
-               return compat_sys_shmat(first, second, third,
-                                       0, compat_ptr(ptr));
-       case SHMDT:
-               return sys_shmdt(compat_ptr(ptr));
-       case SHMGET:
-               return sys_shmget(first, (unsigned)second, third);
-       case SHMCTL:
-               return compat_sys_shmctl(first, second, compat_ptr(ptr));
-       }
-
-       return -ENOSYS;
+       return compat_sys_ipc(call, first, second, third, ptr, third);
 }
 #endif
 
@@ -373,48 +335,6 @@ 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 long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, size_t count)
-{
-       mm_segment_t old_fs = get_fs();
-       int ret;
-       off_t of;
-       
-       if (offset && get_user(of, offset))
-               return -EFAULT;
-               
-       set_fs(KERNEL_DS);
-       ret = sys_sendfile(out_fd, in_fd,
-                          offset ? (off_t __force __user *) &of : NULL, count);
-       set_fs(old_fs);
-       
-       if (offset && put_user(of, offset))
-               return -EFAULT;
-               
-       return ret;
-}
-
-asmlinkage long sys32_sendfile64(int out_fd, int in_fd,
-                               compat_loff_t __user *offset, s32 count)
-{
-       mm_segment_t old_fs = get_fs();
-       int ret;
-       loff_t lof;
-       
-       if (offset && get_user(lof, offset))
-               return -EFAULT;
-               
-       set_fs(KERNEL_DS);
-       ret = sys_sendfile64(out_fd, in_fd,
-                            offset ? (loff_t __force __user *) &lof : NULL,
-                            count);
-       set_fs(old_fs);
-       
-       if (offset && put_user(lof, offset))
-               return -EFAULT;
-               
-       return ret;
-}
-
 struct stat64_emu31 {
        unsigned long long  st_dev;
        unsigned int    __pad1;
index 00d92a5..976518c 100644 (file)
@@ -94,7 +94,6 @@ long sys32_getuid16(void);
 long sys32_geteuid16(void);
 long sys32_getgid16(void);
 long sys32_getegid16(void);
-long sys32_ipc(u32 call, int first, int second, int third, u32 ptr);
 long sys32_truncate64(const char __user * path, unsigned long high,
                      unsigned long low);
 long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low);
@@ -106,10 +105,6 @@ long sys32_pread64(unsigned int fd, char __user *ubuf, size_t count,
 long sys32_pwrite64(unsigned int fd, const char __user *ubuf,
                    size_t count, u32 poshi, u32 poslo);
 compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count);
-long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset,
-                   size_t count);
-long sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset,
-                     s32 count);
 long sys32_stat64(const char __user * filename, struct stat64_emu31 __user * statbuf);
 long sys32_lstat64(const char __user * filename,
                   struct stat64_emu31 __user * statbuf);
index 3c98c4d..17644c8 100644 (file)
@@ -258,11 +258,6 @@ ENTRY(sys32_mmap2_wrapper)
        llgtr   %r2,%r2                 # struct mmap_arg_struct_emu31 *
        jg      sys32_mmap2                     # branch to system call
 
-ENTRY(compat_sys_getrusage_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct rusage_emu31 *
-       jg      compat_sys_getrusage    # branch to system call
-
 ENTRY(compat_sys_gettimeofday_wrapper)
        llgtr   %r2,%r2                 # struct timeval_emu31 *
        llgtr   %r3,%r3                 # struct timezone *
@@ -393,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper)
        llgtr   %r2,%r2                 # struct sysinfo_emu31 *
        jg      compat_sys_sysinfo      # branch to system call
 
-ENTRY(sys32_ipc_wrapper)
-       llgfr   %r2,%r2                 # uint
-       lgfr    %r3,%r3                 # int
-       lgfr    %r4,%r4                 # int
-       lgfr    %r5,%r5                 # int
-       llgfr   %r6,%r6                 # u32
-       jg      sys32_ipc               # branch to system call
-
 ENTRY(sys32_fsync_wrapper)
        llgfr   %r2,%r2                 # unsigned int
        jg      sys_fsync               # branch to system call
@@ -666,13 +653,6 @@ ENTRY(sys32_capset_wrapper)
        llgtr   %r3,%r3                 # const cap_user_data_t
        jg      sys_capset              # branch to system call
 
-ENTRY(sys32_sendfile_wrapper)
-       lgfr    %r2,%r2                 # int
-       lgfr    %r3,%r3                 # int
-       llgtr   %r4,%r4                 # __kernel_off_emu31_t *
-       llgfr   %r5,%r5                 # size_t
-       jg      sys32_sendfile          # branch to system call
-
 #sys32_vfork_wrapper                   # done in vfork_glue
 
 ENTRY(sys32_truncate64_wrapper)
@@ -938,13 +918,6 @@ ENTRY(sys_epoll_wait_wrapper)
        lgfr    %r5,%r5                 # int
        jg      sys_epoll_wait          # branch to system call
 
-ENTRY(sys32_lookup_dcookie_wrapper)
-       sllg    %r2,%r2,32              # get high word of 64bit dcookie
-       or      %r2,%r3                 # get low word of 64bit dcookie
-       llgtr   %r3,%r4                 # char *
-       llgfr   %r4,%r5                 # size_t
-       jg      sys_lookup_dcookie
-
 ENTRY(sys32_fadvise64_wrapper)
        lgfr    %r2,%r2                 # int
        sllg    %r3,%r3,32              # get high word of 64bit loff_t
@@ -1264,29 +1237,12 @@ ENTRY(sys_tee_wrapper)
        llgfr   %r5,%r5                 # unsigned int
        jg      sys_tee
 
-ENTRY(compat_sys_vmsplice_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # compat_iovec *
-       llgfr   %r4,%r4                 # unsigned int
-       llgfr   %r5,%r5                 # unsigned int
-       jg      compat_sys_vmsplice
-
 ENTRY(sys_getcpu_wrapper)
        llgtr   %r2,%r2                 # unsigned *
        llgtr   %r3,%r3                 # unsigned *
        llgtr   %r4,%r4                 # struct getcpu_cache *
        jg      sys_getcpu
 
-ENTRY(compat_sys_epoll_pwait_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct compat_epoll_event *
-       lgfr    %r4,%r4                 # int
-       lgfr    %r5,%r5                 # int
-       llgtr   %r6,%r6                 # compat_sigset_t *
-       llgf    %r0,164(%r15)           # compat_size_t
-       stg     %r0,160(%r15)
-       jg      compat_sys_epoll_pwait
-
 ENTRY(compat_sys_utimes_wrapper)
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # struct compat_timeval *
@@ -1299,12 +1255,6 @@ ENTRY(compat_sys_utimensat_wrapper)
        lgfr    %r5,%r5                 # int
        jg      compat_sys_utimensat
 
-ENTRY(compat_sys_signalfd_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # compat_sigset_t *
-       llgfr   %r4,%r4                 # compat_size_t
-       jg      compat_sys_signalfd
-
 ENTRY(sys_eventfd_wrapper)
        llgfr   %r2,%r2                 # unsigned int
        jg      sys_eventfd
@@ -1323,13 +1273,6 @@ ENTRY(sys_timerfd_create_wrapper)
        lgfr    %r3,%r3                 # int
        jg      sys_timerfd_create
 
-ENTRY(compat_sys_signalfd4_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # compat_sigset_t *
-       llgfr   %r4,%r4                 # compat_size_t
-       lgfr    %r5,%r5                 # int
-       jg      compat_sys_signalfd4
-
 ENTRY(sys_eventfd2_wrapper)
        llgfr   %r2,%r2                 # unsigned int
        lgfr    %r3,%r3                 # int
@@ -1361,13 +1304,6 @@ ENTRY(sys32_readahead_wrapper)
        lgfr    %r5,%r5                 # s32
        jg      sys32_readahead         # branch to system call
 
-ENTRY(sys32_sendfile64_wrapper)
-       lgfr    %r2,%r2                 # int
-       lgfr    %r3,%r3                 # int
-       llgtr   %r4,%r4                 # compat_loff_t *
-       lgfr    %r5,%r5                 # s32
-       jg      sys32_sendfile64        # branch to system call
-
 ENTRY(sys_tkill_wrapper)
        lgfr    %r2,%r2                 # pid_t
        lgfr    %r3,%r3                 # int
index d0964d2..23eb222 100644 (file)
@@ -132,19 +132,9 @@ SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)
  * to
  *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
  */
-SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset,
-                              u32 len_high, u32 len_low)
+SYSCALL_DEFINE5(s390_fallocate, int, fd, int, mode, loff_t, offset,
+                              u32, len_high, u32, len_low)
 {
        return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_s390_fallocate(long fd, long mode, loff_t offset,
-                                  long len_high, long len_low)
-{
-       return SYSC_s390_fallocate((int) fd, (int) mode, offset,
-                                  (u32) len_high, (u32) len_low);
-}
-SYSCALL_ALIAS(sys_s390_fallocate, SyS_s390_fallocate);
-#endif
-
 #endif
index 630b935..d2baabe 100644 (file)
@@ -85,7 +85,7 @@ SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)
 SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)
 SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper)      /* 75 */
 SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit_wrapper)
-SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage_wrapper)
+SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage)
 SYSCALL(sys_gettimeofday,sys_gettimeofday,compat_sys_gettimeofday_wrapper)
 SYSCALL(sys_settimeofday,sys_settimeofday,compat_sys_settimeofday_wrapper)
 SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper)      /* 80 old getgroups16 syscall */
@@ -118,14 +118,14 @@ SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)
 SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)
 SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)
 NI_SYSCALL                                                     /* old uname syscall */
-SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,sys32_lookup_dcookie_wrapper)    /* 110 */
+SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,compat_sys_lookup_dcookie)       /* 110 */
 SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
 NI_SYSCALL                                                     /* old "idle" system call */
 NI_SYSCALL                                                     /* vm86old for i386 */
 SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)
 SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)         /* 115 */
 SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper)
-SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper)
+SYSCALL(sys_s390_ipc,sys_s390_ipc,compat_sys_s390_ipc)
 SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
 SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)
 SYSCALL(sys_clone,sys_clone,sys_clone_wrapper)                 /* 120 */
@@ -195,7 +195,7 @@ SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)
 SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)
 SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)            /* 185 */
 SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack)
-SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper)
+SYSCALL(sys_sendfile,sys_sendfile64,compat_sys_sendfile)
 NI_SYSCALL                                                     /* streams1 */
 NI_SYSCALL                                                     /* streams2 */
 SYSCALL(sys_vfork,sys_vfork,sys_vfork)                         /* 190 */
@@ -231,7 +231,7 @@ SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper)
 SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper)        /* 220 */
 SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper)
 SYSCALL(sys_readahead,sys_readahead,sys32_readahead_wrapper)
-SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64_wrapper)
+SYSCALL(sys_sendfile64,sys_ni_syscall,compat_sys_sendfile64)
 SYSCALL(sys_setxattr,sys_setxattr,sys32_setxattr_wrapper)
 SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper)   /* 225 */
 SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper)
@@ -317,20 +317,20 @@ SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)
 SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)
 SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)
 SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
-SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
+SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice)
 NI_SYSCALL                                                     /* 310 sys_move_pages */
 SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
-SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
+SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)
 SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
 SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
 SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper)      /* 315 */
-SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
+SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd)
 NI_SYSCALL                                             /* 317 old sys_timer_fd */
 SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)
 SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper)
 SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */
 SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime)
-SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper)
+SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4)
 SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper)
 SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
 SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */
index 5e90fa2..e77816c 100644 (file)
 # define __ARCH_WANT_SYS_VFORK
 # define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #include <uapi/asm/unistd.h>
index e564115..f5041d7 100644 (file)
@@ -62,7 +62,6 @@ config SPARC64
        select HAVE_RCU_TABLE_FREE if SMP
        select HAVE_MEMBLOCK
        select HAVE_MEMBLOCK_NODE_MAP
-       select HAVE_SYSCALL_WRAPPERS
        select HAVE_ARCH_TRANSPARENT_HUGEPAGE
        select HAVE_DYNAMIC_FTRACE
        select HAVE_FTRACE_MCOUNT_RECORD
index 5356810..dfa53fd 100644 (file)
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
 #endif
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _SPARC_UNISTD_H */
index 240a3ce..2e680b5 100644 (file)
@@ -36,7 +36,6 @@ STUB: sra     REG1, 0, REG1; \
        jmpl    %g1 + %lo(SYSCALL), %g0; \
        sra     REG3, 0, REG3
 
-SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
 SIGN1(sys32_readahead, compat_sys_readahead, %o0)
 SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
 SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
@@ -46,12 +45,9 @@ SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
 SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
 SIGN1(sys32_select, compat_sys_select, %o0)
 SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5)
-SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)
 SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)
 SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
 SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
-SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
-SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
 
        .globl          sys32_mmap2
 sys32_mmap2:
index f38f228..3d0ddbc 100644 (file)
 #include <asm/mmu_context.h>
 #include <asm/compat_signal.h>
 
-#ifdef CONFIG_SYSVIPC                                                        
-asmlinkage long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, u32 fifth)
-{
-       int version;
-
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-
-       switch (call) {
-       case SEMTIMEDOP:
-               if (fifth)
-                       /* sign extend semid */
-                       return compat_sys_semtimedop((int)first,
-                                                    compat_ptr(ptr), second,
-                                                    compat_ptr(fifth));
-               /* else fall through for normal semop() */
-       case SEMOP:
-               /* struct sembuf is the same on 32 and 64bit :)) */
-               /* sign extend semid */
-               return sys_semtimedop((int)first, compat_ptr(ptr), second,
-                                     NULL);
-       case SEMGET:
-               /* sign extend key, nsems */
-               return sys_semget((int)first, (int)second, third);
-       case SEMCTL:
-               /* sign extend semid, semnum */
-               return compat_sys_semctl((int)first, (int)second, third,
-                                        compat_ptr(ptr));
-
-       case MSGSND:
-               /* sign extend msqid */
-               return compat_sys_msgsnd((int)first, (int)second, third,
-                                        compat_ptr(ptr));
-       case MSGRCV:
-               /* sign extend msqid, msgtyp */
-               return compat_sys_msgrcv((int)first, second, (int)fifth,
-                                        third, version, compat_ptr(ptr));
-       case MSGGET:
-               /* sign extend key */
-               return sys_msgget((int)first, second);
-       case MSGCTL:
-               /* sign extend msqid */
-               return compat_sys_msgctl((int)first, second, compat_ptr(ptr));
-
-       case SHMAT:
-               /* sign extend shmid */
-               return compat_sys_shmat((int)first, second, third, version,
-                                       compat_ptr(ptr));
-       case SHMDT:
-               return sys_shmdt(compat_ptr(ptr));
-       case SHMGET:
-               /* sign extend key_t */
-               return sys_shmget((int)first, second, third);
-       case SHMCTL:
-               /* sign extend shmid */
-               return compat_sys_shmctl((int)first, second, compat_ptr(ptr));
-
-       default:
-               return -ENOSYS;
-       }
-
-       return -ENOSYS;
-}
-#endif
-
 asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
 {
        if ((int)high < 0)
@@ -303,15 +238,7 @@ long compat_sys_fadvise64_64(int fd,
                                advice);
 }
 
-long sys32_lookup_dcookie(unsigned long cookie_high,
-                         unsigned long cookie_low,
-                         char __user *buf, size_t len)
-{
-       return sys_lookup_dcookie((cookie_high << 32) | cookie_low,
-                                 buf, len);
-}
-
-long compat_sync_file_range(int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, int flags)
+long sys32_sync_file_range(unsigned int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, unsigned int flags)
 {
        return sys_sync_file_range(fd,
                                   (off_high << 32) | off_low,
index 708bc29..2daaaa6 100644 (file)
@@ -353,7 +353,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
                case SEMCTL: {
                        err = sys_semctl(first, second,
                                         (int)third | IPC_64,
-                                        (union semun) ptr);
+                                        (unsigned long) ptr);
                        goto out;
                }
                default:
@@ -470,10 +470,6 @@ SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)
 
        return vm_munmap(addr, len);
 }
-
-extern unsigned long do_mremap(unsigned long addr,
-       unsigned long old_len, unsigned long new_len,
-       unsigned long flags, unsigned long new_addr);
                 
 SYSCALL_DEFINE5(64_mremap, unsigned long, addr,        unsigned long, old_len,
                unsigned long, new_len, unsigned long, flags,
index 0881348..8fd9320 100644 (file)
@@ -23,9 +23,9 @@ sys_call_table32:
 /*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
 /*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek
 /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
-/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
+/*25*/ .word compat_sys_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
 /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
-       .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile
+       .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, compat_sys_sendfile
 /*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
        .word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16
 /*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
@@ -41,7 +41,7 @@ sys_call_table32:
 /*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending
        .word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid
 /*110*/        .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
-       .word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
+       .word sys_getgroups, compat_sys_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd
 /*120*/        .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
        .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
 /*130*/        .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
@@ -59,7 +59,7 @@ sys_call_table32:
 /*190*/        .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
        .word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask
 /*200*/        .word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
-       .word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64
+       .word sys32_readahead, sys32_socketcall, sys_syslog, compat_sys_lookup_dcookie, sys32_fadvise64
 /*210*/        .word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo
        .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex
 /*220*/        .word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid
index 0f712f4..0e53439 100644 (file)
@@ -16,7 +16,6 @@ config TILE
        select GENERIC_PENDING_IRQ if SMP
        select GENERIC_IRQ_SHOW
        select HAVE_DEBUG_BUGVERBOSE
-       select HAVE_SYSCALL_WRAPPERS if TILEGX
        select VIRT_TO_BUS
        select SYS_HYPERVISOR
        select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
index 6ea4cdb..ed37841 100644 (file)
@@ -56,12 +56,6 @@ COMPAT_SYSCALL_DEFINE6(pwrite64, unsigned int, fd, char __user *, ubuf,
        return sys_pwrite64(fd, ubuf, count, ((loff_t)high << 32) | low);
 }
 
-COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, low, u32, high,
-                       char __user *, buf, size_t, len)
-{
-       return sys_lookup_dcookie(((loff_t)high << 32) | low, buf, len);
-}
-
 COMPAT_SYSCALL_DEFINE6(sync_file_range2, int, fd, unsigned int, flags,
                        u32, offset_lo, u32, offset_hi,
                        u32, nbytes_lo, u32, nbytes_hi)
index 455646e..e785b42 100644 (file)
@@ -5,9 +5,6 @@
 obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_signal.o
 obj-$(CONFIG_IA32_EMULATION) += nosyscall.o syscall_ia32.o
 
-sysv-$(CONFIG_SYSVIPC) := ipc32.o
-obj-$(CONFIG_IA32_EMULATION) += $(sysv-y)
-
 obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
 
 audit-class-$(CONFIG_AUDIT) := audit.o
diff --git a/arch/x86/ia32/ipc32.c b/arch/x86/ia32/ipc32.c
deleted file mode 100644 (file)
index 29cdcd0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-#include <linux/syscalls.h>
-#include <linux/time.h>
-#include <linux/sem.h>
-#include <linux/msg.h>
-#include <linux/shm.h>
-#include <linux/ipc.h>
-#include <linux/compat.h>
-#include <asm/sys_ia32.h>
-
-asmlinkage long sys32_ipc(u32 call, int first, int second, int third,
-                         compat_uptr_t ptr, u32 fifth)
-{
-       int version;
-
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-
-       switch (call) {
-       case SEMOP:
-               /* struct sembuf is the same on 32 and 64bit :)) */
-               return sys_semtimedop(first, compat_ptr(ptr), second, NULL);
-       case SEMTIMEDOP:
-               return compat_sys_semtimedop(first, compat_ptr(ptr), second,
-                                               compat_ptr(fifth));
-       case SEMGET:
-               return sys_semget(first, second, third);
-       case SEMCTL:
-               return compat_sys_semctl(first, second, third, compat_ptr(ptr));
-
-       case MSGSND:
-               return compat_sys_msgsnd(first, second, third, compat_ptr(ptr));
-       case MSGRCV:
-               return compat_sys_msgrcv(first, second, fifth, third,
-                                        version, compat_ptr(ptr));
-       case MSGGET:
-               return sys_msgget((key_t) first, second);
-       case MSGCTL:
-               return compat_sys_msgctl(first, second, compat_ptr(ptr));
-
-       case SHMAT:
-               return compat_sys_shmat(first, second, third, version,
-                                       compat_ptr(ptr));
-       case SHMDT:
-               return sys_shmdt(compat_ptr(ptr));
-       case SHMGET:
-               return sys_shmget(first, (unsigned)second, third);
-       case SHMCTL:
-               return compat_sys_shmctl(first, second, compat_ptr(ptr));
-       }
-       return -ENOSYS;
-}
index ad7a20c..4e4907c 100644 (file)
@@ -166,12 +166,6 @@ asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg)
                               a.offset>>PAGE_SHIFT);
 }
 
-asmlinkage long sys32_mprotect(unsigned long start, size_t len,
-                              unsigned long prot)
-{
-       return sys_mprotect(start, len, prot);
-}
-
 asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr,
                              int options)
 {
@@ -194,35 +188,10 @@ asmlinkage long sys32_pwrite(unsigned int fd, const char __user *ubuf,
 }
 
 
-asmlinkage long sys32_sendfile(int out_fd, int in_fd,
-                              compat_off_t __user *offset, s32 count)
-{
-       mm_segment_t old_fs = get_fs();
-       int ret;
-       off_t of;
-
-       if (offset && get_user(of, offset))
-               return -EFAULT;
-
-       set_fs(KERNEL_DS);
-       ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL,
-                          count);
-       set_fs(old_fs);
-
-       if (offset && put_user(of, offset))
-               return -EFAULT;
-       return ret;
-}
-
 /*
  * Some system calls that need sign extended arguments. This could be
  * done by a generic wrapper.
  */
-long sys32_kill(int pid, int sig)
-{
-       return sys_kill(pid, sig);
-}
-
 long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 offset_high,
                        __u32 len_low, __u32 len_high, int advice)
 {
@@ -246,12 +215,6 @@ long sys32_vm86_warning(void)
        return -ENOSYS;
 }
 
-long sys32_lookup_dcookie(u32 addr_low, u32 addr_high,
-                         char __user *buf, size_t len)
-{
-       return sys_lookup_dcookie(((u64)addr_high << 32) | addr_low, buf, len);
-}
-
 asmlinkage ssize_t sys32_readahead(int fd, unsigned off_lo, unsigned off_hi,
                                   size_t count)
 {
index 8459efc..0ef202e 100644 (file)
@@ -30,23 +30,14 @@ asmlinkage long sys32_fstatat(unsigned int, const char __user *,
                              struct stat64 __user *, int);
 struct mmap_arg_struct32;
 asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *);
-asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long);
-
-asmlinkage long sys32_alarm(unsigned int);
 
 asmlinkage long sys32_waitpid(compat_pid_t, unsigned int __user *, int);
-asmlinkage long sys32_sysfs(int, u32, u32);
 
 asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32);
 asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32);
 
-asmlinkage long sys32_personality(unsigned long);
-asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32);
-
-long sys32_kill(int, int);
 long sys32_fadvise64_64(int, __u32, __u32, __u32, __u32, int);
 long sys32_vm86_warning(void);
-long sys32_lookup_dcookie(u32, u32, char __user *, size_t);
 
 asmlinkage ssize_t sys32_readahead(int, unsigned, unsigned, size_t);
 asmlinkage long sys32_sync_file_range(int, unsigned, unsigned,
@@ -59,9 +50,6 @@ asmlinkage long sys32_fallocate(int, int, unsigned,
 asmlinkage long sys32_sigreturn(void);
 asmlinkage long sys32_rt_sigreturn(void);
 
-/* ia32/ipc32.c */
-asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32);
-
 asmlinkage long sys32_fanotify_mark(int, unsigned int, u32, u32, int,
                                    const char __user *);
 
index 6cf0a9c..5f87b35 100644 (file)
@@ -27,8 +27,8 @@ asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
 long sys_rt_sigreturn(void);
 
 /* kernel/tls.c */
-asmlinkage int sys_set_thread_area(struct user_desc __user *);
-asmlinkage int sys_get_thread_area(struct user_desc __user *);
+asmlinkage long sys_set_thread_area(struct user_desc __user *);
+asmlinkage long sys_get_thread_area(struct user_desc __user *);
 
 /* X86_32 only */
 #ifdef CONFIG_X86_32
index 3d5df1c..c2a4813 100644 (file)
 # define __ARCH_WANT_SYS_VFORK
 # define __ARCH_WANT_SYS_CLONE
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-# define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
 #endif /* _ASM_X86_UNISTD_H */
index 9d9d2f9..f7fec09 100644 (file)
@@ -3,13 +3,13 @@
 #include <linux/sched.h>
 #include <linux/user.h>
 #include <linux/regset.h>
+#include <linux/syscalls.h>
 
 #include <asm/uaccess.h>
 #include <asm/desc.h>
 #include <asm/ldt.h>
 #include <asm/processor.h>
 #include <asm/proto.h>
-#include <asm/syscalls.h>
 
 #include "tls.h"
 
@@ -89,11 +89,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
        return 0;
 }
 
-asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
+SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info)
 {
-       int ret = do_set_thread_area(current, -1, u_info, 1);
-       asmlinkage_protect(1, ret, u_info);
-       return ret;
+       return do_set_thread_area(current, -1, u_info, 1);
 }
 
 
@@ -139,11 +137,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
        return 0;
 }
 
-asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
+SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info)
 {
-       int ret = do_get_thread_area(current, -1, u_info);
-       asmlinkage_protect(1, ret, u_info);
-       return ret;
+       return do_get_thread_area(current, -1, u_info);
 }
 
 int regset_tls_active(struct task_struct *target,
index e6d55f0..d0d59bf 100644 (file)
@@ -43,7 +43,7 @@
 34     i386    nice                    sys_nice
 35     i386    ftime
 36     i386    sync                    sys_sync
-37     i386    kill                    sys_kill                        sys32_kill
+37     i386    kill                    sys_kill
 38     i386    rename                  sys_rename
 39     i386    mkdir                   sys_mkdir
 40     i386    rmdir                   sys_rmdir
 114    i386    wait4                   sys_wait4                       compat_sys_wait4
 115    i386    swapoff                 sys_swapoff
 116    i386    sysinfo                 sys_sysinfo                     compat_sys_sysinfo
-117    i386    ipc                     sys_ipc                         sys32_ipc
+117    i386    ipc                     sys_ipc                         compat_sys_ipc
 118    i386    fsync                   sys_fsync
 119    i386    sigreturn               sys_sigreturn                   stub32_sigreturn
 120    i386    clone                   sys_clone                       stub32_clone
 122    i386    uname                   sys_newuname
 123    i386    modify_ldt              sys_modify_ldt
 124    i386    adjtimex                sys_adjtimex                    compat_sys_adjtimex
-125    i386    mprotect                sys_mprotect                    sys32_mprotect
+125    i386    mprotect                sys_mprotect
 126    i386    sigprocmask             sys_sigprocmask                 compat_sys_sigprocmask
 127    i386    create_module
 128    i386    init_module             sys_init_module
 184    i386    capget                  sys_capget
 185    i386    capset                  sys_capset
 186    i386    sigaltstack             sys_sigaltstack                 compat_sys_sigaltstack
-187    i386    sendfile                sys_sendfile                    sys32_sendfile
+187    i386    sendfile                sys_sendfile                    compat_sys_sendfile
 188    i386    getpmsg
 189    i386    putpmsg
 190    i386    vfork                   sys_vfork                       stub32_vfork
 250    i386    fadvise64               sys_fadvise64                   sys32_fadvise64
 # 251 is available for reuse (was briefly sys_set_zone_reclaim)
 252    i386    exit_group              sys_exit_group
-253    i386    lookup_dcookie          sys_lookup_dcookie              sys32_lookup_dcookie
+253    i386    lookup_dcookie          sys_lookup_dcookie              compat_sys_lookup_dcookie
 254    i386    epoll_create            sys_epoll_create
 255    i386    epoll_ctl               sys_epoll_ctl
 256    i386    epoll_wait              sys_epoll_wait
index 5f5feff..80ffa5b 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <linux/percpu.h>
 #include <linux/sched.h>
+#include <linux/syscalls.h>
 #include <asm/uaccess.h>
 #include <os.h>
 #include <skas.h>
@@ -274,7 +275,7 @@ clear:
        goto out;
 }
 
-int sys_set_thread_area(struct user_desc __user *user_desc)
+SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc)
 {
        struct user_desc info;
        int idx, ret;
@@ -322,7 +323,7 @@ int ptrace_set_thread_area(struct task_struct *child, int idx,
        return set_tls_entry(child, &info, idx, 0);
 }
 
-int sys_get_thread_area(struct user_desc __user *user_desc)
+SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)
 {
        struct user_desc info;
        int idx, ret;
index c38834d..cb4c2ce 100644 (file)
@@ -4,14 +4,6 @@
 #define __ARCH_WANT_SYS_CLONE
 #include <uapi/asm/unistd.h>
 
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-
 #define __ARCH_WANT_STAT64
 #define __ARCH_WANT_SYS_UTIME
 #define __ARCH_WANT_SYS_LLSEEK
index a62798f..59bfaec 100644 (file)
@@ -681,6 +681,9 @@ static int ptmx_open(struct inode *inode, struct file *filp)
 
        nonseekable_open(inode, filp);
 
+       /* We refuse fsnotify events on ptmx, since it's a shared resource */
+       filp->f_mode |= FMODE_NONOTIFY;
+
        retval = tty_alloc_file(filp);
        if (retval)
                return retval;
index 97ebc8c..6464029 100644 (file)
@@ -988,10 +988,10 @@ void start_tty(struct tty_struct *tty)
 
 EXPORT_SYMBOL(start_tty);
 
+/* We limit tty time update visibility to every 8 seconds or so. */
 static void tty_update_time(struct timespec *time)
 {
-       unsigned long sec = get_seconds();
-       sec -= sec % 60;
+       unsigned long sec = get_seconds() & ~7;
        if ((long)(sec - time->tv_sec) > 0)
                time->tv_sec = sec;
 }
index 1dc8786..6db8745 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1790,7 +1790,5 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
                        ret = read_events(ioctx, min_nr, nr, events, timeout);
                put_ioctx(ioctx);
        }
-
-       asmlinkage_protect(5, ret, ctx_id, min_nr, nr, events, timeout);
        return ret;
 }
index d487985..5f83ffa 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/signal.h>
 #include <linux/poll.h>
 #include <linux/mm.h>
-#include <linux/eventpoll.h>
 #include <linux/fs_struct.h>
 #include <linux/slab.h>
 #include <linux/pagemap.h>
@@ -1253,26 +1252,6 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,
        return compat_sys_pwritev64(fd, vec, vlen, pos);
 }
 
-asmlinkage long
-compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32,
-                   unsigned int nr_segs, unsigned int flags)
-{
-       unsigned i;
-       struct iovec __user *iov;
-       if (nr_segs > UIO_MAXIOV)
-               return -EINVAL;
-       iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
-       for (i = 0; i < nr_segs; i++) {
-               struct compat_iovec v;
-               if (get_user(v.iov_base, &iov32[i].iov_base) ||
-                   get_user(v.iov_len, &iov32[i].iov_len) ||
-                   put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
-                   put_user(v.iov_len, &iov[i].iov_len))
-                       return -EFAULT;
-       }
-       return sys_vmsplice(fd, iov, nr_segs, flags);
-}
-
 /*
  * Exactly like fs/open.c:sys_open(), except that it doesn't set the
  * O_LARGEFILE flag.
@@ -1658,84 +1637,6 @@ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
        return ret;
 }
 
-#ifdef CONFIG_EPOLL
-
-asmlinkage long compat_sys_epoll_pwait(int epfd,
-                       struct compat_epoll_event __user *events,
-                       int maxevents, int timeout,
-                       const compat_sigset_t __user *sigmask,
-                       compat_size_t sigsetsize)
-{
-       long err;
-       compat_sigset_t csigmask;
-       sigset_t ksigmask, sigsaved;
-
-       /*
-        * If the caller wants a certain signal mask to be set during the wait,
-        * we apply it here.
-        */
-       if (sigmask) {
-               if (sigsetsize != sizeof(compat_sigset_t))
-                       return -EINVAL;
-               if (copy_from_user(&csigmask, sigmask, sizeof(csigmask)))
-                       return -EFAULT;
-               sigset_from_compat(&ksigmask, &csigmask);
-               sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
-               sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
-       }
-
-       err = sys_epoll_wait(epfd, events, maxevents, timeout);
-
-       /*
-        * If we changed the signal mask, we need to restore the original one.
-        * In case we've got a signal while waiting, we do not restore the
-        * signal mask yet, and we allow do_signal() to deliver the signal on
-        * the way back to userspace, before the signal mask is restored.
-        */
-       if (sigmask) {
-               if (err == -EINTR) {
-                       memcpy(&current->saved_sigmask, &sigsaved,
-                              sizeof(sigsaved));
-                       set_restore_sigmask();
-               } else
-                       sigprocmask(SIG_SETMASK, &sigsaved, NULL);
-       }
-
-       return err;
-}
-
-#endif /* CONFIG_EPOLL */
-
-#ifdef CONFIG_SIGNALFD
-
-asmlinkage long compat_sys_signalfd4(int ufd,
-                                    const compat_sigset_t __user *sigmask,
-                                    compat_size_t sigsetsize, int flags)
-{
-       compat_sigset_t ss32;
-       sigset_t tmp;
-       sigset_t __user *ksigmask;
-
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-       if (copy_from_user(&ss32, sigmask, sizeof(ss32)))
-               return -EFAULT;
-       sigset_from_compat(&tmp, &ss32);
-       ksigmask = compat_alloc_user_space(sizeof(sigset_t));
-       if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t)))
-               return -EFAULT;
-
-       return sys_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags);
-}
-
-asmlinkage long compat_sys_signalfd(int ufd,
-                                   const compat_sigset_t __user *sigmask,
-                                   compat_size_t sigsetsize)
-{
-       return compat_sys_signalfd4(ufd, sigmask, sigsetsize, 0);
-}
-#endif /* CONFIG_SIGNALFD */
-
 #ifdef CONFIG_FHANDLE
 /*
  * Exactly like fs/open.c:sys_open_by_handle_at(), except that it
@@ -1747,25 +1648,3 @@ COMPAT_SYSCALL_DEFINE3(open_by_handle_at, int, mountdirfd,
        return do_handle_open(mountdirfd, handle, flags);
 }
 #endif
-
-#ifdef __ARCH_WANT_COMPAT_SYS_SENDFILE
-asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
-                                   compat_off_t __user *offset, compat_size_t count)
-{
-       loff_t pos;
-       off_t off;
-       ssize_t ret;
-
-       if (offset) {
-               if (unlikely(get_user(off, offset)))
-                       return -EFAULT;
-               pos = off;
-               ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
-               if (unlikely(put_user(pos, offset)))
-                       return -EFAULT;
-               return ret;
-       }
-
-       return do_sendfile(out_fd, in_fd, NULL, count, 0);
-}
-#endif /* __ARCH_WANT_COMPAT_SYS_SENDFILE */
index 17c7799..ab5954b 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/dcookies.h>
 #include <linux/mutex.h>
 #include <linux/path.h>
+#include <linux/compat.h>
 #include <asm/uaccess.h>
 
 /* The dcookies are allocated from a kmem_cache and
@@ -145,7 +146,7 @@ out:
 /* And here is where the userspace process can look up the cookie value
  * to retrieve the path.
  */
-SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len)
+SYSCALL_DEFINE3(lookup_dcookie, u64, cookie64, char __user *, buf, size_t, len)
 {
        unsigned long cookie = (unsigned long)cookie64;
        int err = -EINVAL;
@@ -201,12 +202,16 @@ out:
        mutex_unlock(&dcookie_mutex);
        return err;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_lookup_dcookie(u64 cookie64, long buf, long len)
+
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, w0, u32, w1, char __user *, buf, size_t, len)
 {
-       return SYSC_lookup_dcookie(cookie64, (char __user *) buf, (size_t) len);
+#ifdef __BIG_ENDIAN
+       return sys_lookup_dcookie(((u64)w0 << 32) | w1, buf, len);
+#else
+       return sys_lookup_dcookie(((u64)w1 << 32) | w0, buf, len);
+#endif
 }
-SYSCALL_ALIAS(sys_lookup_dcookie, SyS_lookup_dcookie);
 #endif
 
 static int dcookie_init(void)
index 277cc38..deecc72 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/atomic.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/compat.h>
 
 /*
  * LOCKING:
@@ -1998,6 +1999,52 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
        return error;
 }
 
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd,
+                       struct epoll_event __user *, events,
+                       int, maxevents, int, timeout,
+                       const compat_sigset_t __user *, sigmask,
+                       compat_size_t, sigsetsize)
+{
+       long err;
+       compat_sigset_t csigmask;
+       sigset_t ksigmask, sigsaved;
+
+       /*
+        * If the caller wants a certain signal mask to be set during the wait,
+        * we apply it here.
+        */
+       if (sigmask) {
+               if (sigsetsize != sizeof(compat_sigset_t))
+                       return -EINVAL;
+               if (copy_from_user(&csigmask, sigmask, sizeof(csigmask)))
+                       return -EFAULT;
+               sigset_from_compat(&ksigmask, &csigmask);
+               sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
+               sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
+       }
+
+       err = sys_epoll_wait(epfd, events, maxevents, timeout);
+
+       /*
+        * If we changed the signal mask, we need to restore the original one.
+        * In case we've got a signal while waiting, we do not restore the
+        * signal mask yet, and we allow do_signal() to deliver the signal on
+        * the way back to userspace, before the signal mask is restored.
+        */
+       if (sigmask) {
+               if (err == -EINTR) {
+                       memcpy(&current->saved_sigmask, &sigsaved,
+                              sizeof(sigsaved));
+                       set_restore_sigmask();
+               } else
+                       sigprocmask(SIG_SETMASK, &sigsaved, NULL);
+       }
+
+       return err;
+}
+#endif
+
 static int __init eventpoll_init(void)
 {
        struct sysinfo si;
index 5d84442..d0be29f 100644 (file)
@@ -755,9 +755,9 @@ out_destroy_group:
        return fd;
 }
 
-SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags,
-                             __u64 mask, int dfd,
-                             const char  __user * pathname)
+SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
+                             __u64, mask, int, dfd,
+                             const char  __user *, pathname)
 {
        struct inode *inode = NULL;
        struct vfsmount *mnt = NULL;
@@ -857,17 +857,6 @@ fput_and_out:
        return ret;
 }
 
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_fanotify_mark(long fanotify_fd, long flags, __u64 mask,
-                                 long dfd, long pathname)
-{
-       return SYSC_fanotify_mark((int) fanotify_fd, (unsigned int) flags,
-                                 mask, (int) dfd,
-                                 (const char  __user *) pathname);
-}
-SYSCALL_ALIAS(sys_fanotify_mark, SyS_fanotify_mark);
-#endif
-
 /*
  * fanotify_user_setup - Our initialization function.  Note that we cannot return
  * error because we have compiled-in VFS hooks.  So an (unlikely) failure here
index 6835446..8c74100 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -197,10 +197,7 @@ out:
 
 SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
 {
-       long ret = do_sys_ftruncate(fd, length, 1);
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(2, ret, fd, length);
-       return ret;
+       return do_sys_ftruncate(fd, length, 1);
 }
 
 #ifdef CONFIG_COMPAT
@@ -212,32 +209,15 @@ COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
 
 /* LFS versions of truncate are only needed on 32 bit machines */
 #if BITS_PER_LONG == 32
-SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length)
+SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)
 {
        return do_sys_truncate(path, length);
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_truncate64(long path, loff_t length)
-{
-       return SYSC_truncate64((const char __user *) path, length);
-}
-SYSCALL_ALIAS(sys_truncate64, SyS_truncate64);
-#endif
 
-SYSCALL_DEFINE(ftruncate64)(unsigned int fd, loff_t length)
+SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
 {
-       long ret = do_sys_ftruncate(fd, length, 0);
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(2, ret, fd, length);
-       return ret;
-}
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_ftruncate64(long fd, loff_t length)
-{
-       return SYSC_ftruncate64((unsigned int) fd, length);
+       return do_sys_ftruncate(fd, length, 0);
 }
-SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64);
-#endif
 #endif /* BITS_PER_LONG == 32 */
 
 
@@ -299,7 +279,7 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
        return ret;
 }
 
-SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)
+SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
 {
        struct fd f = fdget(fd);
        int error = -EBADF;
@@ -311,14 +291,6 @@ SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)
        return error;
 }
 
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_fallocate(long fd, long mode, loff_t offset, loff_t len)
-{
-       return SYSC_fallocate((int)fd, (int)mode, offset, len);
-}
-SYSCALL_ALIAS(sys_fallocate, SyS_fallocate);
-#endif
-
 /*
  * access() needs to use the real uid/gid, not the effective uid/gid.
  * We do this by temporarily clearing all FS-related capabilities and
@@ -983,29 +955,19 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
 
 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
 {
-       long ret;
-
        if (force_o_largefile())
                flags |= O_LARGEFILE;
 
-       ret = do_sys_open(AT_FDCWD, filename, flags, mode);
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, filename, flags, mode);
-       return ret;
+       return do_sys_open(AT_FDCWD, filename, flags, mode);
 }
 
 SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
                umode_t, mode)
 {
-       long ret;
-
        if (force_o_largefile())
                flags |= O_LARGEFILE;
 
-       ret = do_sys_open(dfd, filename, flags, mode);
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(4, ret, dfd, filename, flags, mode);
-       return ret;
+       return do_sys_open(dfd, filename, flags, mode);
 }
 
 #ifndef __alpha__
index 7a64891..8274a79 100644 (file)
@@ -515,8 +515,8 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
        return ret;
 }
 
-SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf,
-                       size_t count, loff_t pos)
+SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
+                       size_t, count, loff_t, pos)
 {
        struct fd f;
        ssize_t ret = -EBADF;
@@ -534,17 +534,9 @@ SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf,
 
        return ret;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_pread64(long fd, long buf, long count, loff_t pos)
-{
-       return SYSC_pread64((unsigned int) fd, (char __user *) buf,
-                           (size_t) count, pos);
-}
-SYSCALL_ALIAS(sys_pread64, SyS_pread64);
-#endif
 
-SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf,
-                        size_t count, loff_t pos)
+SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
+                        size_t, count, loff_t, pos)
 {
        struct fd f;
        ssize_t ret = -EBADF;
@@ -562,14 +554,6 @@ SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf,
 
        return ret;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_pwrite64(long fd, long buf, long count, loff_t pos)
-{
-       return SYSC_pwrite64((unsigned int) fd, (const char __user *) buf,
-                            (size_t) count, pos);
-}
-SYSCALL_ALIAS(sys_pwrite64, SyS_pwrite64);
-#endif
 
 /*
  * Reduce an iovec's length in-place.  Return the resulting number of segments
@@ -897,8 +881,8 @@ SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
        return ret;
 }
 
-ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
-                   loff_t max)
+static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
+                          size_t count, loff_t max)
 {
        struct fd in, out;
        struct inode *in_inode, *out_inode;
@@ -1022,3 +1006,43 @@ SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, si
 
        return do_sendfile(out_fd, in_fd, NULL, count, 0);
 }
+
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd,
+               compat_off_t __user *, offset, compat_size_t, count)
+{
+       loff_t pos;
+       off_t off;
+       ssize_t ret;
+
+       if (offset) {
+               if (unlikely(get_user(off, offset)))
+                       return -EFAULT;
+               pos = off;
+               ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
+               if (unlikely(put_user(pos, offset)))
+                       return -EFAULT;
+               return ret;
+       }
+
+       return do_sendfile(out_fd, in_fd, NULL, count, 0);
+}
+
+COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd,
+               compat_loff_t __user *, offset, compat_size_t, count)
+{
+       loff_t pos;
+       ssize_t ret;
+
+       if (offset) {
+               if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
+                       return -EFAULT;
+               ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
+               if (unlikely(put_user(pos, offset)))
+                       return -EFAULT;
+               return ret;
+       }
+
+       return do_sendfile(out_fd, in_fd, NULL, count, 0);
+}
+#endif
index d3e00ef..d07b954 100644 (file)
@@ -12,5 +12,3 @@ ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
                unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn);
 ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
                unsigned long nr_segs, loff_t *ppos, io_fn_t fn);
-ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,
-                   loff_t max);
index b534869..424b7b6 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/signalfd.h>
 #include <linux/syscalls.h>
 #include <linux/proc_fs.h>
+#include <linux/compat.h>
 
 void signalfd_cleanup(struct sighand_struct *sighand)
 {
@@ -311,3 +312,33 @@ SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
 {
        return sys_signalfd4(ufd, user_mask, sizemask, 0);
 }
+
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd,
+                    const compat_sigset_t __user *,sigmask,
+                    compat_size_t, sigsetsize,
+                    int, flags)
+{
+       compat_sigset_t ss32;
+       sigset_t tmp;
+       sigset_t __user *ksigmask;
+
+       if (sigsetsize != sizeof(compat_sigset_t))
+               return -EINVAL;
+       if (copy_from_user(&ss32, sigmask, sizeof(ss32)))
+               return -EFAULT;
+       sigset_from_compat(&tmp, &ss32);
+       ksigmask = compat_alloc_user_space(sizeof(sigset_t));
+       if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t)))
+               return -EFAULT;
+
+       return sys_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags);
+}
+
+COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd,
+                    const compat_sigset_t __user *,sigmask,
+                    compat_size_t, sigsetsize)
+{
+       return compat_sys_signalfd4(ufd, sigmask, sigsetsize, 0);
+}
+#endif
index 29e394e..6b485b8 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/security.h>
 #include <linux/gfp.h>
 #include <linux/socket.h>
+#include <linux/compat.h>
 #include "internal.h"
 
 /*
@@ -1690,6 +1691,27 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
        return error;
 }
 
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
+                   unsigned int, nr_segs, unsigned int, flags)
+{
+       unsigned i;
+       struct iovec __user *iov;
+       if (nr_segs > UIO_MAXIOV)
+               return -EINVAL;
+       iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
+       for (i = 0; i < nr_segs; i++) {
+               struct compat_iovec v;
+               if (get_user(v.iov_base, &iov32[i].iov_base) ||
+                   get_user(v.iov_len, &iov32[i].iov_len) ||
+                   put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
+                   put_user(v.iov_len, &iov[i].iov_len))
+                       return -EFAULT;
+       }
+       return sys_vmsplice(fd, iov, nr_segs, flags);
+}
+#endif
+
 SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
                int, fd_out, loff_t __user *, off_out,
                size_t, len, unsigned int, flags)
index 2c5d663..905f3f6 100644 (file)
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -283,8 +283,8 @@ EXPORT_SYMBOL(generic_write_sync);
  * already-instantiated disk blocks, there are no guarantees here that the data
  * will be available after a crash.
  */
-SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes,
-                               unsigned int flags)
+SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
+                               unsigned int, flags)
 {
        int ret;
        struct fd f;
@@ -365,29 +365,11 @@ out_put:
 out:
        return ret;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_sync_file_range(long fd, loff_t offset, loff_t nbytes,
-                                   long flags)
-{
-       return SYSC_sync_file_range((int) fd, offset, nbytes,
-                                   (unsigned int) flags);
-}
-SYSCALL_ALIAS(sys_sync_file_range, SyS_sync_file_range);
-#endif
 
 /* It would be nice if people remember that not all the world's an i386
    when they introduce new system calls */
-SYSCALL_DEFINE(sync_file_range2)(int fd, unsigned int flags,
-                                loff_t offset, loff_t nbytes)
+SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
+                                loff_t, offset, loff_t, nbytes)
 {
        return sys_sync_file_range(fd, offset, nbytes, flags);
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_sync_file_range2(long fd, long flags,
-                                    loff_t offset, loff_t nbytes)
-{
-       return SYSC_sync_file_range2((int) fd, (unsigned int) flags,
-                                    offset, nbytes);
-}
-SYSCALL_ALIAS(sys_sync_file_range2, SyS_sync_file_range2);
-#endif
index 4077b5d..0501fa3 100644 (file)
@@ -9,20 +9,3 @@
 #define __ARCH_WANT_STAT64
 #define __ARCH_WANT_SYS_LLSEEK
 #endif
-
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#ifndef cond_syscall
-#ifdef CONFIG_SYMBOL_PREFIX
-#define __SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
-#else
-#define __SYMBOL_PREFIX
-#endif
-#define cond_syscall(x) asm(".weak\t" __SYMBOL_PREFIX #x "\n\t" \
-                           ".set\t" __SYMBOL_PREFIX #x "," \
-                           __SYMBOL_PREFIX "sys_ni_syscall")
-#endif
index 377cd8c..d53c353 100644 (file)
 #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
 #endif
 
-#define __SC_CCAST1(t1, a1)      __SC_DELOUSE(t1,a1)
-#define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__)
-#define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__)
-#define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__)
-#define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__)
-#define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)
 #define COMPAT_SYSCALL_DEFINE1(name, ...) \
         COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
 #define COMPAT_SYSCALL_DEFINE2(name, ...) \
 #define COMPAT_SYSCALL_DEFINE6(name, ...) \
        COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
 
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-
 #define COMPAT_SYSCALL_DEFINEx(x, name, ...)                           \
-       asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__));    \
-       static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__));     \
-       asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__))     \
+       asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
+       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
+       asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\
        {                                                               \
-               return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__)); \
+               return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
        }                                                               \
        SYSCALL_ALIAS(compat_sys##name, compat_SyS##name);              \
-       static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__))
-
-#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
-
-#define COMPAT_SYSCALL_DEFINEx(x, name, ...)                           \
-       asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__))
-
-#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
 
 #ifndef compat_user_stack_pointer
 #define compat_user_stack_pointer() current_user_stack_pointer()
@@ -326,21 +311,13 @@ asmlinkage long
 compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
                           compat_size_t __user *len_ptr);
 
-#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
-long compat_sys_semctl(int first, int second, int third, void __user *uptr);
-long compat_sys_msgsnd(int first, int second, int third, void __user *uptr);
-long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
-               int version, void __user *uptr);
-long compat_sys_shmat(int first, int second, compat_uptr_t third, int version,
-               void __user *uptr);
-#else
-long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
-long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp,
+asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
+asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
+asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
+asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
                compat_ssize_t msgsz, int msgflg);
-long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp,
+asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,
                compat_ssize_t msgsz, long msgtyp, int msgflg);
-long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
-#endif
 long compat_sys_msgctl(int first, int second, void __user *uptr);
 long compat_sys_shmctl(int first, int second, void __user *uptr);
 long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
@@ -444,13 +421,13 @@ extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
 asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
                                  compat_long_t addr, compat_long_t data);
 
+asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, size_t);
 /*
  * epoll (fs/eventpoll.c) compat bits follow ...
  */
-struct epoll_event;
-#define compat_epoll_event     epoll_event
+struct epoll_event;    /* fortunately, this one is fixed-layout */
 asmlinkage long compat_sys_epoll_pwait(int epfd,
-                       struct compat_epoll_event __user *events,
+                       struct epoll_event __user *events,
                        int maxevents, int timeout,
                        const compat_sigset_t __user *sigmask,
                        compat_size_t sigsetsize);
@@ -685,6 +662,8 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
 
 asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
                                    compat_off_t __user *offset, compat_size_t count);
+asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
+                                   compat_loff_t __user *offset, compat_size_t count);
 asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
                                       compat_stack_t __user *uoss_ptr);
 
index 807f1e5..829d66c 100644 (file)
@@ -2,6 +2,7 @@
 #define _LINUX_LINKAGE_H
 
 #include <linux/compiler.h>
+#include <linux/stringify.h>
 #include <asm/linkage.h>
 
 #ifdef __cplusplus
 #define asmlinkage CPP_ASMLINKAGE
 #endif
 
+#ifndef SYMBOL_NAME
+#ifdef CONFIG_SYMBOL_PREFIX
+#define SYMBOL_NAME(x) CONFIG_SYMBOL_PREFIX ## x
+#else
+#define SYMBOL_NAME(x) x
+#endif
+#endif
+#define __SYMBOL_NAME(x) __stringify(SYMBOL_NAME(x))
+
+#ifndef cond_syscall
+#define cond_syscall(x) asm(".weak\t" __SYMBOL_NAME(x) \
+       "\n\t.set\t" __SYMBOL_NAME(x) "," __SYMBOL_NAME(sys_ni_syscall));
+#endif
+
+#ifndef SYSCALL_ALIAS
+#define SYSCALL_ALIAS(alias, name)                             \
+       asm ("\t.globl " __SYMBOL_NAME(alias)                   \
+       "\n\t.set\t" __SYMBOL_NAME(alias) "," __SYMBOL_NAME(name))
+#endif
+
 #define __page_aligned_data    __section(.data..page_aligned) __aligned(PAGE_SIZE)
 #define __page_aligned_bss     __section(.bss..page_aligned) __aligned(PAGE_SIZE)
 
index c05d7cf..1a7f19e 100644 (file)
@@ -1082,9 +1082,6 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma,
                unsigned long old_addr, struct vm_area_struct *new_vma,
                unsigned long new_addr, unsigned long len,
                bool need_rmap_locks);
-extern unsigned long do_mremap(unsigned long addr,
-                              unsigned long old_len, unsigned long new_len,
-                              unsigned long flags, unsigned long new_addr);
 extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,
                              unsigned long end, pgprot_t newprot,
                              int dirty_accountable, int prot_numa);
index 313a8e0..4147d70 100644 (file)
@@ -78,49 +78,34 @@ struct sigaltstack;
 #include <linux/key.h>
 #include <trace/syscall.h>
 
-#define __SC_DECL1(t1, a1)     t1 a1
-#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
-#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
-#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
-#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
-#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
-
-#define __SC_LONG1(t1, a1)     long a1
-#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__)
-#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__)
-#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__)
-#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__)
-#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__)
-
-#define __SC_CAST1(t1, a1)     (t1) a1
-#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__)
-#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__)
-#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__)
-#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__)
-#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__)
-
-#define __SC_TEST(type)                BUILD_BUG_ON(sizeof(type) > sizeof(long))
-#define __SC_TEST1(t1, a1)     __SC_TEST(t1)
-#define __SC_TEST2(t2, a2, ...)        __SC_TEST(t2); __SC_TEST1(__VA_ARGS__)
-#define __SC_TEST3(t3, a3, ...)        __SC_TEST(t3); __SC_TEST2(__VA_ARGS__)
-#define __SC_TEST4(t4, a4, ...)        __SC_TEST(t4); __SC_TEST3(__VA_ARGS__)
-#define __SC_TEST5(t5, a5, ...)        __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
-#define __SC_TEST6(t6, a6, ...)        __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
+/*
+ * __MAP - apply a macro to syscall arguments
+ * __MAP(n, m, t1, a1, t2, a2, ..., tn, an) will expand to
+ *    m(t1, a1), m(t2, a2), ..., m(tn, an)
+ * The first argument must be equal to the amount of type/name
+ * pairs given.  Note that this list of pairs (i.e. the arguments
+ * of __MAP starting at the third one) is in the same format as
+ * for SYSCALL_DEFINE<n>/COMPAT_SYSCALL_DEFINE<n>
+ */
+#define __MAP0(m,...)
+#define __MAP1(m,t,a) m(t,a)
+#define __MAP2(m,t,a,...) m(t,a), __MAP1(m,__VA_ARGS__)
+#define __MAP3(m,t,a,...) m(t,a), __MAP2(m,__VA_ARGS__)
+#define __MAP4(m,t,a,...) m(t,a), __MAP3(m,__VA_ARGS__)
+#define __MAP5(m,t,a,...) m(t,a), __MAP4(m,__VA_ARGS__)
+#define __MAP6(m,t,a,...) m(t,a), __MAP5(m,__VA_ARGS__)
+#define __MAP(n,...) __MAP##n(__VA_ARGS__)
+
+#define __SC_DECL(t, a)        t a
+#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL))
+#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a
+#define __SC_CAST(t, a)        (t) a
+#define __SC_ARGS(t, a)        a
+#define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))
 
 #ifdef CONFIG_FTRACE_SYSCALLS
-#define __SC_STR_ADECL1(t, a)          #a
-#define __SC_STR_ADECL2(t, a, ...)     #a, __SC_STR_ADECL1(__VA_ARGS__)
-#define __SC_STR_ADECL3(t, a, ...)     #a, __SC_STR_ADECL2(__VA_ARGS__)
-#define __SC_STR_ADECL4(t, a, ...)     #a, __SC_STR_ADECL3(__VA_ARGS__)
-#define __SC_STR_ADECL5(t, a, ...)     #a, __SC_STR_ADECL4(__VA_ARGS__)
-#define __SC_STR_ADECL6(t, a, ...)     #a, __SC_STR_ADECL5(__VA_ARGS__)
-
-#define __SC_STR_TDECL1(t, a)          #t
-#define __SC_STR_TDECL2(t, a, ...)     #t, __SC_STR_TDECL1(__VA_ARGS__)
-#define __SC_STR_TDECL3(t, a, ...)     #t, __SC_STR_TDECL2(__VA_ARGS__)
-#define __SC_STR_TDECL4(t, a, ...)     #t, __SC_STR_TDECL3(__VA_ARGS__)
-#define __SC_STR_TDECL5(t, a, ...)     #t, __SC_STR_TDECL4(__VA_ARGS__)
-#define __SC_STR_TDECL6(t, a, ...)     #t, __SC_STR_TDECL5(__VA_ARGS__)
+#define __SC_STR_ADECL(t, a)   #a
+#define __SC_STR_TDECL(t, a)   #t
 
 extern struct ftrace_event_class event_class_syscall_enter;
 extern struct ftrace_event_class event_class_syscall_exit;
@@ -155,7 +140,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;
          __attribute__((section("_ftrace_events")))                    \
        *__event_exit_##sname = &event_exit_##sname;
 
-#define SYSCALL_METADATA(sname, nb)                            \
+#define SYSCALL_METADATA(sname, nb, ...)                       \
+       static const char *types_##sname[] = {                  \
+               __MAP(nb,__SC_STR_TDECL,__VA_ARGS__)            \
+       };                                                      \
+       static const char *args_##sname[] = {                   \
+               __MAP(nb,__SC_STR_ADECL,__VA_ARGS__)            \
+       };                                                      \
        SYSCALL_TRACE_ENTER_EVENT(sname);                       \
        SYSCALL_TRACE_EXIT_EVENT(sname);                        \
        static struct syscall_metadata __used                   \
@@ -163,8 +154,8 @@ extern struct trace_event_functions exit_syscall_print_funcs;
                .name           = "sys"#sname,                  \
                .syscall_nr     = -1,   /* Filled in at boot */ \
                .nb_args        = nb,                           \
-               .types          = types_##sname,                \
-               .args           = args_##sname,                 \
+               .types          = nb ? types_##sname : NULL,    \
+               .args           = nb ? args_##sname : NULL,     \
                .enter_event    = &event_enter_##sname,         \
                .exit_event     = &event_exit_##sname,          \
                .enter_fields   = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \
@@ -172,26 +163,13 @@ extern struct trace_event_functions exit_syscall_print_funcs;
        static struct syscall_metadata __used                   \
          __attribute__((section("__syscalls_metadata")))       \
         *__p_syscall_meta_##sname = &__syscall_meta_##sname;
+#else
+#define SYSCALL_METADATA(sname, nb, ...)
+#endif
 
 #define SYSCALL_DEFINE0(sname)                                 \
-       SYSCALL_TRACE_ENTER_EVENT(_##sname);                    \
-       SYSCALL_TRACE_EXIT_EVENT(_##sname);                     \
-       static struct syscall_metadata __used                   \
-         __syscall_meta__##sname = {                           \
-               .name           = "sys_"#sname,                 \
-               .syscall_nr     = -1,   /* Filled in at boot */ \
-               .nb_args        = 0,                            \
-               .enter_event    = &event_enter__##sname,        \
-               .exit_event     = &event_exit__##sname,         \
-               .enter_fields   = LIST_HEAD_INIT(__syscall_meta__##sname.enter_fields), \
-       };                                                      \
-       static struct syscall_metadata __used                   \
-         __attribute__((section("__syscalls_metadata")))       \
-        *__p_syscall_meta_##sname = &__syscall_meta__##sname;  \
+       SYSCALL_METADATA(_##sname, 0);                          \
        asmlinkage long sys_##sname(void)
-#else
-#define SYSCALL_DEFINE0(name)     asmlinkage long sys_##name(void)
-#endif
 
 #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
 #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
@@ -200,57 +178,23 @@ extern struct trace_event_functions exit_syscall_print_funcs;
 #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
 #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
 
-#ifdef CONFIG_PPC64
-#define SYSCALL_ALIAS(alias, name)                                     \
-       asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"      \
-            "\t.globl ." #alias "\n\t.set ." #alias ", ." #name)
-#else
-#if defined(CONFIG_ALPHA) || defined(CONFIG_MIPS)
-#define SYSCALL_ALIAS(alias, name)                                     \
-       asm ( #alias " = " #name "\n\t.globl " #alias)
-#else
-#define SYSCALL_ALIAS(alias, name)                                     \
-       asm ("\t.globl " #alias "\n\t.set " #alias ", " #name)
-#endif
-#endif
-
-#ifdef CONFIG_FTRACE_SYSCALLS
 #define SYSCALL_DEFINEx(x, sname, ...)                         \
-       static const char *types_##sname[] = {                  \
-               __SC_STR_TDECL##x(__VA_ARGS__)                  \
-       };                                                      \
-       static const char *args_##sname[] = {                   \
-               __SC_STR_ADECL##x(__VA_ARGS__)                  \
-       };                                                      \
-       SYSCALL_METADATA(sname, x);                             \
+       SYSCALL_METADATA(sname, x, __VA_ARGS__)                 \
        __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
-#else
-#define SYSCALL_DEFINEx(x, sname, ...)                         \
-       __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
-#endif
-
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-
-#define SYSCALL_DEFINE(name) static inline long SYSC_##name
 
+#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
 #define __SYSCALL_DEFINEx(x, name, ...)                                        \
-       asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));           \
-       static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));       \
-       asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))            \
+       asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));      \
+       static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
+       asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))       \
        {                                                               \
-               __SC_TEST##x(__VA_ARGS__);                              \
-               return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    \
+               long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \
+               __MAP(x,__SC_TEST,__VA_ARGS__);                         \
+               __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));       \
+               return ret;                                             \
        }                                                               \
        SYSCALL_ALIAS(sys##name, SyS##name);                            \
-       static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
-
-#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
-
-#define SYSCALL_DEFINE(name) asmlinkage long sys_##name
-#define __SYSCALL_DEFINEx(x, name, ...)                                        \
-       asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
-
-#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+       static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
 
 asmlinkage long sys_time(time_t __user *tloc);
 asmlinkage long sys_stime(time_t __user *tptr);
@@ -694,7 +638,7 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
 asmlinkage long sys_semget(key_t key, int nsems, int semflg);
 asmlinkage long sys_semop(int semid, struct sembuf __user *sops,
                                unsigned nsops);
-asmlinkage long sys_semctl(int semid, int semnum, int cmd, union semun arg);
+asmlinkage long sys_semctl(int semid, int semnum, int cmd, unsigned long arg);
 asmlinkage long sys_semtimedop(int semid, struct sembuf __user *sops,
                                unsigned nsops,
                                const struct timespec __user *timeout);
index 2547f29..892f658 100644 (file)
@@ -240,7 +240,7 @@ static inline int put_compat_semid_ds(struct semid64_ds *s,
 
 static long do_compat_semctl(int first, int second, int third, u32 pad)
 {
-       union semun fourth;
+       unsigned long fourth;
        int err, err2;
        struct semid64_ds s64;
        struct semid64_ds __user *up64;
@@ -249,9 +249,13 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
        memset(&s64, 0, sizeof(s64));
 
        if ((third & (~IPC_64)) == SETVAL)
-               fourth.val = (int) pad;
+#ifdef __BIG_ENDIAN
+               fourth = (unsigned long)pad << 32;
+#else
+               fourth = pad;
+#endif
        else
-               fourth.__pad = compat_ptr(pad);
+               fourth = (unsigned long)compat_ptr(pad);
        switch (third & (~IPC_64)) {
        case IPC_INFO:
        case IPC_RMID:
@@ -269,7 +273,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
        case IPC_STAT:
        case SEM_STAT:
                up64 = compat_alloc_user_space(sizeof(s64));
-               fourth.__pad = up64;
+               fourth = (unsigned long)up64;
                err = sys_semctl(first, second, third, fourth);
                if (err < 0)
                        break;
@@ -295,7 +299,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
                if (err)
                        break;
 
-               fourth.__pad = up64;
+               fourth = (unsigned long)up64;
                err = sys_semctl(first, second, third, fourth);
                break;
 
@@ -306,7 +310,7 @@ static long do_compat_semctl(int first, int second, int third, u32 pad)
        return err;
 }
 
-long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
+static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
 {
        struct compat_msgbuf __user *msgp = dest;
        size_t msgsz;
@@ -320,77 +324,117 @@ long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bufsz)
        return msgsz;
 }
 
+#ifndef COMPAT_SHMLBA
+#define COMPAT_SHMLBA  SHMLBA
+#endif
+
 #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
-long compat_sys_semctl(int first, int second, int third, void __user *uptr)
+COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
+       u32, third, compat_uptr_t, ptr, u32, fifth)
 {
+       int version;
        u32 pad;
 
-       if (!uptr)
-               return -EINVAL;
-       if (get_user(pad, (u32 __user *) uptr))
-               return -EFAULT;
-       return do_compat_semctl(first, second, third, pad);
-}
+       version = call >> 16; /* hack for backward compatibility */
+       call &= 0xffff;
+
+       switch (call) {
+       case SEMOP:
+               /* struct sembuf is the same on 32 and 64bit :)) */
+               return sys_semtimedop(first, compat_ptr(ptr), second, NULL);
+       case SEMTIMEDOP:
+               return compat_sys_semtimedop(first, compat_ptr(ptr), second,
+                                               compat_ptr(fifth));
+       case SEMGET:
+               return sys_semget(first, second, third);
+       case SEMCTL:
+               if (!ptr)
+                       return -EINVAL;
+               if (get_user(pad, (u32 __user *) compat_ptr(ptr)))
+                       return -EFAULT;
+               return do_compat_semctl(first, second, third, pad);
 
-long compat_sys_msgsnd(int first, int second, int third, void __user *uptr)
-{
-       struct compat_msgbuf __user *up = uptr;
-       long type;
+       case MSGSND: {
+               struct compat_msgbuf __user *up = compat_ptr(ptr);
+               compat_long_t type;
 
-       if (first < 0)
-               return -EINVAL;
-       if (second < 0)
-               return -EINVAL;
+               if (first < 0 || second < 0)
+                       return -EINVAL;
 
-       if (get_user(type, &up->mtype))
-               return -EFAULT;
+               if (get_user(type, &up->mtype))
+                       return -EFAULT;
 
-       return do_msgsnd(first, type, up->mtext, second, third);
-}
+               return do_msgsnd(first, type, up->mtext, second, third);
+       }
+       case MSGRCV: {
+               void __user *uptr = compat_ptr(ptr);
 
-long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
-                          int version, void __user *uptr)
-{
-       if (first < 0)
-               return -EINVAL;
-       if (second < 0)
-               return -EINVAL;
-
-       if (!version) {
-               struct compat_ipc_kludge ipck;
-               if (!uptr)
+               if (first < 0 || second < 0)
                        return -EINVAL;
-               if (copy_from_user (&ipck, uptr, sizeof(ipck)))
-                       return -EFAULT;
-               uptr = compat_ptr(ipck.msgp);
-               msgtyp = ipck.msgtyp;
+
+               if (!version) {
+                       struct compat_ipc_kludge ipck;
+                       if (!uptr)
+                               return -EINVAL;
+                       if (copy_from_user (&ipck, uptr, sizeof(ipck)))
+                               return -EFAULT;
+                       uptr = compat_ptr(ipck.msgp);
+                       fifth = ipck.msgtyp;
+               }
+               return do_msgrcv(first, uptr, second, fifth, third,
+                                compat_do_msg_fill);
        }
-       return do_msgrcv(first, uptr, second, msgtyp, third,
-                        compat_do_msg_fill);
+       case MSGGET:
+               return sys_msgget(first, second);
+       case MSGCTL:
+               return compat_sys_msgctl(first, second, compat_ptr(ptr));
+
+       case SHMAT: {
+               int err;
+               unsigned long raddr;
+
+               if (version == 1)
+                       return -EINVAL;
+               err = do_shmat(first, compat_ptr(ptr), second, &raddr,
+                              COMPAT_SHMLBA);
+               if (err < 0)
+                       return err;
+               return put_user(raddr, (compat_ulong_t *)compat_ptr(third));
+       }
+       case SHMDT:
+               return sys_shmdt(compat_ptr(ptr));
+       case SHMGET:
+               return sys_shmget(first, (unsigned)second, third);
+       case SHMCTL:
+               return compat_sys_shmctl(first, second, compat_ptr(ptr));
+       }
+
+       return -ENOSYS;
 }
-#else
-long compat_sys_semctl(int semid, int semnum, int cmd, int arg)
+#endif
+
+COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
 {
        return do_compat_semctl(semid, semnum, cmd, arg);
 }
 
-long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp,
-                      compat_ssize_t msgsz, int msgflg)
+COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
+                      compat_ssize_t, msgsz, int, msgflg)
 {
+       struct compat_msgbuf __user *up = compat_ptr(msgp);
        compat_long_t mtype;
 
-       if (get_user(mtype, &msgp->mtype))
+       if (get_user(mtype, &up->mtype))
                return -EFAULT;
-       return do_msgsnd(msqid, mtype, msgp->mtext, (ssize_t)msgsz, msgflg);
+       return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
 }
 
-long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp,
-                      compat_ssize_t msgsz, long msgtyp, int msgflg)
+COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
+                      compat_ssize_t, msgsz, long, msgtyp, int, msgflg)
 {
-       return do_msgrcv(msqid, msgp, (ssize_t)msgsz, msgtyp, msgflg,
-                        compat_do_msg_fill);
+       return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, msgtyp,
+                        msgflg, compat_do_msg_fill);
 }
-#endif
 
 static inline int get_compat_msqid64(struct msqid64_ds *m64,
                                     struct compat_msqid64_ds __user *up64)
@@ -508,28 +552,7 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)
        return err;
 }
 
-#ifndef COMPAT_SHMLBA
-#define COMPAT_SHMLBA  SHMLBA
-#endif
-
-#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
-long compat_sys_shmat(int first, int second, compat_uptr_t third, int version,
-                       void __user *uptr)
-{
-       int err;
-       unsigned long raddr;
-       compat_ulong_t __user *uaddr;
-
-       if (version == 1)
-               return -EINVAL;
-       err = do_shmat(first, uptr, second, &raddr, COMPAT_SHMLBA);
-       if (err < 0)
-               return err;
-       uaddr = compat_ptr(third);
-       return put_user(raddr, uaddr);
-}
-#else
-long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg)
+COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
 {
        unsigned long ret;
        long err;
@@ -540,7 +563,6 @@ long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg)
        force_successful_syscall_return();
        return (long)ret;
 }
-#endif
 
 static inline int get_compat_shmid64_ds(struct shmid64_ds *s64,
                                        struct compat_shmid64_ds __user *up64)
index 58d31f1..5b167d0 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -799,7 +799,7 @@ static unsigned long copy_semid_to_user(void __user *buf, struct semid64_ds *in,
 }
 
 static int semctl_nolock(struct ipc_namespace *ns, int semid,
-                        int cmd, int version, union semun arg)
+                        int cmd, int version, void __user *p)
 {
        int err;
        struct sem_array *sma;
@@ -834,7 +834,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
                }
                max_id = ipc_get_maxid(&sem_ids(ns));
                up_read(&sem_ids(ns).rw_mutex);
-               if (copy_to_user (arg.__buf, &seminfo, sizeof(struct seminfo))) 
+               if (copy_to_user(p, &seminfo, sizeof(struct seminfo))) 
                        return -EFAULT;
                return (max_id < 0) ? 0: max_id;
        }
@@ -871,7 +871,7 @@ static int semctl_nolock(struct ipc_namespace *ns, int semid,
                tbuf.sem_ctime  = sma->sem_ctime;
                tbuf.sem_nsems  = sma->sem_nsems;
                sem_unlock(sma);
-               if (copy_semid_to_user (arg.buf, &tbuf, version))
+               if (copy_semid_to_user(p, &tbuf, version))
                        return -EFAULT;
                return id;
        }
@@ -883,8 +883,67 @@ out_unlock:
        return err;
 }
 
+static int semctl_setval(struct ipc_namespace *ns, int semid, int semnum,
+               unsigned long arg)
+{
+       struct sem_undo *un;
+       struct sem_array *sma;
+       struct sem* curr;
+       int err;
+       int nsems;
+       struct list_head tasks;
+       int val;
+#if defined(CONFIG_64BIT) && defined(__BIG_ENDIAN)
+       /* big-endian 64bit */
+       val = arg >> 32;
+#else
+       /* 32bit or little-endian 64bit */
+       val = arg;
+#endif
+
+       sma = sem_lock_check(ns, semid);
+       if (IS_ERR(sma))
+               return PTR_ERR(sma);
+
+       INIT_LIST_HEAD(&tasks);
+       nsems = sma->sem_nsems;
+
+       err = -EACCES;
+       if (ipcperms(ns, &sma->sem_perm, S_IWUGO))
+               goto out_unlock;
+
+       err = security_sem_semctl(sma, SETVAL);
+       if (err)
+               goto out_unlock;
+
+       err = -EINVAL;
+       if(semnum < 0 || semnum >= nsems)
+               goto out_unlock;
+
+       curr = &sma->sem_base[semnum];
+
+       err = -ERANGE;
+       if (val > SEMVMX || val < 0)
+               goto out_unlock;
+
+       assert_spin_locked(&sma->sem_perm.lock);
+       list_for_each_entry(un, &sma->list_id, list_id)
+               un->semadj[semnum] = 0;
+
+       curr->semval = val;
+       curr->sempid = task_tgid_vnr(current);
+       sma->sem_ctime = get_seconds();
+       /* maybe some queued-up processes were waiting for this */
+       do_smart_update(sma, NULL, 0, 0, &tasks);
+       err = 0;
+out_unlock:
+       sem_unlock(sma);
+       wake_up_sem_queue_do(&tasks);
+       return err;
+}
+
 static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
-               int cmd, int version, union semun arg)
+               int cmd, void __user *p)
 {
        struct sem_array *sma;
        struct sem* curr;
@@ -903,7 +962,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
 
        err = -EACCES;
        if (ipcperms(ns, &sma->sem_perm,
-                       (cmd == SETVAL || cmd == SETALL) ? S_IWUGO : S_IRUGO))
+                       cmd == SETALL ? S_IWUGO : S_IRUGO))
                goto out_unlock;
 
        err = security_sem_semctl(sma, cmd);
@@ -914,7 +973,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
        switch (cmd) {
        case GETALL:
        {
-               ushort __user *array = arg.array;
+               ushort __user *array = p;
                int i;
 
                if(nsems > SEMMSL_FAST) {
@@ -957,7 +1016,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
                        }
                }
 
-               if (copy_from_user (sem_io, arg.array, nsems*sizeof(ushort))) {
+               if (copy_from_user (sem_io, p, nsems*sizeof(ushort))) {
                        sem_putref(sma);
                        err = -EFAULT;
                        goto out_free;
@@ -991,7 +1050,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
                err = 0;
                goto out_unlock;
        }
-       /* GETVAL, GETPID, GETNCTN, GETZCNT, SETVAL: fall-through */
+       /* GETVAL, GETPID, GETNCTN, GETZCNT: fall-through */
        }
        err = -EINVAL;
        if(semnum < 0 || semnum >= nsems)
@@ -1012,27 +1071,6 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
        case GETZCNT:
                err = count_semzcnt(sma,semnum);
                goto out_unlock;
-       case SETVAL:
-       {
-               int val = arg.val;
-               struct sem_undo *un;
-
-               err = -ERANGE;
-               if (val > SEMVMX || val < 0)
-                       goto out_unlock;
-
-               assert_spin_locked(&sma->sem_perm.lock);
-               list_for_each_entry(un, &sma->list_id, list_id)
-                       un->semadj[semnum] = 0;
-
-               curr->semval = val;
-               curr->sempid = task_tgid_vnr(current);
-               sma->sem_ctime = get_seconds();
-               /* maybe some queued-up processes were waiting for this */
-               do_smart_update(sma, NULL, 0, 0, &tasks);
-               err = 0;
-               goto out_unlock;
-       }
        }
 out_unlock:
        sem_unlock(sma);
@@ -1076,7 +1114,7 @@ copy_semid_from_user(struct semid64_ds *out, void __user *buf, int version)
  * NOTE: no locks must be held, the rw_mutex is taken inside this function.
  */
 static int semctl_down(struct ipc_namespace *ns, int semid,
-                      int cmd, int version, union semun arg)
+                      int cmd, int version, void __user *p)
 {
        struct sem_array *sma;
        int err;
@@ -1084,7 +1122,7 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
        struct kern_ipc_perm *ipcp;
 
        if(cmd == IPC_SET) {
-               if (copy_semid_from_user(&semid64, arg.buf, version))
+               if (copy_semid_from_user(&semid64, p, version))
                        return -EFAULT;
        }
 
@@ -1120,11 +1158,11 @@ out_up:
        return err;
 }
 
-SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)
+SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
 {
-       int err = -EINVAL;
        int version;
        struct ipc_namespace *ns;
+       void __user *p = (void __user *)arg;
 
        if (semid < 0)
                return -EINVAL;
@@ -1137,32 +1175,23 @@ SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)
        case SEM_INFO:
        case IPC_STAT:
        case SEM_STAT:
-               err = semctl_nolock(ns, semid, cmd, version, arg);
-               return err;
+               return semctl_nolock(ns, semid, cmd, version, p);
        case GETALL:
        case GETVAL:
        case GETPID:
        case GETNCNT:
        case GETZCNT:
-       case SETVAL:
        case SETALL:
-               err = semctl_main(ns,semid,semnum,cmd,version,arg);
-               return err;
+               return semctl_main(ns, semid, semnum, cmd, p);
+       case SETVAL:
+               return semctl_setval(ns, semid, semnum, arg);
        case IPC_RMID:
        case IPC_SET:
-               err = semctl_down(ns, semid, cmd, version, arg);
-               return err;
+               return semctl_down(ns, semid, cmd, version, p);
        default:
                return -EINVAL;
        }
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_semctl(int semid, int semnum, int cmd, union semun arg)
-{
-       return SYSC_semctl((int) semid, (int) semnum, (int) cmd, arg);
-}
-SYSCALL_ALIAS(sys_semctl, SyS_semctl);
-#endif
 
 /* If the task doesn't already have a undo_list, then allocate one
  * here.  We guarantee there is only one thread using this undo list,
index 0d1e32c..5242948 100644 (file)
@@ -33,12 +33,12 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
        case SEMGET:
                return sys_semget(first, second, third);
        case SEMCTL: {
-               union semun fourth;
+               unsigned long arg;
                if (!ptr)
                        return -EINVAL;
-               if (get_user(fourth.__pad, (void __user * __user *) ptr))
+               if (get_user(arg, (unsigned long __user *) ptr))
                        return -EFAULT;
-               return sys_semctl(first, second, third, fourth);
+               return sys_semctl(first, second, third, arg);
        }
 
        case MSGSND:
index 1e8f145..0a09e48 100644 (file)
@@ -516,25 +516,6 @@ int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru)
        return 0;
 }
 
-asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru)
-{
-       struct rusage r;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_getrusage(who, (struct rusage __user *) &r);
-       set_fs(old_fs);
-
-       if (ret)
-               return ret;
-
-       if (put_compat_rusage(&r, ru))
-               return -EFAULT;
-
-       return 0;
-}
-
 COMPAT_SYSCALL_DEFINE4(wait4,
        compat_pid_t, pid,
        compat_uint_t __user *, stat_addr,
index 60bc027..6e3151e 100644 (file)
@@ -1629,9 +1629,6 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
        }
 
        put_pid(pid);
-
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(5, ret, which, upid, infop, options, ru);
        return ret;
 }
 
@@ -1669,8 +1666,6 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
        ret = do_wait(&wo);
        put_pid(pid);
 
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
        return ret;
 }
 
index 339f60d..7d40687 100644 (file)
@@ -1677,10 +1677,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
                 int, tls_val)
 #endif
 {
-       long ret = do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
-       asmlinkage_protect(5, ret, clone_flags, newsp,
-                       parent_tidptr, child_tidptr, tls_val);
-       return ret;
+       return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
 }
 #endif
 
index afd0f7e..b95d3c7 100644 (file)
@@ -1851,6 +1851,20 @@ SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)
        return getrusage(current, who, ru);
 }
 
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE2(getrusage, int, who, struct compat_rusage __user *, ru)
+{
+       struct rusage r;
+
+       if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN &&
+           who != RUSAGE_THREAD)
+               return -EINVAL;
+
+       k_getrusage(current, who, &r);
+       return put_compat_rusage(&r, ru);
+}
+#endif
+
 SYSCALL_DEFINE1(umask, int, mask)
 {
        mask = xchg(&current->fs->umask, mask & S_IRWXUGO);
index 395084d..bfd6787 100644 (file)
@@ -20,6 +20,7 @@ cond_syscall(sys_quotactl);
 cond_syscall(sys32_quotactl);
 cond_syscall(sys_acct);
 cond_syscall(sys_lookup_dcookie);
+cond_syscall(compat_sys_lookup_dcookie);
 cond_syscall(sys_swapon);
 cond_syscall(sys_swapoff);
 cond_syscall(sys_kexec_load);
@@ -155,7 +156,7 @@ cond_syscall(compat_sys_process_vm_writev);
 cond_syscall(sys_pciconfig_read);
 cond_syscall(sys_pciconfig_write);
 cond_syscall(sys_pciconfig_iobase);
-cond_syscall(sys32_ipc);
+cond_syscall(compat_sys_s390_ipc);
 cond_syscall(ppc_rtas);
 cond_syscall(sys_spu_run);
 cond_syscall(sys_spu_create);
index d7948eb..f6c83d7 100644 (file)
 
 SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
 {
-       long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, filename, user, group);
-       return ret;
+       return sys_chown(filename, low2highuid(user), low2highgid(group));
 }
 
 SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
 {
-       long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, filename, user, group);
-       return ret;
+       return sys_lchown(filename, low2highuid(user), low2highgid(group));
 }
 
 SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
 {
-       long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, fd, user, group);
-       return ret;
+       return sys_fchown(fd, low2highuid(user), low2highgid(group));
 }
 
 SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
 {
-       long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(2, ret, rgid, egid);
-       return ret;
+       return sys_setregid(low2highgid(rgid), low2highgid(egid));
 }
 
 SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
 {
-       long ret = sys_setgid(low2highgid(gid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(1, ret, gid);
-       return ret;
+       return sys_setgid(low2highgid(gid));
 }
 
 SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
 {
-       long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(2, ret, ruid, euid);
-       return ret;
+       return sys_setreuid(low2highuid(ruid), low2highuid(euid));
 }
 
 SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
 {
-       long ret = sys_setuid(low2highuid(uid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(1, ret, uid);
-       return ret;
+       return sys_setuid(low2highuid(uid));
 }
 
 SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
 {
-       long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
+       return sys_setresuid(low2highuid(ruid), low2highuid(euid),
                                 low2highuid(suid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, ruid, euid, suid);
-       return ret;
 }
 
 SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp)
@@ -100,11 +76,8 @@ SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euid
 
 SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
 {
-       long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
+       return sys_setresgid(low2highgid(rgid), low2highgid(egid),
                                 low2highgid(sgid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(3, ret, rgid, egid, sgid);
-       return ret;
 }
 
 
@@ -127,18 +100,12 @@ SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egid
 
 SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
 {
-       long ret = sys_setfsuid(low2highuid(uid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(1, ret, uid);
-       return ret;
+       return sys_setfsuid(low2highuid(uid));
 }
 
 SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
 {
-       long ret = sys_setfsgid(low2highgid(gid));
-       /* avoid REGPARM breakage on x86: */
-       asmlinkage_protect(1, ret, gid);
-       return ret;
+       return sys_setfsgid(low2highgid(gid));
 }
 
 static int groups16_to_user(old_gid_t __user *grouplist,
index 7e09268..3bcfd81 100644 (file)
@@ -25,7 +25,7 @@
  * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could
  * deactivate the pages and clear PG_Referenced.
  */
-SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice)
+SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
 {
        struct fd f = fdget(fd);
        struct address_space *mapping;
@@ -145,26 +145,12 @@ out:
        fdput(f);
        return ret;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_fadvise64_64(long fd, loff_t offset, loff_t len, long advice)
-{
-       return SYSC_fadvise64_64((int) fd, offset, len, (int) advice);
-}
-SYSCALL_ALIAS(sys_fadvise64_64, SyS_fadvise64_64);
-#endif
 
 #ifdef __ARCH_WANT_SYS_FADVISE64
 
-SYSCALL_DEFINE(fadvise64)(int fd, loff_t offset, size_t len, int advice)
+SYSCALL_DEFINE4(fadvise64, int, fd, loff_t, offset, size_t, len, int, advice)
 {
        return sys_fadvise64_64(fd, offset, len, advice);
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_fadvise64(long fd, loff_t offset, long len, long advice)
-{
-       return SYSC_fadvise64((int) fd, offset, (size_t)len, (int)advice);
-}
-SYSCALL_ALIAS(sys_fadvise64, SyS_fadvise64);
-#endif
 
 #endif
index fbe3e2f..298884d 100644 (file)
@@ -1771,7 +1771,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)
  *
  * MREMAP_FIXED is not supported under NOMMU conditions
  */
-unsigned long do_mremap(unsigned long addr,
+static unsigned long do_mremap(unsigned long addr,
                        unsigned long old_len, unsigned long new_len,
                        unsigned long flags, unsigned long new_addr)
 {
@@ -1806,7 +1806,6 @@ unsigned long do_mremap(unsigned long addr,
        vma->vm_end = vma->vm_start + new_len;
        return vma->vm_start;
 }
-EXPORT_SYMBOL(do_mremap);
 
 SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
                unsigned long, new_len, unsigned long, flags,
index 7963f23..daed28d 100644 (file)
@@ -576,7 +576,7 @@ do_readahead(struct address_space *mapping, struct file *filp,
        return 0;
 }
 
-SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
+SYSCALL_DEFINE3(readahead, int, fd, loff_t, offset, size_t, count)
 {
        ssize_t ret;
        struct fd f;
@@ -595,10 +595,3 @@ SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
        }
        return ret;
 }
-#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
-asmlinkage long SyS_readahead(long fd, loff_t offset, long count)
-{
-       return SYSC_readahead((int) fd, offset, (size_t) count);
-}
-SYSCALL_ALIAS(sys_readahead, SyS_readahead);
-#endif