diff options
Diffstat (limited to 'arch/tile/include/asm')
| -rw-r--r-- | arch/tile/include/asm/atomic.h | 21 | ||||
| -rw-r--r-- | arch/tile/include/asm/hugetlb.h | 1 | ||||
| -rw-r--r-- | arch/tile/include/asm/irqflags.h | 10 | ||||
| -rw-r--r-- | arch/tile/include/asm/ptrace.h | 3 | ||||
| -rw-r--r-- | arch/tile/include/asm/syscall.h | 6 | ||||
| -rw-r--r-- | arch/tile/include/asm/syscalls.h | 6 | ||||
| -rw-r--r-- | arch/tile/include/asm/thread_info.h | 10 | ||||
| -rw-r--r-- | arch/tile/include/asm/uaccess.h | 7 | 
8 files changed, 53 insertions, 11 deletions
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h index f2461429a4a..e71387ab20c 100644 --- a/arch/tile/include/asm/atomic.h +++ b/arch/tile/include/asm/atomic.h @@ -131,4 +131,25 @@ static inline int atomic_read(const atomic_t *v)  #include <asm/atomic_64.h>  #endif +#ifndef __ASSEMBLY__ + +static inline long long atomic64_dec_if_positive(atomic64_t *v) +{ +	long long c, old, dec; + +	c = atomic64_read(v); +	for (;;) { +		dec = c - 1; +		if (unlikely(dec < 0)) +			break; +		old = atomic64_cmpxchg((v), c, dec); +		if (likely(old == c)) +			break; +		c = old; +	} +	return dec; +} + +#endif /* __ASSEMBLY__ */ +  #endif /* _ASM_TILE_ATOMIC_H */ diff --git a/arch/tile/include/asm/hugetlb.h b/arch/tile/include/asm/hugetlb.h index 0f885af2b62..3257733003f 100644 --- a/arch/tile/include/asm/hugetlb.h +++ b/arch/tile/include/asm/hugetlb.h @@ -16,6 +16,7 @@  #define _ASM_TILE_HUGETLB_H  #include <asm/page.h> +#include <asm-generic/hugetlb.h>  static inline int is_hugepage_only_range(struct mm_struct *mm, diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h index 241c0bb60b1..c96f9bbb760 100644 --- a/arch/tile/include/asm/irqflags.h +++ b/arch/tile/include/asm/irqflags.h @@ -40,7 +40,15 @@  #include <asm/percpu.h>  #include <arch/spr_def.h> -/* Set and clear kernel interrupt masks. */ +/* + * Set and clear kernel interrupt masks. + * + * NOTE: __insn_mtspr() is a compiler builtin marked as a memory + * clobber.  We rely on it being equivalent to a compiler barrier in + * this code since arch_local_irq_save() and friends must act as + * compiler barriers.  This compiler semantic is baked into enough + * places that the compiler will maintain it going forward. + */  #if CHIP_HAS_SPLIT_INTR_MASK()  #if INT_PERF_COUNT < 32 || INT_AUX_PERF_COUNT < 32 || INT_MEM_ERROR >= 32  # error Fix assumptions about which word various interrupts are in diff --git a/arch/tile/include/asm/ptrace.h b/arch/tile/include/asm/ptrace.h index 2e83fc1b946..fd412260aff 100644 --- a/arch/tile/include/asm/ptrace.h +++ b/arch/tile/include/asm/ptrace.h @@ -44,7 +44,8 @@ typedef unsigned long pt_reg_t;  struct pt_regs *get_pt_regs(struct pt_regs *);  /* Trace the current syscall. */ -extern void do_syscall_trace(void); +extern int do_syscall_trace_enter(struct pt_regs *regs); +extern void do_syscall_trace_exit(struct pt_regs *regs);  #define arch_has_single_step()	(1) diff --git a/arch/tile/include/asm/syscall.h b/arch/tile/include/asm/syscall.h index d35e0dcb67b..9644b88f133 100644 --- a/arch/tile/include/asm/syscall.h +++ b/arch/tile/include/asm/syscall.h @@ -22,6 +22,12 @@  #include <linux/err.h>  #include <arch/abi.h> +/* The array of function pointers for syscalls. */ +extern void *sys_call_table[]; +#ifdef CONFIG_COMPAT +extern void *compat_sys_call_table[]; +#endif +  /*   * Only the low 32 bits of orig_r0 are meaningful, so we return int.   * This importantly ignores the high bits on 64-bit, so comparisons diff --git a/arch/tile/include/asm/syscalls.h b/arch/tile/include/asm/syscalls.h index 78886e2417a..07b298450ef 100644 --- a/arch/tile/include/asm/syscalls.h +++ b/arch/tile/include/asm/syscalls.h @@ -24,12 +24,6 @@  #include <linux/types.h>  #include <linux/compat.h> -/* The array of function pointers for syscalls. */ -extern void *sys_call_table[]; -#ifdef CONFIG_COMPAT -extern void *compat_sys_call_table[]; -#endif -  /*   * Note that by convention, any syscall which requires the current   * register set takes an additional "struct pt_regs *" pointer; a diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h index e9c670d7a7f..d1733dee98a 100644 --- a/arch/tile/include/asm/thread_info.h +++ b/arch/tile/include/asm/thread_info.h @@ -124,6 +124,7 @@ extern void _cpu_idle(void);  #define TIF_SECCOMP		6	/* secure computing */  #define TIF_MEMDIE		7	/* OOM killer at work */  #define TIF_NOTIFY_RESUME	8	/* callback before returning to user */ +#define TIF_SYSCALL_TRACEPOINT	9	/* syscall tracepoint instrumentation */  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED) @@ -134,12 +135,19 @@ extern void _cpu_idle(void);  #define _TIF_SECCOMP		(1<<TIF_SECCOMP)  #define _TIF_MEMDIE		(1<<TIF_MEMDIE)  #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME) +#define _TIF_SYSCALL_TRACEPOINT	(1<<TIF_SYSCALL_TRACEPOINT)  /* Work to do on any return to user space. */  #define _TIF_ALLWORK_MASK \    (_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SINGLESTEP|\     _TIF_ASYNC_TLB|_TIF_NOTIFY_RESUME) +/* Work to do at syscall entry. */ +#define _TIF_SYSCALL_ENTRY_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT) + +/* Work to do at syscall exit. */ +#define _TIF_SYSCALL_EXIT_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT) +  /*   * Thread-synchronous status.   * @@ -153,8 +161,6 @@ extern void _cpu_idle(void);  #define TS_POLLING		0x0004	/* in idle loop but not sleeping */  #define TS_RESTORE_SIGMASK	0x0008	/* restore signal mask in do_signal */ -#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING) -  #ifndef __ASSEMBLY__  #define HAVE_SET_RESTORE_SIGMASK	1  static inline void set_restore_sigmask(void) diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h index 9ab078a4605..8a082bc6bca 100644 --- a/arch/tile/include/asm/uaccess.h +++ b/arch/tile/include/asm/uaccess.h @@ -395,7 +395,12 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)  	return n;  } -#ifdef CONFIG_DEBUG_COPY_FROM_USER +#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS +/* + * There are still unprovable places in the generic code as of 2.6.34, so this + * option is not really compatible with -Werror, which is more useful in + * general. + */  extern void copy_from_user_overflow(void)  	__compiletime_warning("copy_from_user() size is not provably correct");  |