diff options
Diffstat (limited to 'arch/xtensa/include/asm')
103 files changed, 1984 insertions, 3321 deletions
diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild index c68e1680da0..c3d20ba6eb8 100644 --- a/arch/xtensa/include/asm/Kbuild +++ b/arch/xtensa/include/asm/Kbuild @@ -1 +1,32 @@ -include include/asm-generic/Kbuild.asm +generic-y += bitsperlong.h +generic-y += bug.h +generic-y += clkdev.h +generic-y += cputime.h +generic-y += device.h +generic-y += div64.h +generic-y += emergency-restart.h +generic-y += errno.h +generic-y += exec.h +generic-y += fcntl.h +generic-y += hardirq.h +generic-y += hash.h +generic-y += ioctl.h +generic-y += irq_regs.h +generic-y += kdebug.h +generic-y += kmap_types.h +generic-y += kvm_para.h +generic-y += linkage.h +generic-y += local.h +generic-y += local64.h +generic-y += mcs_spinlock.h +generic-y += percpu.h +generic-y += preempt.h +generic-y += resource.h +generic-y += scatterlist.h +generic-y += sections.h +generic-y += siginfo.h +generic-y += statfs.h +generic-y += termios.h +generic-y += topology.h +generic-y += trace_clock.h +generic-y += xor.h diff --git a/arch/xtensa/include/asm/atomic.h b/arch/xtensa/include/asm/atomic.h index a96a0619d0b..e5103b47a8c 100644 --- a/arch/xtensa/include/asm/atomic.h +++ b/arch/xtensa/include/asm/atomic.h @@ -7,7 +7,7 @@   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2008 Tensilica Inc.   */  #ifndef _XTENSA_ATOMIC_H @@ -18,17 +18,18 @@  #ifdef __KERNEL__  #include <asm/processor.h> -#include <asm/system.h> +#include <asm/cmpxchg.h> +#include <asm/barrier.h>  #define ATOMIC_INIT(i)	{ (i) }  /*   * This Xtensa implementation assumes that the right mechanism - * for exclusion is for locking interrupts to level 1. + * for exclusion is for locking interrupts to level EXCM_LEVEL.   *   * Locking interrupts looks like this:   * - *    rsil a15, 1 + *    rsil a15, LOCKLEVEL   *    <code>   *    wsr  a15, PS   *    rsync @@ -66,19 +67,35 @@   */  static inline void atomic_add(int i, atomic_t * v)  { -    unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15, "__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0              \n\t" -	"add     %0, %0, %1             \n\t" -	"s32i    %0, %2, 0              \n\t" -	"wsr     a15, "__stringify(PS)"       \n\t" -	"rsync                          \n" -	: "=&a" (vval) -	: "a" (i), "a" (v) -	: "a15", "memory" -	); +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       add     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (i), "a" (v) +			: "memory" +			); +#else +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15, "__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       add     %0, %0, %1\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval) +			: "a" (i), "a" (v) +			: "a15", "memory" +			); +#endif  }  /** @@ -90,19 +107,35 @@ static inline void atomic_add(int i, atomic_t * v)   */  static inline void atomic_sub(int i, atomic_t *v)  { -    unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15, "__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0              \n\t" -	"sub     %0, %0, %1             \n\t" -	"s32i    %0, %2, 0              \n\t" -	"wsr     a15, "__stringify(PS)"       \n\t" -	"rsync                          \n" -	: "=&a" (vval) -	: "a" (i), "a" (v) -	: "a15", "memory" -	); +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       sub     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (i), "a" (v) +			: "memory" +			); +#else +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15, "__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       sub     %0, %0, %1\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval) +			: "a" (i), "a" (v) +			: "a15", "memory" +			); +#endif  }  /* @@ -111,40 +144,78 @@ static inline void atomic_sub(int i, atomic_t *v)  static inline int atomic_add_return(int i, atomic_t * v)  { -     unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15,"__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0             \n\t" -	"add     %0, %0, %1            \n\t" -	"s32i    %0, %2, 0             \n\t" -	"wsr     a15, "__stringify(PS)"      \n\t" -	"rsync                         \n" -	: "=&a" (vval) -	: "a" (i), "a" (v) -	: "a15", "memory" -	); - -    return vval; +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       add     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			"       add     %0, %0, %2\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (i), "a" (v) +			: "memory" +			); + +	return result; +#else +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15,"__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       add     %0, %0, %1\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval) +			: "a" (i), "a" (v) +			: "a15", "memory" +			); + +	return vval; +#endif  }  static inline int atomic_sub_return(int i, atomic_t * v)  { -    unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15,"__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0             \n\t" -	"sub     %0, %0, %1            \n\t" -	"s32i    %0, %2, 0             \n\t" -	"wsr     a15, "__stringify(PS)"       \n\t" -	"rsync                         \n" -	: "=&a" (vval) -	: "a" (i), "a" (v) -	: "a15", "memory" -	); - -    return vval; +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       sub     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			"       sub     %0, %0, %2\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (i), "a" (v) +			: "memory" +			); + +	return result; +#else +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15,"__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       sub     %0, %0, %1\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval) +			: "a" (i), "a" (v) +			: "a15", "memory" +			); + +	return vval; +#endif  }  /** @@ -225,15 +296,15 @@ static inline int atomic_sub_return(int i, atomic_t * v)  #define atomic_xchg(v, new) (xchg(&((v)->counter), new))  /** - * atomic_add_unless - add unless the number is a given value + * __atomic_add_unless - add unless the number is a given value   * @v: pointer of type atomic_t   * @a: the amount to add to v...   * @u: ...unless v is equal to u.   *   * Atomically adds @a to @v, so long as it was not @u. - * Returns non-zero if @v was not @u, and zero otherwise. + * Returns the old value of @v.   */ -static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) +static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)  {  	int c, old;  	c = atomic_read(v); @@ -245,55 +316,78 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)  			break;  		c = old;  	} -	return c != (u); +	return c;  } -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)  static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)  { -    unsigned int all_f = -1; -    unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15,"__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0             \n\t" -	"xor     %1, %4, %3            \n\t" -	"and     %0, %0, %4            \n\t" -	"s32i    %0, %2, 0             \n\t" -	"wsr     a15, "__stringify(PS)"      \n\t" -	"rsync                         \n" -	: "=&a" (vval), "=a" (mask) -	: "a" (v), "a" (all_f), "1" (mask) -	: "a15", "memory" -	); +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       and     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (~mask), "a" (v) +			: "memory" +			); +#else +	unsigned int all_f = -1; +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15,"__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       xor     %1, %4, %3\n" +			"       and     %0, %0, %4\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval), "=a" (mask) +			: "a" (v), "a" (all_f), "1" (mask) +			: "a15", "memory" +			); +#endif  }  static inline void atomic_set_mask(unsigned int mask, atomic_t *v)  { -    unsigned int vval; - -    __asm__ __volatile__( -	"rsil    a15,"__stringify(LOCKLEVEL)"\n\t" -	"l32i    %0, %2, 0             \n\t" -	"or      %0, %0, %1            \n\t" -	"s32i    %0, %2, 0             \n\t" -	"wsr     a15, "__stringify(PS)"       \n\t" -	"rsync                         \n" -	: "=&a" (vval) -	: "a" (mask), "a" (v) -	: "a15", "memory" -	); +#if XCHAL_HAVE_S32C1I +	unsigned long tmp; +	int result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       or      %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (mask), "a" (v) +			: "memory" +			); +#else +	unsigned int vval; + +	__asm__ __volatile__( +			"       rsil    a15,"__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %2, 0\n" +			"       or      %0, %0, %1\n" +			"       s32i    %0, %2, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (vval) +			: "a" (mask), "a" (v) +			: "a15", "memory" +			); +#endif  } -/* Atomic operations are already serializing */ -#define smp_mb__before_atomic_dec()	barrier() -#define smp_mb__after_atomic_dec()	barrier() -#define smp_mb__before_atomic_inc()	barrier() -#define smp_mb__after_atomic_inc()	barrier() - -#include <asm-generic/atomic-long.h>  #endif /* __KERNEL__ */  #endif /* _XTENSA_ATOMIC_H */ - diff --git a/arch/xtensa/include/asm/auxvec.h b/arch/xtensa/include/asm/auxvec.h deleted file mode 100644 index 257dec75c5a..00000000000 --- a/arch/xtensa/include/asm/auxvec.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __XTENSA_AUXVEC_H -#define __XTENSA_AUXVEC_H - -#endif diff --git a/arch/xtensa/include/asm/barrier.h b/arch/xtensa/include/asm/barrier.h new file mode 100644 index 00000000000..5b88774c75a --- /dev/null +++ b/arch/xtensa/include/asm/barrier.h @@ -0,0 +1,21 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2001 - 2012 Tensilica Inc. + */ + +#ifndef _XTENSA_SYSTEM_H +#define _XTENSA_SYSTEM_H + +#define mb()  ({ __asm__ __volatile__("memw" : : : "memory"); }) +#define rmb() barrier() +#define wmb() mb() + +#define smp_mb__before_atomic()		barrier() +#define smp_mb__after_atomic()		barrier() + +#include <asm-generic/barrier.h> + +#endif /* _XTENSA_SYSTEM_H */ diff --git a/arch/xtensa/include/asm/bitops.h b/arch/xtensa/include/asm/bitops.h index 6c3930397bd..3f44fa2a53e 100644 --- a/arch/xtensa/include/asm/bitops.h +++ b/arch/xtensa/include/asm/bitops.h @@ -21,16 +21,8 @@  #include <asm/processor.h>  #include <asm/byteorder.h> -#include <asm/system.h> +#include <asm/barrier.h> -#ifdef CONFIG_SMP -# error SMP not supported on this architecture -#endif - -#define smp_mb__before_clear_bit()	barrier() -#define smp_mb__after_clear_bit()	barrier() - -#include <asm-generic/bitops/atomic.h>  #include <asm-generic/bitops/non-atomic.h>  #if XCHAL_HAVE_NSA @@ -105,27 +97,140 @@ static inline unsigned long __fls(unsigned long word)  #endif  #include <asm-generic/bitops/fls64.h> -#include <asm-generic/bitops/find.h> -#include <asm-generic/bitops/ext2-non-atomic.h> - -#ifdef __XTENSA_EL__ -# define ext2_set_bit_atomic(lock,nr,addr)				\ -	test_and_set_bit((nr), (unsigned long*)(addr)) -# define ext2_clear_bit_atomic(lock,nr,addr)				\ -	test_and_clear_bit((nr), (unsigned long*)(addr)) -#elif defined(__XTENSA_EB__) -# define ext2_set_bit_atomic(lock,nr,addr)				\ -	test_and_set_bit((nr) ^ 0x18, (unsigned long*)(addr)) -# define ext2_clear_bit_atomic(lock,nr,addr)				\ -	test_and_clear_bit((nr) ^ 0x18, (unsigned long*)(addr)) + +#if XCHAL_HAVE_S32C1I + +static inline void set_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       or      %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (mask), "a" (p) +			: "memory"); +} + +static inline void clear_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       and     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (~mask), "a" (p) +			: "memory"); +} + +static inline void change_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       xor     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (mask), "a" (p) +			: "memory"); +} + +static inline int +test_and_set_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       or      %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (mask), "a" (p) +			: "memory"); + +	return tmp & mask; +} + +static inline int +test_and_clear_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       and     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (~mask), "a" (p) +			: "memory"); + +	return tmp & mask; +} + +static inline int +test_and_change_bit(unsigned int bit, volatile unsigned long *p) +{ +	unsigned long tmp, value; +	unsigned long mask = 1UL << (bit & 31); + +	p += bit >> 5; + +	__asm__ __volatile__( +			"1:     l32i    %1, %3, 0\n" +			"       wsr     %1, scompare1\n" +			"       xor     %0, %1, %2\n" +			"       s32c1i  %0, %3, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp), "=&a" (value) +			: "a" (mask), "a" (p) +			: "memory"); + +	return tmp & mask; +} +  #else -# error processor byte order undefined! -#endif + +#include <asm-generic/bitops/atomic.h> + +#endif /* XCHAL_HAVE_S32C1I */ + +#include <asm-generic/bitops/find.h> +#include <asm-generic/bitops/le.h> + +#include <asm-generic/bitops/ext2-atomic-setbit.h>  #include <asm-generic/bitops/hweight.h>  #include <asm-generic/bitops/lock.h>  #include <asm-generic/bitops/sched.h> -#include <asm-generic/bitops/minix.h>  #endif	/* __KERNEL__ */ diff --git a/arch/xtensa/include/asm/bitsperlong.h b/arch/xtensa/include/asm/bitsperlong.h deleted file mode 100644 index 6dc0bb0c13b..00000000000 --- a/arch/xtensa/include/asm/bitsperlong.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/bitsperlong.h> diff --git a/arch/xtensa/include/asm/bootparam.h b/arch/xtensa/include/asm/bootparam.h index 9983f2c1b7e..892aab399ac 100644 --- a/arch/xtensa/include/asm/bootparam.h +++ b/arch/xtensa/include/asm/bootparam.h @@ -20,8 +20,9 @@  #define BP_TAG_COMMAND_LINE	0x1001	/* command line (0-terminated string)*/  #define BP_TAG_INITRD		0x1002	/* ramdisk addr and size (bp_meminfo) */  #define BP_TAG_MEMORY		0x1003	/* memory addr and size (bp_meminfo) */ -#define BP_TAG_SERIAL_BAUSRATE	0x1004	/* baud rate of current console. */ +#define BP_TAG_SERIAL_BAUDRATE	0x1004	/* baud rate of current console. */  #define BP_TAG_SERIAL_PORT	0x1005	/* serial device of current console */ +#define BP_TAG_FDT		0x1006	/* flat device tree addr */  #define BP_TAG_FIRST		0x7B0B  /* first tag with a version number */  #define BP_TAG_LAST 		0x7E0B	/* last tag */ @@ -31,31 +32,19 @@  /* All records are aligned to 4 bytes */  typedef struct bp_tag { -  unsigned short id;		/* tag id */ -  unsigned short size;		/* size of this record excluding the structure*/ -  unsigned long data[0];	/* data */ +	unsigned short id;	/* tag id */ +	unsigned short size;	/* size of this record excluding the structure*/ +	unsigned long data[0];	/* data */  } bp_tag_t; -typedef struct meminfo { -  unsigned long type; -  unsigned long start; -  unsigned long end; -} meminfo_t; - -#define SYSMEM_BANKS_MAX 5 +struct bp_meminfo { +	unsigned long type; +	unsigned long start; +	unsigned long end; +};  #define MEMORY_TYPE_CONVENTIONAL	0x1000  #define MEMORY_TYPE_NONE		0x2000 -typedef struct sysmem_info { -  int nr_banks; -  meminfo_t bank[SYSMEM_BANKS_MAX]; -} sysmem_info_t; - -extern sysmem_info_t sysmem; -  #endif  #endif - - - diff --git a/arch/xtensa/include/asm/bug.h b/arch/xtensa/include/asm/bug.h deleted file mode 100644 index 3e52d72712f..00000000000 --- a/arch/xtensa/include/asm/bug.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * include/asm-xtensa/bug.h - * - * Macros to cause a 'bug' message. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_BUG_H -#define _XTENSA_BUG_H - -#include <asm-generic/bug.h> - -#endif	/* _XTENSA_BUG_H */ diff --git a/arch/xtensa/include/asm/byteorder.h b/arch/xtensa/include/asm/byteorder.h deleted file mode 100644 index 54eb6315349..00000000000 --- a/arch/xtensa/include/asm/byteorder.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _XTENSA_BYTEORDER_H -#define _XTENSA_BYTEORDER_H - -#ifdef __XTENSA_EL__ -#include <linux/byteorder/little_endian.h> -#elif defined(__XTENSA_EB__) -#include <linux/byteorder/big_endian.h> -#else -# error processor byte order undefined! -#endif - -#endif /* _XTENSA_BYTEORDER_H */ diff --git a/arch/xtensa/include/asm/cacheasm.h b/arch/xtensa/include/asm/cacheasm.h index 2c20a58f94c..60e18773ecb 100644 --- a/arch/xtensa/include/asm/cacheasm.h +++ b/arch/xtensa/include/asm/cacheasm.h @@ -174,4 +174,3 @@  	__loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH  	.endm - diff --git a/arch/xtensa/include/asm/cacheflush.h b/arch/xtensa/include/asm/cacheflush.h index 376cd9d5f45..555a98a1845 100644 --- a/arch/xtensa/include/asm/cacheflush.h +++ b/arch/xtensa/include/asm/cacheflush.h @@ -1,18 +1,14 @@  /* - * include/asm-xtensa/cacheflush.h - *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * (C) 2001 - 2007 Tensilica Inc. + * (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_CACHEFLUSH_H  #define _XTENSA_CACHEFLUSH_H -#ifdef __KERNEL__ -  #include <linux/mm.h>  #include <asm/processor.h>  #include <asm/page.h> @@ -51,7 +47,6 @@ extern void __invalidate_icache_page(unsigned long);  extern void __invalidate_icache_range(unsigned long, unsigned long);  extern void __invalidate_dcache_range(unsigned long, unsigned long); -  #if XCHAL_DCACHE_IS_WRITEBACK  extern void __flush_invalidate_dcache_all(void);  extern void __flush_dcache_page(unsigned long); @@ -87,9 +82,22 @@ static inline void __invalidate_icache_page_alias(unsigned long virt,   * (see also Documentation/cachetlb.txt)   */ -#if (DCACHE_WAY_SIZE > PAGE_SIZE) +#if (DCACHE_WAY_SIZE > PAGE_SIZE) || defined(CONFIG_SMP) -#define flush_cache_all()						\ +#ifdef CONFIG_SMP +void flush_cache_all(void); +void flush_cache_range(struct vm_area_struct*, ulong, ulong); +void flush_icache_range(unsigned long start, unsigned long end); +void flush_cache_page(struct vm_area_struct*, +			     unsigned long, unsigned long); +#else +#define flush_cache_all local_flush_cache_all +#define flush_cache_range local_flush_cache_range +#define flush_icache_range local_flush_icache_range +#define flush_cache_page  local_flush_cache_page +#endif + +#define local_flush_cache_all()						\  	do {								\  		__flush_invalidate_dcache_all();			\  		__invalidate_icache_all();				\ @@ -103,8 +111,11 @@ static inline void __invalidate_icache_page_alias(unsigned long virt,  #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1  extern void flush_dcache_page(struct page*); -extern void flush_cache_range(struct vm_area_struct*, ulong, ulong); -extern void flush_cache_page(struct vm_area_struct*, unsigned long, unsigned long); + +void local_flush_cache_range(struct vm_area_struct *vma, +		unsigned long start, unsigned long end); +void local_flush_cache_page(struct vm_area_struct *vma, +		unsigned long address, unsigned long pfn);  #else @@ -118,13 +129,14 @@ extern void flush_cache_page(struct vm_area_struct*, unsigned long, unsigned lon  #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0  #define flush_dcache_page(page)				do { } while (0) -#define flush_cache_page(vma,addr,pfn)			do { } while (0) -#define flush_cache_range(vma,start,end)		do { } while (0) +#define flush_icache_range local_flush_icache_range +#define flush_cache_page(vma, addr, pfn)		do { } while (0) +#define flush_cache_range(vma, start, end)		do { } while (0)  #endif  /* Ensure consistency between data and instruction cache. */ -#define flush_icache_range(start,end) 					\ +#define local_flush_icache_range(start, end)				\  	do {								\  		__flush_dcache_range(start, (end) - (start));		\  		__invalidate_icache_range(start,(end) - (start));	\ @@ -165,7 +177,7 @@ extern void copy_from_user_page(struct vm_area_struct*, struct page*,  static inline u32 xtensa_get_cacheattr(void)  {  	u32 r; -	asm volatile("	rsr %0, CACHEATTR" : "=a"(r)); +	asm volatile("	rsr %0, cacheattr" : "=a"(r));  	return r;  } @@ -252,5 +264,4 @@ static inline void flush_invalidate_dcache_unaligned(u32 addr, u32 size)  	}  } -#endif /* __KERNEL__ */  #endif /* _XTENSA_CACHEFLUSH_H */ diff --git a/arch/xtensa/include/asm/checksum.h b/arch/xtensa/include/asm/checksum.h index e4d831a3077..0593de689b5 100644 --- a/arch/xtensa/include/asm/checksum.h +++ b/arch/xtensa/include/asm/checksum.h @@ -12,6 +12,7 @@  #define _XTENSA_CHECKSUM_H  #include <linux/in6.h> +#include <asm/uaccess.h>  #include <variant/core.h>  /* @@ -36,8 +37,9 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum);   * better 64-bit) boundary   */ -asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len, __wsum sum, -						   int *src_err_ptr, int *dst_err_ptr); +asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, +					    int len, __wsum sum, +					    int *src_err_ptr, int *dst_err_ptr);  /*   *	Note: when you get a NULL pointer exception here this means someone @@ -54,7 +56,7 @@ __wsum csum_partial_copy_nocheck(const void *src, void *dst,  static inline  __wsum csum_partial_copy_from_user(const void __user *src, void *dst, -						int len, __wsum sum, int *err_ptr) +				   int len, __wsum sum, int *err_ptr)  {  	return csum_partial_copy_generic((__force const void *)src, dst,  					len, sum, err_ptr, NULL); @@ -112,7 +114,8 @@ static __inline__ __sum16 ip_fast_csum(const void *iph, unsigned int ihl)  	/* Since the input registers which are loaded with iph and ihl  	   are modified, we must also specify them as outputs, or gcc  	   will assume they contain their original values. */ -		: "=r" (sum), "=r" (iph), "=r" (ihl), "=&r" (tmp), "=&r" (endaddr) +		: "=r" (sum), "=r" (iph), "=r" (ihl), "=&r" (tmp), +		  "=&r" (endaddr)  		: "1" (iph), "2" (ihl)  		: "memory"); @@ -168,7 +171,7 @@ static __inline__ __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,  static __inline__ __sum16 ip_compute_csum(const void *buff, int len)  { -    return csum_fold (csum_partial(buff, len, 0)); +	return csum_fold (csum_partial(buff, len, 0));  }  #define _HAVE_ARCH_IPV6_CSUM @@ -238,11 +241,12 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,   *	Copy and checksum to user   */  #define HAVE_CSUM_COPY_USER -static __inline__ __wsum csum_and_copy_to_user(const void *src, void __user *dst, -				    int len, __wsum sum, int *err_ptr) +static __inline__ __wsum csum_and_copy_to_user(const void *src, +					       void __user *dst, int len, +					       __wsum sum, int *err_ptr)  {  	if (access_ok(VERIFY_WRITE, dst, len)) -		return csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr); +		return csum_partial_copy_generic(src,dst,len,sum,NULL,err_ptr);  	if (len)  		*err_ptr = -EFAULT; diff --git a/arch/xtensa/include/asm/system.h b/arch/xtensa/include/asm/cmpxchg.h index 1e7e09ab6cd..370b26f3841 100644 --- a/arch/xtensa/include/asm/system.h +++ b/arch/xtensa/include/asm/cmpxchg.h @@ -1,5 +1,5 @@  /* - * include/asm-xtensa/system.h + * Atomic xchg and cmpxchg operations.   *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive @@ -8,44 +8,12 @@   * Copyright (C) 2001 - 2005 Tensilica Inc.   */ -#ifndef _XTENSA_SYSTEM_H -#define _XTENSA_SYSTEM_H +#ifndef _XTENSA_CMPXCHG_H +#define _XTENSA_CMPXCHG_H -#include <linux/stringify.h> -#include <linux/irqflags.h> - -#include <asm/processor.h> - -#define smp_read_barrier_depends() do { } while(0) -#define read_barrier_depends() do { } while(0) - -#define mb()  barrier() -#define rmb() mb() -#define wmb() mb() - -#ifdef CONFIG_SMP -#error smp_* not defined -#else -#define smp_mb()	barrier() -#define smp_rmb()	barrier() -#define smp_wmb()	barrier() -#endif - -#define set_mb(var, value)	do { var = value; mb(); } while (0) - -#if !defined (__ASSEMBLY__) - -/* * switch_to(n) should switch tasks to task nr n, first - * checking that n isn't the current task, in which case it does nothing. - */ -extern void *_switch_to(void *last, void *next); +#ifndef __ASSEMBLY__ -#endif	/* __ASSEMBLY__ */ - -#define switch_to(prev,next,last)		\ -do {						\ -	(last) = _switch_to(prev, next);	\ -} while(0) +#include <linux/stringify.h>  /*   * cmpxchg @@ -54,17 +22,30 @@ do {						\  static inline unsigned long  __cmpxchg_u32(volatile int *p, int old, int new)  { -  __asm__ __volatile__("rsil    a15, "__stringify(LOCKLEVEL)"\n\t" -		       "l32i    %0, %1, 0              \n\t" -		       "bne	%0, %2, 1f             \n\t" -		       "s32i    %3, %1, 0              \n\t" -		       "1:                             \n\t" -		       "wsr     a15, "__stringify(PS)" \n\t" -		       "rsync                          \n\t" -		       : "=&a" (old) -		       : "a" (p), "a" (old), "r" (new) -		       : "a15", "memory"); -  return old; +#if XCHAL_HAVE_S32C1I +	__asm__ __volatile__( +			"       wsr     %2, scompare1\n" +			"       s32c1i  %0, %1, 0\n" +			: "+a" (new) +			: "a" (p), "a" (old) +			: "memory" +			); + +	return new; +#else +	__asm__ __volatile__( +			"       rsil    a15, "__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %1, 0\n" +			"       bne     %0, %2, 1f\n" +			"       s32i    %3, %1, 0\n" +			"1:\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (old) +			: "a" (p), "a" (old), "r" (new) +			: "a15", "memory"); +	return old; +#endif  }  /* This function doesn't exist, so you'll get a linker error   * if something tries to do an invalid cmpxchg(). */ @@ -112,6 +93,7 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,  	((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\  			(unsigned long)(n), sizeof(*(ptr))))  #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) +#define cmpxchg64(ptr, o, n)    cmpxchg64_local((ptr), (o), (n))  /*   * xchg_u32 @@ -125,19 +107,36 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,  static inline unsigned long xchg_u32(volatile int * m, unsigned long val)  { -  unsigned long tmp; -  __asm__ __volatile__("rsil    a15, "__stringify(LOCKLEVEL)"\n\t" -		       "l32i    %0, %1, 0              \n\t" -		       "s32i    %2, %1, 0              \n\t" -		       "wsr     a15, "__stringify(PS)" \n\t" -		       "rsync                          \n\t" -		       : "=&a" (tmp) -		       : "a" (m), "a" (val) -		       : "a15", "memory"); -  return tmp; +#if XCHAL_HAVE_S32C1I +	unsigned long tmp, result; +	__asm__ __volatile__( +			"1:     l32i    %1, %2, 0\n" +			"       mov     %0, %3\n" +			"       wsr     %1, scompare1\n" +			"       s32c1i  %0, %2, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (m), "a" (val) +			: "memory" +			); +	return result; +#else +	unsigned long tmp; +	__asm__ __volatile__( +			"       rsil    a15, "__stringify(LOCKLEVEL)"\n" +			"       l32i    %0, %1, 0\n" +			"       s32i    %2, %1, 0\n" +			"       wsr     a15, ps\n" +			"       rsync\n" +			: "=&a" (tmp) +			: "a" (m), "a" (val) +			: "a15", "memory"); +	return tmp; +#endif  } -#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) +#define xchg(ptr,x) \ +	((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))  /*   * This only works if the compiler isn't horribly bad at optimizing. @@ -158,27 +157,6 @@ __xchg(unsigned long x, volatile void * ptr, int size)  	return x;  } -extern void set_except_vector(int n, void *addr); - -static inline void spill_registers(void) -{ -	unsigned int a0, ps; - -	__asm__ __volatile__ ( -		"movi	a14," __stringify (PS_EXCM_BIT) " | 1\n\t" -		"mov	a12, a0\n\t" -		"rsr	a13," __stringify(SAR) "\n\t" -		"xsr	a14," __stringify(PS) "\n\t" -		"movi	a0, _spill_registers\n\t" -		"rsync\n\t" -		"callx0 a0\n\t" -		"mov	a0, a12\n\t" -		"wsr	a13," __stringify(SAR) "\n\t" -		"wsr	a14," __stringify(PS) "\n\t" -		:: "a" (&a0), "a" (&ps) -		: "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15", "memory"); -} - -#define arch_align_stack(x) (x) +#endif /* __ASSEMBLY__ */ -#endif	/* _XTENSA_SYSTEM_H */ +#endif /* _XTENSA_CMPXCHG_H */ diff --git a/arch/xtensa/include/asm/coprocessor.h b/arch/xtensa/include/asm/coprocessor.h index 75c94a1658b..677501b32df 100644 --- a/arch/xtensa/include/asm/coprocessor.h +++ b/arch/xtensa/include/asm/coprocessor.h @@ -94,11 +94,10 @@  #if XCHAL_HAVE_CP  #define RSR_CPENABLE(x)	do {						  \ -	__asm__ __volatile__("rsr %0," __stringify(CPENABLE) : "=a" (x)); \ +	__asm__ __volatile__("rsr %0, cpenable" : "=a" (x));		  \  	} while(0);  #define WSR_CPENABLE(x)	do {						  \ -  	__asm__ __volatile__("wsr %0," __stringify(CPENABLE) "; rsync" 	  \ -	    		     :: "a" (x));				  \ +	__asm__ __volatile__("wsr %0, cpenable; rsync" :: "a" (x));	  \  	} while(0);  #endif /* XCHAL_HAVE_CP */ diff --git a/arch/xtensa/include/asm/cpumask.h b/arch/xtensa/include/asm/cpumask.h deleted file mode 100644 index ebeede397db..00000000000 --- a/arch/xtensa/include/asm/cpumask.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/cpumask.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_CPUMASK_H -#define _XTENSA_CPUMASK_H - -#include <asm-generic/cpumask.h> - -#endif /* _XTENSA_CPUMASK_H */ diff --git a/arch/xtensa/include/asm/cputime.h b/arch/xtensa/include/asm/cputime.h deleted file mode 100644 index a7fb864a50a..00000000000 --- a/arch/xtensa/include/asm/cputime.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _XTENSA_CPUTIME_H -#define _XTENSA_CPUTIME_H - -#include <asm-generic/cputime.h> - -#endif /* _XTENSA_CPUTIME_H */ diff --git a/arch/xtensa/include/asm/current.h b/arch/xtensa/include/asm/current.h index 8d1eb5d7864..47e46dcf5d4 100644 --- a/arch/xtensa/include/asm/current.h +++ b/arch/xtensa/include/asm/current.h @@ -30,7 +30,7 @@ static inline struct task_struct *get_current(void)  #define GET_CURRENT(reg,sp)		\  	GET_THREAD_INFO(reg,sp);	\ -  	l32i reg, reg, TI_TASK		\ +	l32i reg, reg, TI_TASK		\  #endif diff --git a/arch/xtensa/include/asm/delay.h b/arch/xtensa/include/asm/delay.h index e1d8c9e010c..24304b39a5c 100644 --- a/arch/xtensa/include/asm/delay.h +++ b/arch/xtensa/include/asm/delay.h @@ -12,38 +12,64 @@  #ifndef _XTENSA_DELAY_H  #define _XTENSA_DELAY_H -#include <asm/processor.h> +#include <asm/timex.h>  #include <asm/param.h>  extern unsigned long loops_per_jiffy;  static inline void __delay(unsigned long loops)  { -  /* 2 cycles per loop. */ -  __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b" -			: "=r" (loops) : "0" (loops)); +	if (__builtin_constant_p(loops) && loops < 2) +		__asm__ __volatile__ ("nop"); +	else if (loops >= 2) +		/* 2 cycles per loop. */ +		__asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b" +				: "+r" (loops));  } -static __inline__ u32 xtensa_get_ccount(void) +/* Undefined function to get compile-time error */ +void __bad_udelay(void); +void __bad_ndelay(void); + +#define __MAX_UDELAY 30000 +#define __MAX_NDELAY 30000 + +static inline void __udelay(unsigned long usecs)  { -	u32 ccount; -	asm volatile ("rsr %0, 234; # CCOUNT\n" : "=r" (ccount)); -	return ccount; +	unsigned long start = get_ccount(); +	unsigned long cycles = (usecs * (ccount_freq >> 15)) >> 5; + +	/* Note: all variables are unsigned (can wrap around)! */ +	while (((unsigned long)get_ccount()) - start < cycles) +		cpu_relax();  } -/* For SMP/NUMA systems, change boot_cpu_data to something like - * local_cpu_data->... where local_cpu_data points to the current - * cpu. */ +static inline void udelay(unsigned long usec) +{ +	if (__builtin_constant_p(usec) && usec >= __MAX_UDELAY) +		__bad_udelay(); +	else +		__udelay(usec); +} -static __inline__ void udelay (unsigned long usecs) +static inline void __ndelay(unsigned long nsec)  { -	unsigned long start = xtensa_get_ccount(); -	unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ)); +	/* +	 * Inner shift makes sure multiplication doesn't overflow +	 * for legitimate nsec values +	 */ +	unsigned long cycles = (nsec * (ccount_freq >> 15)) >> 15; +	__delay(cycles); +} -	/* Note: all variables are unsigned (can wrap around)! */ -	while (((unsigned long)xtensa_get_ccount()) - start < cycles) -		; +#define ndelay(n) ndelay(n) + +static inline void ndelay(unsigned long nsec) +{ +	if (__builtin_constant_p(nsec) && nsec >= __MAX_NDELAY) +		__bad_ndelay(); +	else +		__ndelay(nsec);  }  #endif - diff --git a/arch/xtensa/include/asm/device.h b/arch/xtensa/include/asm/device.h deleted file mode 100644 index d8f9872b0e2..00000000000 --- a/arch/xtensa/include/asm/device.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Arch specific extensions to struct device - * - * This file is released under the GPLv2 - */ -#include <asm-generic/device.h> - diff --git a/arch/xtensa/include/asm/div64.h b/arch/xtensa/include/asm/div64.h deleted file mode 100644 index f35678cb0a9..00000000000 --- a/arch/xtensa/include/asm/div64.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/div64.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2007 Tensilica Inc. - */ - -#ifndef _XTENSA_DIV64_H -#define _XTENSA_DIV64_H - -#include <asm-generic/div64.h> - -#endif /* _XTENSA_DIV64_H */ diff --git a/arch/xtensa/include/asm/dma-mapping.h b/arch/xtensa/include/asm/dma-mapping.h index 492c95790ad..172a02a6ad1 100644 --- a/arch/xtensa/include/asm/dma-mapping.h +++ b/arch/xtensa/include/asm/dma-mapping.h @@ -16,6 +16,8 @@  #include <linux/mm.h>  #include <linux/scatterlist.h> +#define DMA_ERROR_CODE		(~(dma_addr_t)0x0) +  /*   * DMA-consistent mapping functions.   */ @@ -98,8 +100,8 @@ dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,  }  static inline void -dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, -		enum dma_data_direction direction) +dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, +		           size_t size, enum dma_data_direction direction)  {  	consistent_sync((void *)bus_to_virt(dma_handle), size, direction);  } @@ -168,4 +170,19 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size,  	consistent_sync(vaddr, size, direction);  } +/* Not supported for now */ +static inline int dma_mmap_coherent(struct device *dev, +				    struct vm_area_struct *vma, void *cpu_addr, +				    dma_addr_t dma_addr, size_t size) +{ +	return -EINVAL; +} + +static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, +				  void *cpu_addr, dma_addr_t dma_addr, +				  size_t size) +{ +	return -EINVAL; +} +  #endif	/* _XTENSA_DMA_MAPPING_H */ diff --git a/arch/xtensa/include/asm/dma.h b/arch/xtensa/include/asm/dma.h index 137ca3945b0..bb099a373b5 100644 --- a/arch/xtensa/include/asm/dma.h +++ b/arch/xtensa/include/asm/dma.h @@ -37,7 +37,7 @@   *	the size of the statically mapped kernel segment   *	(XCHAL_KSEG_{CACHED,BYPASS}_SIZE), ie. 128 MB.   * - * NOTE: When the entire KSEG area is DMA capable, we substract + * NOTE: When the entire KSEG area is DMA capable, we subtract   *	one from the max address so that the virt_to_phys() macro   *	works correctly on the address (otherwise the address   *	enters another area, and virt_to_phys() may not return diff --git a/arch/xtensa/include/asm/elf.h b/arch/xtensa/include/asm/elf.h index 6e65eadaae1..eacb25a4171 100644 --- a/arch/xtensa/include/asm/elf.h +++ b/arch/xtensa/include/asm/elf.h @@ -84,7 +84,8 @@ typedef struct {  	elf_greg_t sar;  	elf_greg_t windowstart;  	elf_greg_t windowbase; -	elf_greg_t reserved[8+48]; +	elf_greg_t threadptr; +	elf_greg_t reserved[7+48];  	elf_greg_t a[64];  } xtensa_gregset_t; @@ -168,11 +169,11 @@ extern void xtensa_elf_core_copy_regs (xtensa_gregset_t *, struct pt_regs *);   */  #define ELF_PLAT_INIT(_r, load_addr) \ -  do { _r->areg[0]=0; /*_r->areg[1]=0;*/ _r->areg[2]=0;  _r->areg[3]=0;  \ -       _r->areg[4]=0;  _r->areg[5]=0;    _r->areg[6]=0;  _r->areg[7]=0;  \ -       _r->areg[8]=0;  _r->areg[9]=0;    _r->areg[10]=0; _r->areg[11]=0; \ -       _r->areg[12]=0; _r->areg[13]=0;   _r->areg[14]=0; _r->areg[15]=0; \ -  } while (0) +	do { _r->areg[0]=0; /*_r->areg[1]=0;*/ _r->areg[2]=0;  _r->areg[3]=0;  \ +	     _r->areg[4]=0;  _r->areg[5]=0;    _r->areg[6]=0;  _r->areg[7]=0;  \ +	     _r->areg[8]=0;  _r->areg[9]=0;    _r->areg[10]=0; _r->areg[11]=0; \ +	     _r->areg[12]=0; _r->areg[13]=0;   _r->areg[14]=0; _r->areg[15]=0; \ +	} while (0)  typedef struct {  	xtregs_opt_t	opt; @@ -189,7 +190,8 @@ typedef struct {  #endif  } elf_xtregs_t; -#define SET_PERSONALITY(ex) set_personality(PER_LINUX_32BIT) +#define SET_PERSONALITY(ex) \ +	set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))  struct task_struct; diff --git a/arch/xtensa/include/asm/emergency-restart.h b/arch/xtensa/include/asm/emergency-restart.h deleted file mode 100644 index 108d8c48e42..00000000000 --- a/arch/xtensa/include/asm/emergency-restart.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _ASM_EMERGENCY_RESTART_H -#define _ASM_EMERGENCY_RESTART_H - -#include <asm-generic/emergency-restart.h> - -#endif /* _ASM_EMERGENCY_RESTART_H */ diff --git a/arch/xtensa/include/asm/errno.h b/arch/xtensa/include/asm/errno.h deleted file mode 100644 index a0f3b96b79b..00000000000 --- a/arch/xtensa/include/asm/errno.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/errno.h - * - * This file is subject to the terms and conditions of the GNU General - * Public License.  See the file "COPYING" in the main directory of - * this archive for more details. - * - * Copyright (C) 2002 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_ERRNO_H -#define _XTENSA_ERRNO_H - -#include <asm-generic/errno.h> - -#endif	/* _XTENSA_ERRNO_H */ diff --git a/arch/xtensa/include/asm/fcntl.h b/arch/xtensa/include/asm/fcntl.h deleted file mode 100644 index 46ab12db573..00000000000 --- a/arch/xtensa/include/asm/fcntl.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/fcntl.h> diff --git a/arch/xtensa/include/asm/fixmap.h b/arch/xtensa/include/asm/fixmap.h new file mode 100644 index 00000000000..9f6c33d0428 --- /dev/null +++ b/arch/xtensa/include/asm/fixmap.h @@ -0,0 +1,58 @@ +/* + * fixmap.h: compile-time virtual memory allocation + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 Ingo Molnar + * + * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#include <asm/pgtable.h> +#ifdef CONFIG_HIGHMEM +#include <linux/threads.h> +#include <asm/kmap_types.h> +#endif + +/* + * Here we define all the compile-time 'special' virtual + * addresses. The point is to have a constant address at + * compile time, but to set the physical address only + * in the boot process. We allocate these special  addresses + * from the end of the consistent memory region backwards. + * Also this lets us do fail-safe vmalloc(), we + * can guarantee that these special addresses and + * vmalloc()-ed addresses never overlap. + * + * these 'compile-time allocated' memory buffers are + * fixed-size 4k pages. (or larger if used with an increment + * higher than 1) use fixmap_set(idx,phys) to associate + * physical memory with fixmap indices. + */ +enum fixed_addresses { +#ifdef CONFIG_HIGHMEM +	/* reserved pte's for temporary kernel mappings */ +	FIX_KMAP_BEGIN, +	FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1, +#endif +	__end_of_fixed_addresses +}; + +#define FIXADDR_TOP     (VMALLOC_START - PAGE_SIZE) +#define FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START	((FIXADDR_TOP - FIXADDR_SIZE) & PMD_MASK) + +#include <asm-generic/fixmap.h> + +#define kmap_get_fixmap_pte(vaddr) \ +	pte_offset_kernel( \ +		pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), \ +		(vaddr) \ +	) + +#endif diff --git a/arch/xtensa/include/asm/ftrace.h b/arch/xtensa/include/asm/ftrace.h index 40a8c178f10..6c6d9a9f185 100644 --- a/arch/xtensa/include/asm/ftrace.h +++ b/arch/xtensa/include/asm/ftrace.h @@ -1 +1,40 @@ -/* empty */ +/* + * arch/xtensa/include/asm/ftrace.h + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2013 Tensilica Inc. + */ +#ifndef _XTENSA_FTRACE_H +#define _XTENSA_FTRACE_H + +#include <asm/processor.h> + +#ifndef __ASSEMBLY__ +#define ftrace_return_address0 ({ unsigned long a0, a1; \ +		__asm__ __volatile__ ( \ +			"mov %0, a0\n" \ +			"mov %1, a1\n" \ +			: "=r"(a0), "=r"(a1)); \ +		MAKE_PC_FROM_RA(a0, a1); }) + +#ifdef CONFIG_FRAME_POINTER +extern unsigned long return_address(unsigned level); +#define ftrace_return_address(n) return_address(n) +#endif +#endif /* __ASSEMBLY__ */ + +#ifdef CONFIG_FUNCTION_TRACER + +#define MCOUNT_ADDR ((unsigned long)(_mcount)) +#define MCOUNT_INSN_SIZE 3 + +#ifndef __ASSEMBLY__ +extern void _mcount(void); +#define mcount _mcount +#endif /* __ASSEMBLY__ */ +#endif /* CONFIG_FUNCTION_TRACER */ + +#endif /* _XTENSA_FTRACE_H */ diff --git a/arch/xtensa/include/asm/futex.h b/arch/xtensa/include/asm/futex.h index 0b745828f42..b39531babec 100644 --- a/arch/xtensa/include/asm/futex.h +++ b/arch/xtensa/include/asm/futex.h @@ -1 +1,147 @@ -#include <asm-generic/futex.h> +/* + * Atomic futex routines + * + * Based on the PowerPC implementataion + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Copyright (C) 2013 TangoTec Ltd. + * + * Baruch Siach <baruch@tkos.co.il> + */ + +#ifndef _ASM_XTENSA_FUTEX_H +#define _ASM_XTENSA_FUTEX_H + +#ifdef __KERNEL__ + +#include <linux/futex.h> +#include <linux/uaccess.h> +#include <linux/errno.h> + +#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ +	__asm__ __volatile(				\ +	"1:	l32i	%0, %2, 0\n"			\ +		insn "\n"				\ +	"	wsr	%0, scompare1\n"		\ +	"2:	s32c1i	%1, %2, 0\n"			\ +	"	bne	%1, %0, 1b\n"			\ +	"	movi	%1, 0\n"			\ +	"3:\n"						\ +	"	.section .fixup,\"ax\"\n"		\ +	"	.align 4\n"				\ +	"4:	.long	3b\n"				\ +	"5:	l32r	%0, 4b\n"			\ +	"	movi	%1, %3\n"			\ +	"	jx	%0\n"				\ +	"	.previous\n"				\ +	"	.section __ex_table,\"a\"\n"		\ +	"	.long 1b,5b,2b,5b\n"			\ +	"	.previous\n"				\ +	: "=&r" (oldval), "=&r" (ret)			\ +	: "r" (uaddr), "I" (-EFAULT), "r" (oparg)	\ +	: "memory") + +static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) +{ +	int op = (encoded_op >> 28) & 7; +	int cmp = (encoded_op >> 24) & 15; +	int oparg = (encoded_op << 8) >> 20; +	int cmparg = (encoded_op << 20) >> 20; +	int oldval = 0, ret; +	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) +		oparg = 1 << oparg; + +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) +		return -EFAULT; + +#if !XCHAL_HAVE_S32C1I +	return -ENOSYS; +#endif + +	pagefault_disable(); + +	switch (op) { +	case FUTEX_OP_SET: +		__futex_atomic_op("mov %1, %4", ret, oldval, uaddr, oparg); +		break; +	case FUTEX_OP_ADD: +		__futex_atomic_op("add %1, %0, %4", ret, oldval, uaddr, +				oparg); +		break; +	case FUTEX_OP_OR: +		__futex_atomic_op("or %1, %0, %4", ret, oldval, uaddr, +				oparg); +		break; +	case FUTEX_OP_ANDN: +		__futex_atomic_op("and %1, %0, %4", ret, oldval, uaddr, +				~oparg); +		break; +	case FUTEX_OP_XOR: +		__futex_atomic_op("xor %1, %0, %4", ret, oldval, uaddr, +				oparg); +		break; +	default: +		ret = -ENOSYS; +	} + +	pagefault_enable(); + +	if (ret) +		return ret; + +	switch (cmp) { +	case FUTEX_OP_CMP_EQ: return (oldval == cmparg); +	case FUTEX_OP_CMP_NE: return (oldval != cmparg); +	case FUTEX_OP_CMP_LT: return (oldval < cmparg); +	case FUTEX_OP_CMP_GE: return (oldval >= cmparg); +	case FUTEX_OP_CMP_LE: return (oldval <= cmparg); +	case FUTEX_OP_CMP_GT: return (oldval > cmparg); +	} + +	return -ENOSYS; +} + +static inline int +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval) +{ +	int ret = 0; +	u32 prev; + +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) +		return -EFAULT; + +#if !XCHAL_HAVE_S32C1I +	return -ENOSYS; +#endif + +	__asm__ __volatile__ ( +	"	# futex_atomic_cmpxchg_inatomic\n" +	"1:	l32i	%1, %3, 0\n" +	"	mov	%0, %5\n" +	"	wsr	%1, scompare1\n" +	"2:	s32c1i	%0, %3, 0\n" +	"3:\n" +	"	.section .fixup,\"ax\"\n" +	"	.align 4\n" +	"4:	.long	3b\n" +	"5:	l32r	%1, 4b\n" +	"	movi	%0, %6\n" +	"	jx	%1\n" +	"	.previous\n" +	"	.section __ex_table,\"a\"\n" +	"	.long 1b,5b,2b,5b\n" +	"	.previous\n" +	: "+r" (ret), "=&r" (prev), "+m" (*uaddr) +	: "r" (uaddr), "r" (oldval), "r" (newval), "I" (-EFAULT) +	: "memory"); + +	*uval = prev; +	return ret; +} + +#endif /* __KERNEL__ */ +#endif /* _ASM_XTENSA_FUTEX_H */ diff --git a/arch/xtensa/include/asm/gpio.h b/arch/xtensa/include/asm/gpio.h index a8c9fc46c79..b3799d88ffc 100644 --- a/arch/xtensa/include/asm/gpio.h +++ b/arch/xtensa/include/asm/gpio.h @@ -1,56 +1,4 @@ -/* - * Generic GPIO API implementation for xtensa. - * - * Stolen from x86, which is derived from the generic GPIO API for powerpc: - * - * Copyright (c) 2007-2008  MontaVista Software, Inc. - * - * Author: Anton Vorontsov <avorontsov@ru.mvista.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ - -#ifndef _ASM_XTENSA_GPIO_H -#define _ASM_XTENSA_GPIO_H - -#include <asm-generic/gpio.h> - -#ifdef CONFIG_GPIOLIB - -/* - * Just call gpiolib. - */ -static inline int gpio_get_value(unsigned int gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned int gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned int gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned int gpio) -{ -	return __gpio_to_irq(gpio); -} - -/* - * Not implemented, yet. - */ -static inline int irq_to_gpio(unsigned int irq) -{ -	return -EINVAL; -} - -#endif /* CONFIG_GPIOLIB */ - -#endif /* _ASM_XTENSA_GPIO_H */ +#ifndef __LINUX_GPIO_H +#warning Include linux/gpio.h instead of asm/gpio.h +#include <linux/gpio.h> +#endif diff --git a/arch/xtensa/include/asm/hardirq.h b/arch/xtensa/include/asm/hardirq.h deleted file mode 100644 index 26664cef8f1..00000000000 --- a/arch/xtensa/include/asm/hardirq.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * include/asm-xtensa/hardirq.h - * - * This file is subject to the terms and conditions of the GNU General - * Public License.  See the file "COPYING" in the main directory of - * this archive for more details. - * - * Copyright (C) 2002 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_HARDIRQ_H -#define _XTENSA_HARDIRQ_H - -void ack_bad_irq(unsigned int irq); -#define ack_bad_irq ack_bad_irq - -#include <asm-generic/hardirq.h> - -#endif	/* _XTENSA_HARDIRQ_H */ diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h index 0a046ca5a68..2653ef5d55f 100644 --- a/arch/xtensa/include/asm/highmem.h +++ b/arch/xtensa/include/asm/highmem.h @@ -6,12 +6,54 @@   * this archive for more details.   *   * Copyright (C) 2003 - 2005 Tensilica Inc. + * Copyright (C) 2014 Cadence Design Systems Inc.   */  #ifndef _XTENSA_HIGHMEM_H  #define _XTENSA_HIGHMEM_H -extern void flush_cache_kmaps(void); +#include <asm/cacheflush.h> +#include <asm/fixmap.h> +#include <asm/kmap_types.h> +#include <asm/pgtable.h> -#endif +#define PKMAP_BASE		(FIXADDR_START - PMD_SIZE) +#define LAST_PKMAP		PTRS_PER_PTE +#define LAST_PKMAP_MASK		(LAST_PKMAP - 1) +#define PKMAP_NR(virt)		(((virt) - PKMAP_BASE) >> PAGE_SHIFT) +#define PKMAP_ADDR(nr)		(PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +#define kmap_prot		PAGE_KERNEL + +extern pte_t *pkmap_page_table; + +void *kmap_high(struct page *page); +void kunmap_high(struct page *page); + +static inline void *kmap(struct page *page) +{ +	BUG_ON(in_interrupt()); +	if (!PageHighMem(page)) +		return page_address(page); +	return kmap_high(page); +} +static inline void kunmap(struct page *page) +{ +	BUG_ON(in_interrupt()); +	if (!PageHighMem(page)) +		return; +	kunmap_high(page); +} + +static inline void flush_cache_kmaps(void) +{ +	flush_cache_all(); +} + +void *kmap_atomic(struct page *page); +void __kunmap_atomic(void *kvaddr); + +void kmap_init(void); + +#endif diff --git a/arch/xtensa/include/asm/initialize_mmu.h b/arch/xtensa/include/asm/initialize_mmu.h new file mode 100644 index 00000000000..600781edc8a --- /dev/null +++ b/arch/xtensa/include/asm/initialize_mmu.h @@ -0,0 +1,163 @@ +/* + * arch/xtensa/include/asm/initialize_mmu.h + * + * Initializes MMU: + * + *      For the new V3 MMU we remap the TLB from virtual == physical + *      to the standard Linux mapping used in earlier MMU's. + * + *      The the MMU we also support a new configuration register that + *      specifies how the S32C1I instruction operates with the cache + *      controller. + * + * This file is subject to the terms and conditions of the GNU General + * Public License.  See the file "COPYING" in the main directory of + * this archive for more details. + * + * Copyright (C) 2008 - 2012 Tensilica, Inc. + * + *   Marc Gauthier <marc@tensilica.com> + *   Pete Delaney <piet@tensilica.com> + */ + +#ifndef _XTENSA_INITIALIZE_MMU_H +#define _XTENSA_INITIALIZE_MMU_H + +#include <asm/pgtable.h> +#include <asm/vectors.h> + +#define CA_BYPASS	(_PAGE_CA_BYPASS | _PAGE_HW_WRITE | _PAGE_HW_EXEC) +#define CA_WRITEBACK	(_PAGE_CA_WB     | _PAGE_HW_WRITE | _PAGE_HW_EXEC) + +#ifdef __ASSEMBLY__ + +#define XTENSA_HWVERSION_RC_2009_0 230000 + +	.macro	initialize_mmu + +#if XCHAL_HAVE_S32C1I && (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0) +/* + * We Have Atomic Operation Control (ATOMCTL) Register; Initialize it. + * For details see Documentation/xtensa/atomctl.txt + */ +#if XCHAL_DCACHE_IS_COHERENT +	movi	a3, 0x25	/* For SMP/MX -- internal for writeback, +				 * RCW otherwise +				 */ +#else +	movi	a3, 0x29	/* non-MX -- Most cores use Std Memory +				 * Controlers which usually can't use RCW +				 */ +#endif +	wsr	a3, atomctl +#endif  /* XCHAL_HAVE_S32C1I && +	 * (XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RC_2009_0) +	 */ + +#if defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY +/* + * Have MMU v3 + */ + +#if !XCHAL_HAVE_VECBASE +# error "MMU v3 requires reloc vectors" +#endif + +	movi	a1, 0 +	_call0	1f +	_j	2f + +	.align	4 +1:	movi	a2, 0x10000000 +	movi	a3, 0x18000000 +	add	a2, a2, a0 +9:	bgeu	a2, a3, 9b	/* PC is out of the expected range */ + +	/* Step 1: invalidate mapping at 0x40000000..0x5FFFFFFF. */ + +	movi	a2, 0x40000006 +	idtlb	a2 +	iitlb	a2 +	isync + +	/* Step 2: map 0x40000000..0x47FFFFFF to paddr containing this code +	 * and jump to the new mapping. +	 */ + +	srli	a3, a0, 27 +	slli	a3, a3, 27 +	addi	a3, a3, CA_BYPASS +	addi	a7, a2, -1 +	wdtlb	a3, a7 +	witlb	a3, a7 +	isync + +	slli	a4, a0, 5 +	srli	a4, a4, 5 +	addi	a5, a2, -6 +	add	a4, a4, a5 +	jx	a4 + +	/* Step 3: unmap everything other than current area. +	 *	   Start at 0x60000000, wrap around, and end with 0x20000000 +	 */ +2:	movi	a4, 0x20000000 +	add	a5, a2, a4 +3:	idtlb	a5 +	iitlb	a5 +	add	a5, a5, a4 +	bne	a5, a2, 3b + +	/* Step 4: Setup MMU with the old V2 mappings. */ +	movi	a6, 0x01000000 +	wsr	a6, ITLBCFG +	wsr	a6, DTLBCFG +	isync + +	movi	a5, 0xd0000005 +	movi	a4, CA_WRITEBACK +	wdtlb	a4, a5 +	witlb	a4, a5 + +	movi	a5, 0xd8000005 +	movi	a4, CA_BYPASS +	wdtlb	a4, a5 +	witlb	a4, a5 + +	movi	a5, XCHAL_KIO_CACHED_VADDR + 6 +	movi	a4, XCHAL_KIO_DEFAULT_PADDR + CA_WRITEBACK +	wdtlb	a4, a5 +	witlb	a4, a5 + +	movi	a5, XCHAL_KIO_BYPASS_VADDR + 6 +	movi	a4, XCHAL_KIO_DEFAULT_PADDR + CA_BYPASS +	wdtlb	a4, a5 +	witlb	a4, a5 + +	isync + +	/* Jump to self, using MMU v2 mappings. */ +	movi	a4, 1f +	jx	a4 + +1: +	movi    a2, VECBASE_RESET_VADDR +	wsr	a2, vecbase + +	/* Step 5: remove temporary mapping. */ +	idtlb	a7 +	iitlb	a7 +	isync + +	movi	a0, 0 +	wsr	a0, ptevaddr +	rsync + +#endif /* defined(CONFIG_MMU) && XCHAL_HAVE_PTP_MMU && +	  XCHAL_HAVE_SPANNING_WAY */ + +	.endm + +#endif /*__ASSEMBLY__*/ + +#endif /* _XTENSA_INITIALIZE_MMU_H */ diff --git a/arch/xtensa/include/asm/io.h b/arch/xtensa/include/asm/io.h index d04cd3a625f..74944207167 100644 --- a/arch/xtensa/include/asm/io.h +++ b/arch/xtensa/include/asm/io.h @@ -14,194 +14,75 @@  #ifdef __KERNEL__  #include <asm/byteorder.h>  #include <asm/page.h> +#include <asm/vectors.h> +#include <linux/bug.h>  #include <linux/kernel.h>  #include <linux/types.h> -#define XCHAL_KIO_CACHED_VADDR	0xe0000000 -#define XCHAL_KIO_BYPASS_VADDR	0xf0000000 -#define XCHAL_KIO_PADDR		0xf0000000 -#define XCHAL_KIO_SIZE		0x10000000 -  #define IOADDR(x)		(XCHAL_KIO_BYPASS_VADDR + (x)) +#define IO_SPACE_LIMIT ~0 -/* - * swap functions to change byte order from little-endian to big-endian and - * vice versa. - */ - -static inline unsigned short _swapw (unsigned short v) -{ -	return (v << 8) | (v >> 8); -} - -static inline unsigned int _swapl (unsigned int v) -{ -	return (v << 24) | ((v & 0xff00) << 8) | ((v >> 8) & 0xff00) | (v >> 24); -} +#ifdef CONFIG_MMU -/* - * Change virtual addresses to physical addresses and vv. - * These are trivial on the 1:1 Linux/Xtensa mapping - */ +#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) +extern unsigned long xtensa_kio_paddr; -static inline unsigned long virt_to_phys(volatile void * address) +static inline unsigned long xtensa_get_kio_paddr(void)  { -	return __pa(address); +	return xtensa_kio_paddr;  } - -static inline void * phys_to_virt(unsigned long address) -{ -	return __va(address); -} - -/* - * virt_to_bus and bus_to_virt are deprecated. - */ - -#define virt_to_bus(x)	virt_to_phys(x) -#define bus_to_virt(x)	phys_to_virt(x) +#endif  /* - * Return the virtual (cached) address for the specified bus memory. + * Return the virtual address for the specified bus memory.   * Note that we currently don't support any address outside the KIO segment.   */ - -static inline void *ioremap(unsigned long offset, unsigned long size) +static inline void __iomem *ioremap_nocache(unsigned long offset, +		unsigned long size)  { -#ifdef CONFIG_MMU  	if (offset >= XCHAL_KIO_PADDR -	    && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE) +	    && offset - XCHAL_KIO_PADDR < XCHAL_KIO_SIZE)  		return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_BYPASS_VADDR);  	else  		BUG(); -#else -	return (void *)offset; -#endif  } -static inline void *ioremap_nocache(unsigned long offset, unsigned long size) +static inline void __iomem *ioremap_cache(unsigned long offset, +		unsigned long size)  { -#ifdef CONFIG_MMU  	if (offset >= XCHAL_KIO_PADDR -	    && offset < XCHAL_KIO_PADDR + XCHAL_KIO_SIZE) +	    && offset - XCHAL_KIO_PADDR < XCHAL_KIO_SIZE)  		return (void*)(offset-XCHAL_KIO_PADDR+XCHAL_KIO_CACHED_VADDR);  	else  		BUG(); -#else -	return (void *)offset; -#endif  } -static inline void iounmap(void *addr) -{ -} +#define ioremap_wc ioremap_nocache -/* - * Generic I/O - */ - -#define readb(addr) \ -	({ unsigned char __v = (*(volatile unsigned char *)(addr)); __v; }) -#define readw(addr) \ -	({ unsigned short __v = (*(volatile unsigned short *)(addr)); __v; }) -#define readl(addr) \ -	({ unsigned int __v = (*(volatile unsigned int *)(addr)); __v; }) -#define writeb(b, addr) (void)((*(volatile unsigned char *)(addr)) = (b)) -#define writew(b, addr) (void)((*(volatile unsigned short *)(addr)) = (b)) -#define writel(b, addr) (void)((*(volatile unsigned int *)(addr)) = (b)) - -static inline __u8 __raw_readb(const volatile void __iomem *addr) -{ -          return *(__force volatile __u8 *)(addr); -} -static inline __u16 __raw_readw(const volatile void __iomem *addr) -{ -          return *(__force volatile __u16 *)(addr); -} -static inline __u32 __raw_readl(const volatile void __iomem *addr) -{ -          return *(__force volatile __u32 *)(addr); -} -static inline void __raw_writeb(__u8 b, volatile void __iomem *addr) -{ -          *(__force volatile __u8 *)(addr) = b; -} -static inline void __raw_writew(__u16 b, volatile void __iomem *addr) +static inline void __iomem *ioremap(unsigned long offset, unsigned long size)  { -          *(__force volatile __u16 *)(addr) = b; +	return ioremap_nocache(offset, size);  } -static inline void __raw_writel(__u32 b, volatile void __iomem *addr) + +static inline void iounmap(volatile void __iomem *addr)  { -          *(__force volatile __u32 *)(addr) = b;  } -/* These are the definitions for the x86 IO instructions - * inb/inw/inl/outb/outw/outl, the "string" versions - * insb/insw/insl/outsb/outsw/outsl, and the "pausing" versions - * inb_p/inw_p/... - * The macros don't do byte-swapping. - */ - -#define inb(port)		readb((u8 *)((port))) -#define outb(val, port)		writeb((val),(u8 *)((unsigned long)(port))) -#define inw(port)		readw((u16 *)((port))) -#define outw(val, port)		writew((val),(u16 *)((unsigned long)(port))) -#define inl(port)		readl((u32 *)((port))) -#define outl(val, port)		writel((val),(u32 *)((unsigned long)(port))) - -#define inb_p(port)		inb((port)) -#define outb_p(val, port)	outb((val), (port)) -#define inw_p(port)		inw((port)) -#define outw_p(val, port)	outw((val), (port)) -#define inl_p(port)		inl((port)) -#define outl_p(val, port)	outl((val), (port)) - -extern void insb (unsigned long port, void *dst, unsigned long count); -extern void insw (unsigned long port, void *dst, unsigned long count); -extern void insl (unsigned long port, void *dst, unsigned long count); -extern void outsb (unsigned long port, const void *src, unsigned long count); -extern void outsw (unsigned long port, const void *src, unsigned long count); -extern void outsl (unsigned long port, const void *src, unsigned long count); - -#define IO_SPACE_LIMIT ~0 - -#define memset_io(a,b,c)       memset((void *)(a),(b),(c)) -#define memcpy_fromio(a,b,c)   memcpy((a),(void *)(b),(c)) -#define memcpy_toio(a,b,c)      memcpy((void *)(a),(b),(c)) - -/* At this point the Xtensa doesn't provide byte swap instructions */ - -#ifdef __XTENSA_EB__ -# define in_8(addr) (*(u8*)(addr)) -# define in_le16(addr) _swapw(*(u16*)(addr)) -# define in_le32(addr) _swapl(*(u32*)(addr)) -# define out_8(b, addr) *(u8*)(addr) = (b) -# define out_le16(b, addr) *(u16*)(addr) = _swapw(b) -# define out_le32(b, addr) *(u32*)(addr) = _swapl(b) -#elif defined(__XTENSA_EL__) -# define in_8(addr)  (*(u8*)(addr)) -# define in_le16(addr) (*(u16*)(addr)) -# define in_le32(addr) (*(u32*)(addr)) -# define out_8(b, addr) *(u8*)(addr) = (b) -# define out_le16(b, addr) *(u16*)(addr) = (b) -# define out_le32(b, addr) *(u32*)(addr) = (b) -#else -# error processor byte order undefined! -#endif +#define virt_to_bus     virt_to_phys +#define bus_to_virt     phys_to_virt +#endif /* CONFIG_MMU */  /* - * Convert a physical pointer to a virtual kernel pointer for /dev/mem access - */ -#define xlate_dev_mem_ptr(p)    __va(p) - -/* - * Convert a virtual cached pointer to an uncached pointer + * Generic I/O   */ -#define xlate_dev_kmem_ptr(p)   p - +#define readb_relaxed readb +#define readw_relaxed readw +#define readl_relaxed readl  #endif	/* __KERNEL__ */ +#include <asm-generic/io.h> +  #endif	/* _XTENSA_IO_H */ diff --git a/arch/xtensa/include/asm/ioctl.h b/arch/xtensa/include/asm/ioctl.h deleted file mode 100644 index b279fe06dfe..00000000000 --- a/arch/xtensa/include/asm/ioctl.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/ioctl.h> diff --git a/arch/xtensa/include/asm/ioctls.h b/arch/xtensa/include/asm/ioctls.h deleted file mode 100644 index ab1800012ed..00000000000 --- a/arch/xtensa/include/asm/ioctls.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * include/asm-xtensa/ioctls.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2003 - 2005 Tensilica Inc. - * - * Derived from "include/asm-i386/ioctls.h" - */ - -#ifndef _XTENSA_IOCTLS_H -#define _XTENSA_IOCTLS_H - -#include <asm/ioctl.h> - -#define FIOCLEX		_IO('f', 1) -#define FIONCLEX	_IO('f', 2) -#define FIOASYNC	_IOW('f', 125, int) -#define FIONBIO		_IOW('f', 126, int) -#define FIONREAD	_IOR('f', 127, int) -#define TIOCINQ		FIONREAD -#define FIOQSIZE	_IOR('f', 128, loff_t) - -#define TCGETS		0x5401 -#define TCSETS		0x5402 -#define TCSETSW		0x5403 -#define TCSETSF		0x5404 - -#define TCGETA		_IOR('t', 23, struct termio) -#define TCSETA		_IOW('t', 24, struct termio) -#define TCSETAW		_IOW('t', 25, struct termio) -#define TCSETAF		_IOW('t', 28, struct termio) - -#define TCSBRK		_IO('t', 29) -#define TCXONC		_IO('t', 30) -#define TCFLSH		_IO('t', 31) - -#define TIOCSWINSZ	_IOW('t', 103, struct winsize) -#define TIOCGWINSZ	_IOR('t', 104, struct winsize) -#define	TIOCSTART	_IO('t', 110)		/* start output, like ^Q */ -#define	TIOCSTOP	_IO('t', 111)		/* stop output, like ^S */ -#define TIOCOUTQ        _IOR('t', 115, int)     /* output queue size */ - -#define TIOCSPGRP	_IOW('t', 118, int) -#define TIOCGPGRP	_IOR('t', 119, int) - -#define TIOCEXCL	_IO('T', 12) -#define TIOCNXCL	_IO('T', 13) -#define TIOCSCTTY	_IO('T', 14) - -#define TIOCSTI		_IOW('T', 18, char) -#define TIOCMGET	_IOR('T', 21, unsigned int) -#define TIOCMBIS	_IOW('T', 22, unsigned int) -#define TIOCMBIC	_IOW('T', 23, unsigned int) -#define TIOCMSET	_IOW('T', 24, unsigned int) -# define TIOCM_LE	0x001 -# define TIOCM_DTR	0x002 -# define TIOCM_RTS	0x004 -# define TIOCM_ST	0x008 -# define TIOCM_SR	0x010 -# define TIOCM_CTS	0x020 -# define TIOCM_CAR	0x040 -# define TIOCM_RNG	0x080 -# define TIOCM_DSR	0x100 -# define TIOCM_CD	TIOCM_CAR -# define TIOCM_RI	TIOCM_RNG - -#define TIOCGSOFTCAR	_IOR('T', 25, unsigned int) -#define TIOCSSOFTCAR	_IOW('T', 26, unsigned int) -#define TIOCLINUX	_IOW('T', 28, char) -#define TIOCCONS	_IO('T', 29) -#define TIOCGSERIAL	_IOR('T', 30, struct serial_struct) -#define TIOCSSERIAL	_IOW('T', 31, struct serial_struct) -#define TIOCPKT		_IOW('T', 32, int) -# define TIOCPKT_DATA		 0 -# define TIOCPKT_FLUSHREAD	 1 -# define TIOCPKT_FLUSHWRITE	 2 -# define TIOCPKT_STOP		 4 -# define TIOCPKT_START		 8 -# define TIOCPKT_NOSTOP		16 -# define TIOCPKT_DOSTOP		32 -# define TIOCPKT_IOCTL		64 - - -#define TIOCNOTTY	_IO('T', 34) -#define TIOCSETD	_IOW('T', 35, int) -#define TIOCGETD	_IOR('T', 36, int) -#define TCSBRKP		_IOW('T', 37, int)   /* Needed for POSIX tcsendbreak()*/ -#define TIOCTTYGSTRUCT	_IOR('T', 38, struct tty_struct) /* For debugging only*/ -#define TIOCSBRK	_IO('T', 39) 	     /* BSD compatibility */ -#define TIOCCBRK	_IO('T', 40)	     /* BSD compatibility */ -#define TIOCGSID	_IOR('T', 41, pid_t) /* Return the session ID of FD*/ -#define TCGETS2		_IOR('T', 42, struct termios2) -#define TCSETS2		_IOW('T', 43, struct termios2) -#define TCSETSW2	_IOW('T', 44, struct termios2) -#define TCSETSF2	_IOW('T', 45, struct termios2) -#define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */ -#define TIOCSIG		_IOW('T',0x36, int)  /* Generate signal on Pty slave */ - -#define TIOCSERCONFIG	_IO('T', 83) -#define TIOCSERGWILD	_IOR('T', 84,  int) -#define TIOCSERSWILD	_IOW('T', 85,  int) -#define TIOCGLCKTRMIOS	0x5456 -#define TIOCSLCKTRMIOS	0x5457 -#define TIOCSERGSTRUCT	0x5458		     /* For debugging only */ -#define TIOCSERGETLSR   _IOR('T', 89, unsigned int) /* Get line status reg. */ -  /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ -# define TIOCSER_TEMT    0x01		     /* Transmitter physically empty */ -#define TIOCSERGETMULTI _IOR('T', 90, struct serial_multiport_struct) /* Get multiport config  */ -#define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ - -#define TIOCMIWAIT	_IO('T', 92) /* wait for a change on serial input line(s) */ -#define TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */ - -#endif /* _XTENSA_IOCTLS_H */ diff --git a/arch/xtensa/include/asm/ipcbuf.h b/arch/xtensa/include/asm/ipcbuf.h deleted file mode 100644 index c33aa6a4214..00000000000 --- a/arch/xtensa/include/asm/ipcbuf.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * include/asm-xtensa/ipcbuf.h - * - * The ipc64_perm structure for the Xtensa architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_IPCBUF_H -#define _XTENSA_IPCBUF_H - -/* - * Pad space is left for: - * - 32-bit mode_t and seq - * - 2 miscellaneous 32-bit values - * - * This file is subject to the terms and conditions of the GNU General - * Public License.  See the file "COPYING" in the main directory of - * this archive for more details. - */ - -struct ipc64_perm -{ -	__kernel_key_t		key; -	__kernel_uid32_t	uid; -	__kernel_gid32_t	gid; -	__kernel_uid32_t	cuid; -	__kernel_gid32_t	cgid; -	__kernel_mode_t		mode; -	unsigned long		seq; -	unsigned long		__unused1; -	unsigned long		__unused2; -}; - -#endif /* _XTENSA_IPCBUF_H */ diff --git a/arch/xtensa/include/asm/irq.h b/arch/xtensa/include/asm/irq.h index 4c0ccc9c4f4..f71f88ea764 100644 --- a/arch/xtensa/include/asm/irq.h +++ b/arch/xtensa/include/asm/irq.h @@ -43,5 +43,14 @@ static __inline__ int irq_canonicalize(int irq)  }  struct irqaction; +struct irq_domain; + +void migrate_irqs(void); +int xtensa_irq_domain_xlate(const u32 *intspec, unsigned int intsize, +		unsigned long int_irq, unsigned long ext_irq, +		unsigned long *out_hwirq, unsigned int *out_type); +int xtensa_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw); +unsigned xtensa_map_ext_irq(unsigned ext_irq); +unsigned xtensa_get_ext_irq_no(unsigned irq);  #endif	/* _XTENSA_IRQ_H */ diff --git a/arch/xtensa/include/asm/irq_regs.h b/arch/xtensa/include/asm/irq_regs.h deleted file mode 100644 index 3dd9c0b7027..00000000000 --- a/arch/xtensa/include/asm/irq_regs.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/irq_regs.h> diff --git a/arch/xtensa/include/asm/irqflags.h b/arch/xtensa/include/asm/irqflags.h index dae9a8bdcb1..ea36674c6ec 100644 --- a/arch/xtensa/include/asm/irqflags.h +++ b/arch/xtensa/include/asm/irqflags.h @@ -16,7 +16,7 @@  static inline unsigned long arch_local_save_flags(void)  {  	unsigned long flags; -	asm volatile("rsr %0,"__stringify(PS) : "=a" (flags)); +	asm volatile("rsr %0, ps" : "=a" (flags));  	return flags;  } @@ -41,13 +41,16 @@ static inline void arch_local_irq_enable(void)  static inline void arch_local_irq_restore(unsigned long flags)  { -	asm volatile("wsr %0, "__stringify(PS)" ; rsync" +	asm volatile("wsr %0, ps; rsync"  		     :: "a" (flags) : "memory");  }  static inline bool arch_irqs_disabled_flags(unsigned long flags)  { -	return (flags & 0xf) != 0; +#if XCHAL_EXCM_LEVEL < LOCKLEVEL || (1 << PS_EXCM_BIT) < LOCKLEVEL +#error "XCHAL_EXCM_LEVEL and 1<<PS_EXCM_BIT must be no less than LOCKLEVEL" +#endif +	return (flags & (PS_INTLEVEL_MASK | (1 << PS_EXCM_BIT))) >= LOCKLEVEL;  }  static inline bool arch_irqs_disabled(void) diff --git a/arch/xtensa/include/asm/kdebug.h b/arch/xtensa/include/asm/kdebug.h deleted file mode 100644 index 6ece1b03766..00000000000 --- a/arch/xtensa/include/asm/kdebug.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/kdebug.h> diff --git a/arch/xtensa/include/asm/kmap_types.h b/arch/xtensa/include/asm/kmap_types.h deleted file mode 100644 index 11c687e527f..00000000000 --- a/arch/xtensa/include/asm/kmap_types.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _XTENSA_KMAP_TYPES_H -#define _XTENSA_KMAP_TYPES_H - -#include <asm-generic/kmap_types.h> - -#endif	/* _XTENSA_KMAP_TYPES_H */ diff --git a/arch/xtensa/include/asm/linkage.h b/arch/xtensa/include/asm/linkage.h deleted file mode 100644 index bf2128a99d7..00000000000 --- a/arch/xtensa/include/asm/linkage.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/linkage.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_LINKAGE_H -#define _XTENSA_LINKAGE_H - -/* Nothing to do here ... */ - -#endif	/* _XTENSA_LINKAGE_H */ diff --git a/arch/xtensa/include/asm/local.h b/arch/xtensa/include/asm/local.h deleted file mode 100644 index 48723e550d1..00000000000 --- a/arch/xtensa/include/asm/local.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/local.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_LOCAL_H -#define _XTENSA_LOCAL_H - -#include <asm-generic/local.h> - -#endif /* _XTENSA_LOCAL_H */ diff --git a/arch/xtensa/include/asm/local64.h b/arch/xtensa/include/asm/local64.h deleted file mode 100644 index 36c93b5cc23..00000000000 --- a/arch/xtensa/include/asm/local64.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/local64.h> diff --git a/arch/xtensa/include/asm/mman.h b/arch/xtensa/include/asm/mman.h deleted file mode 100644 index fca4db425f6..00000000000 --- a/arch/xtensa/include/asm/mman.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * include/asm-xtensa/mman.h - * - * Xtensa Processor memory-manager definitions - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1995 by Ralf Baechle - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_MMAN_H -#define _XTENSA_MMAN_H - -/* - * Protections are chosen from these bits, OR'd together.  The - * implementation does not necessarily support PROT_EXEC or PROT_WRITE - * without PROT_READ.  The only guarantees are that no writing will be - * allowed without PROT_WRITE and no access will be allowed for PROT_NONE. - */ - -#define PROT_NONE	0x0		/* page can not be accessed */ -#define PROT_READ	0x1		/* page can be read */ -#define PROT_WRITE	0x2		/* page can be written */ -#define PROT_EXEC	0x4		/* page can be executed */ - -#define PROT_SEM	0x10		/* page may be used for atomic ops */ -#define PROT_GROWSDOWN	0x01000000	/* mprotect flag: extend change to start of growsdown vma */ -#define PROT_GROWSUP	0x02000000	/* mprotect flag: extend change to end fo growsup vma */ - -/* - * Flags for mmap - */ -#define MAP_SHARED	0x001		/* Share changes */ -#define MAP_PRIVATE	0x002		/* Changes are private */ -#define MAP_TYPE	0x00f		/* Mask for type of mapping */ -#define MAP_FIXED	0x010		/* Interpret addr exactly */ - -/* not used by linux, but here to make sure we don't clash with ABI defines */ -#define MAP_RENAME	0x020		/* Assign page to file */ -#define MAP_AUTOGROW	0x040		/* File may grow by writing */ -#define MAP_LOCAL	0x080		/* Copy on fork/sproc */ -#define MAP_AUTORSRV	0x100		/* Logical swap reserved on demand */ - -/* These are linux-specific */ -#define MAP_NORESERVE	0x0400		/* don't check for reservations */ -#define MAP_ANONYMOUS	0x0800		/* don't use a file */ -#define MAP_GROWSDOWN	0x1000		/* stack-like segment */ -#define MAP_DENYWRITE	0x2000		/* ETXTBSY */ -#define MAP_EXECUTABLE	0x4000		/* mark it as an executable */ -#define MAP_LOCKED	0x8000		/* pages are locked */ -#define MAP_POPULATE	0x10000		/* populate (prefault) pagetables */ -#define MAP_NONBLOCK	0x20000		/* do not block on IO */ -#define MAP_STACK	0x40000		/* give out an address that is best suited for process/thread stacks */ -#define MAP_HUGETLB	0x80000		/* create a huge page mapping */ - -/* - * Flags for msync - */ -#define MS_ASYNC	0x0001		/* sync memory asynchronously */ -#define MS_INVALIDATE	0x0002		/* invalidate mappings & caches */ -#define MS_SYNC		0x0004		/* synchronous memory sync */ - -/* - * Flags for mlockall - */ -#define MCL_CURRENT	1		/* lock all current mappings */ -#define MCL_FUTURE	2		/* lock all future mappings */ - -#define MADV_NORMAL	0		/* no further special treatment */ -#define MADV_RANDOM	1		/* expect random page references */ -#define MADV_SEQUENTIAL	2		/* expect sequential page references */ -#define MADV_WILLNEED	3		/* will need these pages */ -#define MADV_DONTNEED	4		/* don't need these pages */ - -/* common parameters: try to keep these consistent across architectures */ -#define MADV_REMOVE	9		/* remove these pages & resources */ -#define MADV_DONTFORK	10		/* don't inherit across fork */ -#define MADV_DOFORK	11		/* do inherit across fork */ - -#define MADV_MERGEABLE   12		/* KSM may merge identical pages */ -#define MADV_UNMERGEABLE 13		/* KSM may not merge identical pages */ - -/* compatibility flags */ -#define MAP_FILE	0 - -#endif /* _XTENSA_MMAN_H */ diff --git a/arch/xtensa/include/asm/mmu.h b/arch/xtensa/include/asm/mmu.h index 04890d6e233..71afe418d0e 100644 --- a/arch/xtensa/include/asm/mmu.h +++ b/arch/xtensa/include/asm/mmu.h @@ -1,22 +1,22 @@  /* - * include/asm-xtensa/mmu.h - *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_MMU_H  #define _XTENSA_MMU_H  #ifndef CONFIG_MMU -#include <asm/nommu.h> +#include <asm-generic/mmu.h>  #else -/* Default "unsigned long" context */ -typedef unsigned long mm_context_t; +typedef struct { +	unsigned long asid[NR_CPUS]; +	unsigned int cpu; +} mm_context_t;  #endif /* CONFIG_MMU */  #endif	/* _XTENSA_MMU_H */ diff --git a/arch/xtensa/include/asm/mmu_context.h b/arch/xtensa/include/asm/mmu_context.h index dbd8731a876..d33c71a8c9e 100644 --- a/arch/xtensa/include/asm/mmu_context.h +++ b/arch/xtensa/include/asm/mmu_context.h @@ -1,13 +1,11 @@  /* - * include/asm-xtensa/mmu_context.h - *   * Switch an MMU context.   *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_MMU_CONTEXT_H @@ -20,22 +18,25 @@  #include <linux/stringify.h>  #include <linux/sched.h> -#include <variant/core.h> +#include <asm/vectors.h>  #include <asm/pgtable.h>  #include <asm/cacheflush.h>  #include <asm/tlbflush.h>  #include <asm-generic/mm_hooks.h> +#include <asm-generic/percpu.h>  #if (XCHAL_HAVE_TLBS != 1)  # error "Linux must have an MMU!"  #endif -extern unsigned long asid_cache; +DECLARE_PER_CPU(unsigned long, asid_cache); +#define cpu_asid_cache(cpu) per_cpu(asid_cache, cpu)  /*   * NO_CONTEXT is the invalid ASID value that we don't ever assign to - * any user or kernel context. + * any user or kernel context.  We use the reserved values in the + * ASID_INSERT macro below.   *   * 0 invalid   * 1 kernel @@ -49,77 +50,96 @@ extern unsigned long asid_cache;  #define ASID_MASK	((1 << XCHAL_MMU_ASID_BITS) - 1)  #define ASID_INSERT(x)	(0x03020001 | (((x) & ASID_MASK) << 8)) +#ifdef CONFIG_MMU +void init_mmu(void); +#else +static inline void init_mmu(void) { } +#endif +  static inline void set_rasid_register (unsigned long val)  { -	__asm__ __volatile__ (" wsr %0, "__stringify(RASID)"\n\t" +	__asm__ __volatile__ (" wsr %0, rasid\n\t"  			      " isync\n" : : "a" (val));  }  static inline unsigned long get_rasid_register (void)  {  	unsigned long tmp; -	__asm__ __volatile__ (" rsr %0,"__stringify(RASID)"\n\t" : "=a" (tmp)); +	__asm__ __volatile__ (" rsr %0, rasid\n\t" : "=a" (tmp));  	return tmp;  } -static inline void -__get_new_mmu_context(struct mm_struct *mm) +static inline void get_new_mmu_context(struct mm_struct *mm, unsigned int cpu)  { -	extern void flush_tlb_all(void); -	if (! (++asid_cache & ASID_MASK) ) { -		flush_tlb_all(); /* start new asid cycle */ -		asid_cache += ASID_USER_FIRST; +	unsigned long asid = cpu_asid_cache(cpu); +	if ((++asid & ASID_MASK) == 0) { +		/* +		 * Start new asid cycle; continue counting with next +		 * incarnation bits; skipping over 0, 1, 2, 3. +		 */ +		local_flush_tlb_all(); +		asid += ASID_USER_FIRST;  	} -	mm->context = asid_cache; +	cpu_asid_cache(cpu) = asid; +	mm->context.asid[cpu] = asid; +	mm->context.cpu = cpu;  } -static inline void -__load_mmu_context(struct mm_struct *mm) +static inline void get_mmu_context(struct mm_struct *mm, unsigned int cpu)  { -	set_rasid_register(ASID_INSERT(mm->context)); +	/* +	 * Check if our ASID is of an older version and thus invalid. +	 */ + +	if (mm) { +		unsigned long asid = mm->context.asid[cpu]; + +		if (asid == NO_CONTEXT || +				((asid ^ cpu_asid_cache(cpu)) & ~ASID_MASK)) +			get_new_mmu_context(mm, cpu); +	} +} + +static inline void activate_context(struct mm_struct *mm, unsigned int cpu) +{ +	get_mmu_context(mm, cpu); +	set_rasid_register(ASID_INSERT(mm->context.asid[cpu]));  	invalidate_page_directory();  }  /*   * Initialize the context related info for a new mm_struct - * instance. + * instance.  Valid cpu values are 0..(NR_CPUS-1), so initializing + * to -1 says the process has never run on any core.   */ -static inline int -init_new_context(struct task_struct *tsk, struct mm_struct *mm) +static inline int init_new_context(struct task_struct *tsk, +		struct mm_struct *mm)  { -	mm->context = NO_CONTEXT; +	int cpu; +	for_each_possible_cpu(cpu) { +		mm->context.asid[cpu] = NO_CONTEXT; +	} +	mm->context.cpu = -1;  	return 0;  } -/* - * After we have set current->mm to a new value, this activates - * the context for the new mm so we see the new mappings. - */ -static inline void -activate_mm(struct mm_struct *prev, struct mm_struct *next) -{ -	/* Unconditionally get a new ASID.  */ - -	__get_new_mmu_context(next); -	__load_mmu_context(next); -} - -  static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, -                             struct task_struct *tsk) +			     struct task_struct *tsk)  { -	unsigned long asid = asid_cache; - -	/* Check if our ASID is of an older version and thus invalid */ - -	if (next->context == NO_CONTEXT || ((next->context^asid) & ~ASID_MASK)) -		__get_new_mmu_context(next); - -	__load_mmu_context(next); +	unsigned int cpu = smp_processor_id(); +	int migrated = next->context.cpu != cpu; +	/* Flush the icache if we migrated to a new core. */ +	if (migrated) { +		__invalidate_icache_all(); +		next->context.cpu = cpu; +	} +	if (migrated || prev != next) +		activate_context(next, cpu);  } -#define deactivate_mm(tsk, mm)	do { } while(0) +#define activate_mm(prev, next)	switch_mm((prev), (next), NULL) +#define deactivate_mm(tsk, mm)	do { } while (0)  /*   * Destroy context related info for an mm_struct that is about diff --git a/arch/xtensa/include/asm/module.h b/arch/xtensa/include/asm/module.h index d9b34bee4d4..488b40c6f9b 100644 --- a/arch/xtensa/include/asm/module.h +++ b/arch/xtensa/include/asm/module.h @@ -13,15 +13,8 @@  #ifndef _XTENSA_MODULE_H  #define _XTENSA_MODULE_H -struct mod_arch_specific -{ -	/* No special elements, yet. */ -}; -  #define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " " -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Ehdr Elf32_Ehdr +#include <asm-generic/module.h>  #endif	/* _XTENSA_MODULE_H */ diff --git a/arch/xtensa/include/asm/msgbuf.h b/arch/xtensa/include/asm/msgbuf.h deleted file mode 100644 index 693c9675528..00000000000 --- a/arch/xtensa/include/asm/msgbuf.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * include/asm-xtensa/msgbuf.h - * - * The msqid64_ds structure for the Xtensa architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - * - * This file is subject to the terms and conditions of the GNU General - * Public License.  See the file "COPYING" in the main directory of - * this archive for more details. - */ - -#ifndef _XTENSA_MSGBUF_H -#define _XTENSA_MSGBUF_H - -struct msqid64_ds { -	struct ipc64_perm msg_perm; -#ifdef __XTENSA_EB__ -	unsigned int	__unused1; -	__kernel_time_t msg_stime;	/* last msgsnd time */ -	unsigned int	__unused2; -	__kernel_time_t msg_rtime;	/* last msgrcv time */ -	unsigned int	__unused3; -	__kernel_time_t msg_ctime;	/* last change time */ -#elif defined(__XTENSA_EL__) -	__kernel_time_t msg_stime;	/* last msgsnd time */ -	unsigned int	__unused1; -	__kernel_time_t msg_rtime;	/* last msgrcv time */ -	unsigned int	__unused2; -	__kernel_time_t msg_ctime;	/* last change time */ -	unsigned int	__unused3; -#else -# error processor byte order undefined! -#endif -	unsigned long  msg_cbytes;	/* current number of bytes on queue */ -	unsigned long  msg_qnum;	/* number of messages in queue */ -	unsigned long  msg_qbytes;	/* max number of bytes on queue */ -	__kernel_pid_t msg_lspid;	/* pid of last msgsnd */ -	__kernel_pid_t msg_lrpid;	/* last receive pid */ -	unsigned long  __unused4; -	unsigned long  __unused5; -}; - -#endif	/* _XTENSA_MSGBUF_H */ diff --git a/arch/xtensa/include/asm/mxregs.h b/arch/xtensa/include/asm/mxregs.h new file mode 100644 index 00000000000..73dcc5456f6 --- /dev/null +++ b/arch/xtensa/include/asm/mxregs.h @@ -0,0 +1,46 @@ +/* + * Xtensa MX interrupt distributor + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2008 - 2013 Tensilica Inc. + */ + +#ifndef _XTENSA_MXREGS_H +#define _XTENSA_MXREGS_H + +/* + * RER/WER at, as	Read/write external register + *	at: value + *	as: address + * + * Address	Value + * 00nn		0...0p..p	Interrupt Routing, route IRQ n to processor p + * 01pp		0...0d..d	16 bits (d) 'ored' as single IPI to processor p + * 0180		0...0m..m	Clear enable specified by mask (m) + * 0184		0...0m..m	Set enable specified by mask (m) + * 0190		0...0x..x	8-bit IPI partition register + *				VVVVVVVVPPPPUUUUUUUUUUUUUUUUU + *				V (10-bit) Release/Version + *				P ( 4-bit) Number of cores - 1 + *				U (18-bit) ID + * 01a0		i.......i	32-bit ConfigID + * 0200		0...0m..m	RunStall core 'n' + * 0220		c		Cache coherency enabled + */ + +#define MIROUT(irq)	(0x000 + (irq)) +#define MIPICAUSE(cpu)	(0x100 + (cpu)) +#define MIPISET(cause)	(0x140 + (cause)) +#define MIENG		0x180 +#define MIENGSET	0x184 +#define MIASG		0x188	/* Read Global Assert Register */ +#define MIASGSET	0x18c	/* Set Global Addert Regiter */ +#define MIPIPART	0x190 +#define SYSCFGID	0x1a0 +#define MPSCORE		0x200 +#define CCON		0x220 + +#endif /* _XTENSA_MXREGS_H */ diff --git a/arch/xtensa/include/asm/nommu.h b/arch/xtensa/include/asm/nommu.h deleted file mode 100644 index dce2c438c5b..00000000000 --- a/arch/xtensa/include/asm/nommu.h +++ /dev/null @@ -1,3 +0,0 @@ -typedef struct { -	unsigned long end_brk; -} mm_context_t; diff --git a/arch/xtensa/include/asm/nommu_context.h b/arch/xtensa/include/asm/nommu_context.h index 599e7a2e729..3407cf7989b 100644 --- a/arch/xtensa/include/asm/nommu_context.h +++ b/arch/xtensa/include/asm/nommu_context.h @@ -2,7 +2,7 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)  {  } -static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) +static inline int init_new_context(struct task_struct *tsk,struct mm_struct *mm)  {  	return 0;  } diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h index 161bb89e98c..47f582333f6 100644 --- a/arch/xtensa/include/asm/page.h +++ b/arch/xtensa/include/asm/page.h @@ -29,19 +29,19 @@   * PAGE_SHIFT determines the page size   */ -#define PAGE_SHIFT		12 -#define PAGE_SIZE		(__XTENSA_UL_CONST(1) << PAGE_SHIFT) -#define PAGE_MASK		(~(PAGE_SIZE-1)) +#define PAGE_SHIFT	12 +#define PAGE_SIZE	(__XTENSA_UL_CONST(1) << PAGE_SHIFT) +#define PAGE_MASK	(~(PAGE_SIZE-1))  #ifdef CONFIG_MMU -#define PAGE_OFFSET		XCHAL_KSEG_CACHED_VADDR -#define MAX_MEM_PFN		XCHAL_KSEG_SIZE +#define PAGE_OFFSET	XCHAL_KSEG_CACHED_VADDR +#define MAX_MEM_PFN	XCHAL_KSEG_SIZE  #else -#define PAGE_OFFSET		0 -#define MAX_MEM_PFN		(PLATFORM_DEFAULT_MEM_START + PLATFORM_DEFAULT_MEM_SIZE) +#define PAGE_OFFSET	0 +#define MAX_MEM_PFN	(PLATFORM_DEFAULT_MEM_START + PLATFORM_DEFAULT_MEM_SIZE)  #endif -#define PGTABLE_START		0x80000000 +#define PGTABLE_START	0x80000000  /*   * Cache aliasing: @@ -161,7 +161,9 @@ extern void copy_user_page(void*, void*, unsigned long, struct page*);  #define __pa(x)			((unsigned long) (x) - PAGE_OFFSET)  #define __va(x)			((void *)((unsigned long) (x) + PAGE_OFFSET)) -#define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr) +#define pfn_valid(pfn) \ +	((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr) +  #ifdef CONFIG_DISCONTIGMEM  # error CONFIG_DISCONTIGMEM not supported  #endif @@ -171,10 +173,6 @@ extern void copy_user_page(void*, void*, unsigned long, struct page*);  #define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)  #define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT) -#ifdef CONFIG_MMU -#define WANT_PAGE_VIRTUAL -#endif -  #endif /* __ASSEMBLY__ */  #define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \ diff --git a/arch/xtensa/include/asm/param.h b/arch/xtensa/include/asm/param.h index ba03d5aeab6..0a70e780ef2 100644 --- a/arch/xtensa/include/asm/param.h +++ b/arch/xtensa/include/asm/param.h @@ -7,28 +7,12 @@   *   * Copyright (C) 2001 - 2005 Tensilica Inc.   */ -  #ifndef _XTENSA_PARAM_H  #define _XTENSA_PARAM_H -#ifdef __KERNEL__ +#include <uapi/asm/param.h> +  # define HZ		CONFIG_HZ	/* internal timer frequency */  # define USER_HZ	100		/* for user interfaces in "ticks" */  # define CLOCKS_PER_SEC (USER_HZ)	/* frequnzy at which times() counts */ -#else -# define HZ		100 -#endif - -#define EXEC_PAGESIZE	4096 - -#ifndef NGROUPS -#define NGROUPS		32 -#endif - -#ifndef NOGROUP -#define NOGROUP		(-1) -#endif - -#define MAXHOSTNAMELEN	64	/* max length of hostname */ -  #endif /* _XTENSA_PARAM_H */ diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h index 00fcbd7c534..0b68c76ec1e 100644 --- a/arch/xtensa/include/asm/pci-bridge.h +++ b/arch/xtensa/include/asm/pci-bridge.h @@ -35,7 +35,7 @@ struct pci_space {  struct pci_controller {  	int index;			/* used for pci_controller_num */  	struct pci_controller *next; -        struct pci_bus *bus; +	struct pci_bus *bus;  	void *arch_data;  	int first_busno; diff --git a/arch/xtensa/include/asm/pci.h b/arch/xtensa/include/asm/pci.h index 4609b0f15f1..5d52dc43dfe 100644 --- a/arch/xtensa/include/asm/pci.h +++ b/arch/xtensa/include/asm/pci.h @@ -22,16 +22,6 @@  extern struct pci_controller* pcibios_alloc_controller(void); -static inline void pcibios_set_master(struct pci_dev *dev) -{ -	/* No special bus mastering setup handling */ -} - -static inline void pcibios_penalize_isa_irq(int irq) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} -  /* Assume some values. (We should revise them, if necessary) */  #define PCIBIOS_MIN_IO		0x2000 @@ -58,7 +48,7 @@ struct pci_dev;  /* Map a range of PCI memory or I/O space for a device into user space */  int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, -                        enum pci_mmap_state mmap_state, int write_combine); +			enum pci_mmap_state mmap_state, int write_combine);  /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */  #define HAVE_PCI_MMAP	1 diff --git a/arch/xtensa/include/asm/percpu.h b/arch/xtensa/include/asm/percpu.h deleted file mode 100644 index 6d2bc2ada9d..00000000000 --- a/arch/xtensa/include/asm/percpu.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * linux/include/asm-xtensa/percpu.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_PERCPU__ -#define _XTENSA_PERCPU__ - -#include <asm-generic/percpu.h> - -#endif /* _XTENSA_PERCPU__ */ diff --git a/arch/xtensa/include/asm/perf_event.h b/arch/xtensa/include/asm/perf_event.h new file mode 100644 index 00000000000..5aa4590acaa --- /dev/null +++ b/arch/xtensa/include/asm/perf_event.h @@ -0,0 +1,4 @@ +#ifndef __ASM_XTENSA_PERF_EVENT_H +#define __ASM_XTENSA_PERF_EVENT_H + +#endif /* __ASM_XTENSA_PERF_EVENT_H */ diff --git a/arch/xtensa/include/asm/pgalloc.h b/arch/xtensa/include/asm/pgalloc.h index 40cf9bceda2..d38eb9237e6 100644 --- a/arch/xtensa/include/asm/pgalloc.h +++ b/arch/xtensa/include/asm/pgalloc.h @@ -38,35 +38,46 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)  	free_page((unsigned long)pgd);  } -/* Use a slab cache for the pte pages (see also sparc64 implementation) */ - -extern struct kmem_cache *pgtable_cache; - -static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,  +static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,  					 unsigned long address)  { -	return kmem_cache_alloc(pgtable_cache, GFP_KERNEL|__GFP_REPEAT); +	pte_t *ptep; +	int i; + +	ptep = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); +	if (!ptep) +		return NULL; +	for (i = 0; i < 1024; i++) +		pte_clear(NULL, 0, ptep + i); +	return ptep;  }  static inline pgtable_t pte_alloc_one(struct mm_struct *mm,  					unsigned long addr)  { +	pte_t *pte;  	struct page *page; -	page = virt_to_page(pte_alloc_one_kernel(mm, addr)); -	pgtable_page_ctor(page); +	pte = pte_alloc_one_kernel(mm, addr); +	if (!pte) +		return NULL; +	page = virt_to_page(pte); +	if (!pgtable_page_ctor(page)) { +		__free_page(page); +		return NULL; +	}  	return page;  }  static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)  { -	kmem_cache_free(pgtable_cache, pte); +	free_page((unsigned long)pte);  }  static inline void pte_free(struct mm_struct *mm, pgtable_t pte)  {  	pgtable_page_dtor(pte); -	kmem_cache_free(pgtable_cache, page_address(pte)); +	__free_page(pte);  }  #define pmd_pgtable(pmd) pmd_page(pmd) diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h index b03c043ce75..4b0ca35a93b 100644 --- a/arch/xtensa/include/asm/pgtable.h +++ b/arch/xtensa/include/asm/pgtable.h @@ -5,7 +5,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   * - * Copyright (C) 2001 - 2007 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_PGTABLE_H @@ -64,41 +64,82 @@   * Virtual memory area. We keep a distance to other memory regions to be   * on the safe side. We also use this area for cache aliasing.   */ -  #define VMALLOC_START		0xC0000000  #define VMALLOC_END		0xC7FEFFFF  #define TLBTEMP_BASE_1		0xC7FF0000  #define TLBTEMP_BASE_2		0xC7FF8000  /* - * Xtensa Linux config PTE layout (when present): - *	31-12:	PPN - *	11-6:	Software - *	5-4:	RING - *	3-0:	CA + * For the Xtensa architecture, the PTE layout is as follows: + * + *		31------12  11  10-9   8-6  5-4  3-2  1-0 + *		+-----------------------------------------+ + *		|           |   Software   |   HARDWARE   | + *		|    PPN    |          ADW | RI |Attribute| + *		+-----------------------------------------+ + *   pte_none	|             MBZ          | 01 | 11 | 00 | + *		+-----------------------------------------+ + *   present	|    PPN    | 0 | 00 | ADW | RI | CA | wx | + *		+- - - - - - - - - - - - - - - - - - - - -+ + *   (PAGE_NONE)|    PPN    | 0 | 00 | ADW | 01 | 11 | 11 | + *		+-----------------------------------------+ + *   swap	|     index     |   type   | 01 | 11 | 00 | + *		+- - - - - - - - - - - - - - - - - - - - -+ + *   file	|        file offset       | 01 | 11 | 10 | + *		+-----------------------------------------+   * - * Similar to the Alpha and MIPS ports, we need to keep track of the ref - * and mod bits in software.  We have a software "you can read - * from this page" bit, and a hardware one which actually lets the - * process read from the page.  On the same token we have a software - * writable bit and the real hardware one which actually lets the - * process write to the page. + * For T1050 hardware and earlier the layout differs for present and (PAGE_NONE) + *		+-----------------------------------------+ + *   present	|    PPN    | 0 | 00 | ADW | RI | CA | w1 | + *		+-----------------------------------------+ + *   (PAGE_NONE)|    PPN    | 0 | 00 | ADW | 01 | 01 | 00 | + *		+-----------------------------------------+   * - * See further below for PTE layout for swapped-out pages. + *  Legend: + *   PPN        Physical Page Number + *   ADW	software: accessed (young) / dirty / writable + *   RI         ring (0=privileged, 1=user, 2 and 3 are unused) + *   CA		cache attribute: 00 bypass, 01 writeback, 10 writethrough + *		(11 is invalid and used to mark pages that are not present) + *   w		page is writable (hw) + *   x		page is executable (hw) + *   index      swap offset / PAGE_SIZE (bit 11-31: 21 bits -> 8 GB) + *		(note that the index is always non-zero) + *   type       swap type (5 bits -> 32 types) + *   file offset 26-bit offset into the file, in increments of PAGE_SIZE + * + *  Notes: + *   - (PROT_NONE) is a special case of 'present' but causes an exception for + *     any access (read, write, and execute). + *   - 'multihit-exception' has the highest priority of all MMU exceptions, + *     so the ring must be set to 'RING_USER' even for 'non-present' pages. + *   - on older hardware, the exectuable flag was not supported and + *     used as a 'valid' flag, so it needs to be always set. + *   - we need to keep track of certain flags in software (dirty and young) + *     to do this, we use write exceptions and have a separate software w-flag. + *   - attribute value 1101 (and 1111 on T1050 and earlier) is reserved   */ +#define _PAGE_ATTRIB_MASK	0xf +  #define _PAGE_HW_EXEC		(1<<0)	/* hardware: page is executable */  #define _PAGE_HW_WRITE		(1<<1)	/* hardware: page is writable */ -#define _PAGE_FILE		(1<<1)	/* non-linear mapping, if !present */ -#define _PAGE_PROTNONE		(3<<0)	/* special case for VM_PROT_NONE */ - -/* None of these cache modes include MP coherency:  */  #define _PAGE_CA_BYPASS		(0<<2)	/* bypass, non-speculative */  #define _PAGE_CA_WB		(1<<2)	/* write-back */  #define _PAGE_CA_WT		(2<<2)	/* write-through */  #define _PAGE_CA_MASK		(3<<2) -#define _PAGE_INVALID		(3<<2) +#define _PAGE_CA_INVALID	(3<<2) + +/* We use invalid attribute values to distinguish special pte entries */ +#if XCHAL_HW_VERSION_MAJOR < 2000 +#define _PAGE_HW_VALID		0x01	/* older HW needed this bit set */ +#define _PAGE_NONE		0x04 +#else +#define _PAGE_HW_VALID		0x00 +#define _PAGE_NONE		0x0f +#endif +#define _PAGE_FILE		(1<<1)	/* file mapped page, only if !present */  #define _PAGE_USER		(1<<4)	/* user access (ring=1) */ @@ -108,19 +149,12 @@  #define _PAGE_DIRTY		(1<<7)	/* software: page dirty */  #define _PAGE_ACCESSED		(1<<8)	/* software: page accessed (read) */ -/* On older HW revisions, we always have to set bit 0 */ -#if XCHAL_HW_VERSION_MAJOR < 2000 -# define _PAGE_VALID		(1<<0) -#else -# define _PAGE_VALID		0 -#endif - -#define _PAGE_CHG_MASK	(PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) -#define _PAGE_PRESENT	(_PAGE_VALID | _PAGE_CA_WB | _PAGE_ACCESSED) -  #ifdef CONFIG_MMU -#define PAGE_NONE	   __pgprot(_PAGE_INVALID | _PAGE_USER | _PAGE_PROTNONE) +#define _PAGE_CHG_MASK	   (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) +#define _PAGE_PRESENT	   (_PAGE_HW_VALID | _PAGE_CA_WB | _PAGE_ACCESSED) + +#define PAGE_NONE	   __pgprot(_PAGE_NONE | _PAGE_USER)  #define PAGE_COPY	   __pgprot(_PAGE_PRESENT | _PAGE_USER)  #define PAGE_COPY_EXEC	   __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_HW_EXEC)  #define PAGE_READONLY	   __pgprot(_PAGE_PRESENT | _PAGE_USER) @@ -132,9 +166,9 @@  #define PAGE_KERNEL_EXEC   __pgprot(_PAGE_PRESENT|_PAGE_HW_WRITE|_PAGE_HW_EXEC)  #if (DCACHE_WAY_SIZE > PAGE_SIZE) -# define _PAGE_DIRECTORY (_PAGE_VALID | _PAGE_ACCESSED) +# define _PAGE_DIRECTORY   (_PAGE_HW_VALID | _PAGE_ACCESSED | _PAGE_CA_BYPASS)  #else -# define _PAGE_DIRECTORY (_PAGE_VALID | _PAGE_ACCESSED | _PAGE_CA_WB) +# define _PAGE_DIRECTORY   (_PAGE_HW_VALID | _PAGE_ACCESSED | _PAGE_CA_WB)  #endif  #else /* no mmu */ @@ -186,12 +220,11 @@ extern unsigned long empty_zero_page[1024];  #ifdef CONFIG_MMU  extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)];  extern void paging_init(void); -extern void pgtable_cache_init(void);  #else  # define swapper_pg_dir NULL  static inline void paging_init(void) { } -static inline void pgtable_cache_init(void) { }  #endif +static inline void pgtable_cache_init(void) { }  /*   * The pmd contains the kernel virtual address of the pte page. @@ -202,12 +235,16 @@ static inline void pgtable_cache_init(void) { }  /*   * pte status.   */ -#define pte_none(pte)	 (pte_val(pte) == _PAGE_INVALID) -#define pte_present(pte)						\ -	(((pte_val(pte) & _PAGE_CA_MASK) != _PAGE_INVALID)		\ -	 || ((pte_val(pte) & _PAGE_PROTNONE) == _PAGE_PROTNONE)) +# define pte_none(pte)	 (pte_val(pte) == (_PAGE_CA_INVALID | _PAGE_USER)) +#if XCHAL_HW_VERSION_MAJOR < 2000 +# define pte_present(pte) ((pte_val(pte) & _PAGE_CA_MASK) != _PAGE_CA_INVALID) +#else +# define pte_present(pte)						\ +	(((pte_val(pte) & _PAGE_CA_MASK) != _PAGE_CA_INVALID)		\ +	 || ((pte_val(pte) & _PAGE_ATTRIB_MASK) == _PAGE_NONE)) +#endif  #define pte_clear(mm,addr,ptep)						\ -	do { update_pte(ptep, __pte(_PAGE_INVALID)); } while(0) +	do { update_pte(ptep, __pte(_PAGE_CA_INVALID | _PAGE_USER)); } while (0)  #define pmd_none(pmd)	 (!pmd_val(pmd))  #define pmd_present(pmd) (pmd_val(pmd) & PAGE_MASK) @@ -273,6 +310,10 @@ set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pteval)  	update_pte(ptep, pteval);  } +static inline void set_pte(pte_t *ptep, pte_t pteval) +{ +	update_pte(ptep, pteval); +}  static inline void  set_pmd(pmd_t *pmdp, pmd_t pmdval) @@ -284,7 +325,7 @@ struct vm_area_struct;  static inline int  ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, -    			  pte_t *ptep) +			  pte_t *ptep)  {  	pte_t pte = *ptep;  	if (!pte_young(pte)) @@ -304,8 +345,8 @@ ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)  static inline void  ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)  { -  	pte_t pte = *ptep; -  	update_pte(ptep, pte_wrprotect(pte)); +	pte_t pte = *ptep; +	update_pte(ptep, pte_wrprotect(pte));  }  /* to find an entry in a kernel page-table-directory */ @@ -328,35 +369,23 @@ ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)  /* - * Encode and decode a swap entry. - * - * Format of swap pte: - *  bit	   0	   MBZ - *  bit	   1	   page-file (must be zero) - *  bits   2 -  3  page hw access mode (must be 11: _PAGE_INVALID) - *  bits   4 -  5  ring protection (must be 01: _PAGE_USER) - *  bits   6 - 10  swap type (5 bits -> 32 types) - *  bits  11 - 31  swap offset / PAGE_SIZE (21 bits -> 8GB) -  - * Format of file pte: - *  bit	   0	   MBZ - *  bit	   1	   page-file (must be one: _PAGE_FILE) - *  bits   2 -  3  page hw access mode (must be 11: _PAGE_INVALID) - *  bits   4 -  5  ring protection (must be 01: _PAGE_USER) - *  bits   6 - 31  file offset / PAGE_SIZE + * Encode and decode a swap and file entry.   */ +#define SWP_TYPE_BITS		5 +#define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS)  #define __swp_type(entry)	(((entry).val >> 6) & 0x1f)  #define __swp_offset(entry)	((entry).val >> 11)  #define __swp_entry(type,offs)	\ -	((swp_entry_t) {((type) << 6) | ((offs) << 11) | _PAGE_INVALID}) +	((swp_entry_t){((type) << 6) | ((offs) << 11) | \ +	 _PAGE_CA_INVALID | _PAGE_USER})  #define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) })  #define __swp_entry_to_pte(x)	((pte_t) { (x).val }) -#define PTE_FILE_MAX_BITS	28 -#define pte_to_pgoff(pte)	(pte_val(pte) >> 4) +#define PTE_FILE_MAX_BITS	26 +#define pte_to_pgoff(pte)	(pte_val(pte) >> 6)  #define pgoff_to_pte(off)	\ -	((pte_t) { ((off) << 4) | _PAGE_INVALID | _PAGE_FILE }) +	((pte_t) { ((off) << 6) | _PAGE_CA_INVALID | _PAGE_FILE | _PAGE_USER })  #endif /*  !defined (__ASSEMBLY__) */ @@ -393,14 +422,6 @@ ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)  extern  void update_mmu_cache(struct vm_area_struct * vma,  			      unsigned long address, pte_t *ptep); -/* - * remap a physical page `pfn' of size `size' with page protection `prot' - * into virtual address `from' - */ - -#define io_remap_pfn_range(vma,from,pfn,size,prot) \ -                remap_pfn_range(vma, from, pfn, size, prot) -  typedef pte_t *pte_addr_t;  #endif /* !defined (__ASSEMBLY__) */ @@ -410,6 +431,10 @@ typedef pte_t *pte_addr_t;  #define __HAVE_ARCH_PTEP_SET_WRPROTECT  #define __HAVE_ARCH_PTEP_MKDIRTY  #define __HAVE_ARCH_PTE_SAME +/* We provide our own get_unmapped_area to cope with + * SHM area cache aliasing for userland. + */ +#define HAVE_ARCH_UNMAPPED_AREA  #include <asm-generic/pgtable.h> diff --git a/arch/xtensa/include/asm/platform.h b/arch/xtensa/include/asm/platform.h index 7d936e58e9b..32e98f27ce9 100644 --- a/arch/xtensa/include/asm/platform.h +++ b/arch/xtensa/include/asm/platform.h @@ -30,11 +30,6 @@ extern void platform_init(bp_tag_t*);  extern void platform_setup (char **);  /* - * platform_init_irq is called from init_IRQ. - */ -extern void platform_init_irq (void); - -/*   * platform_restart is called to restart the system.   */  extern void platform_restart (void); @@ -75,4 +70,3 @@ extern int platform_pcibios_fixup (void);  extern void platform_calibrate_ccount (void);  #endif	/* _XTENSA_PLATFORM_H */ - diff --git a/arch/xtensa/include/asm/poll.h b/arch/xtensa/include/asm/poll.h deleted file mode 100644 index 9d2d5993f06..00000000000 --- a/arch/xtensa/include/asm/poll.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * include/asm-xtensa/poll.h - * - * This file is subject to the terms and conditions of the GNU General - * Public License.  See the file "COPYING" in the main directory of - * this archive for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_POLL_H -#define _XTENSA_POLL_H - -#define POLLWRNORM	POLLOUT -#define POLLWRBAND	0x0100 -#define POLLREMOVE	0x0800 - -#include <asm-generic/poll.h> - -#endif /* _XTENSA_POLL_H */ diff --git a/arch/xtensa/include/asm/posix_types.h b/arch/xtensa/include/asm/posix_types.h deleted file mode 100644 index 43f9dd1126a..00000000000 --- a/arch/xtensa/include/asm/posix_types.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * include/asm-xtensa/posix_types.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Largely copied from include/asm-ppc/posix_types.h - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_POSIX_TYPES_H -#define _XTENSA_POSIX_TYPES_H - -/* - * This file is generally used by user-level software, so you need to - * be a little careful about namespace pollution etc.  Also, we cannot - * assume GCC is being used. - */ - -typedef unsigned long	__kernel_ino_t; -typedef unsigned int	__kernel_mode_t; -typedef unsigned long	__kernel_nlink_t; -typedef long		__kernel_off_t; -typedef int		__kernel_pid_t; -typedef unsigned short	__kernel_ipc_pid_t; -typedef unsigned int	__kernel_uid_t; -typedef unsigned int	__kernel_gid_t; -typedef unsigned int	__kernel_size_t; -typedef int		__kernel_ssize_t; -typedef long		__kernel_ptrdiff_t; -typedef long		__kernel_time_t; -typedef long		__kernel_suseconds_t; -typedef long		__kernel_clock_t; -typedef int		__kernel_timer_t; -typedef int		__kernel_clockid_t; -typedef int		__kernel_daddr_t; -typedef char *		__kernel_caddr_t; -typedef unsigned short	__kernel_uid16_t; -typedef unsigned short	__kernel_gid16_t; -typedef unsigned int	__kernel_uid32_t; -typedef unsigned int	__kernel_gid32_t; - -typedef unsigned short	__kernel_old_uid_t; -typedef unsigned short	__kernel_old_gid_t; -typedef unsigned short	__kernel_old_dev_t; - -#ifdef __GNUC__ -typedef long long	__kernel_loff_t; -#endif - -typedef struct { -	int	val[2]; -} __kernel_fsid_t; - -#ifndef __GNUC__ - -#define	__FD_SET(d, set)	((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) -#define	__FD_CLR(d, set)	((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) -#define	__FD_ISSET(d, set)	((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) -#define	__FD_ZERO(set)	\ -  ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) - -#else /* __GNUC__ */ - -#if defined(__KERNEL__) -/* With GNU C, use inline functions instead so args are evaluated only once: */ - -#undef __FD_SET -static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] |= (1UL<<_rem); -} - -#undef __FD_CLR -static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); -} - -#undef __FD_ISSET -static __inline__ int __FD_ISSET(unsigned long fd, __kernel_fd_set *p) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; -} - -/* - * This will unroll the loop for the normal constant case (8 ints, - * for a 256-bit fd_set) - */ -#undef __FD_ZERO -static __inline__ void __FD_ZERO(__kernel_fd_set *p) -{ -	unsigned int *tmp = (unsigned int *)p->fds_bits; -	int i; - -	if (__builtin_constant_p(__FDSET_LONGS)) { -		switch (__FDSET_LONGS) { -			case 8: -				tmp[0] = 0; tmp[1] = 0; tmp[2] = 0; tmp[3] = 0; -				tmp[4] = 0; tmp[5] = 0; tmp[6] = 0; tmp[7] = 0; -				return; -		} -	} -	i = __FDSET_LONGS; -	while (i) { -		i--; -		*tmp = 0; -		tmp++; -	} -} - -#endif /* defined(__KERNEL__) */ -#endif /* __GNUC__ */ -#endif /* _XTENSA_POSIX_TYPES_H */ diff --git a/arch/xtensa/include/asm/processor.h b/arch/xtensa/include/asm/processor.h index 3acb26e8dea..abb59708a3b 100644 --- a/arch/xtensa/include/asm/processor.h +++ b/arch/xtensa/include/asm/processor.h @@ -5,7 +5,7 @@   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2008 Tensilica Inc.   */  #ifndef _XTENSA_PROCESSOR_H @@ -68,7 +68,7 @@  /* LOCKLEVEL defines the interrupt level that masks all   * general-purpose interrupts.   */ -#define LOCKLEVEL 1 +#define LOCKLEVEL XCHAL_EXCM_LEVEL  /* WSBITS and WBBITS are the width of the WINDOWSTART and WINDOWBASE   * registers @@ -89,7 +89,7 @@  #define MAKE_PC_FROM_RA(ra,sp)    (((ra) & 0x3fffffff) | ((sp) & 0xc0000000))  typedef struct { -    unsigned long seg; +	unsigned long seg;  } mm_segment_t;  struct thread_struct { @@ -145,13 +145,14 @@ struct thread_struct {   *       set_thread_state in signal.c depends on it.   */  #define USER_PS_VALUE ((1 << PS_WOE_BIT) |				\ -                       (1 << PS_CALLINC_SHIFT) |			\ -                       (USER_RING << PS_RING_SHIFT) |			\ -                       (1 << PS_UM_BIT) |				\ -                       (1 << PS_EXCM_BIT)) +		       (1 << PS_CALLINC_SHIFT) |			\ +		       (USER_RING << PS_RING_SHIFT) |			\ +		       (1 << PS_UM_BIT) |				\ +		       (1 << PS_EXCM_BIT))  /* Clearing a0 terminates the backtrace. */  #define start_thread(regs, new_pc, new_sp) \ +	memset(regs, 0, sizeof(*regs)); \  	regs->pc = new_pc; \  	regs->ps = USER_PS_VALUE; \  	regs->areg[1] = new_sp; \ @@ -168,12 +169,6 @@ struct mm_struct;  /* Free all resources held by a thread. */  #define release_thread(thread) do { } while(0) -/* Prepare to copy thread state - unlazy all lazy status */ -extern void prepare_to_copy(struct task_struct*); - -/* Create a kernel thread without removing it from tasklists */ -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -  /* Copy and release all segment info associated with a VM */  #define copy_segments(p, mm)	do { } while(0)  #define release_segments(mm)	do { } while(0) @@ -196,5 +191,25 @@ extern unsigned long get_wchan(struct task_struct *p);  #define set_sr(x,sr) ({unsigned int v=(unsigned int)x; WSR(v,sr);})  #define get_sr(sr) ({unsigned int v; RSR(v,sr); v; }) +#ifndef XCHAL_HAVE_EXTERN_REGS +#define XCHAL_HAVE_EXTERN_REGS 0 +#endif + +#if XCHAL_HAVE_EXTERN_REGS + +static inline void set_er(unsigned long value, unsigned long addr) +{ +	asm volatile ("wer %0, %1" : : "a" (value), "a" (addr) : "memory"); +} + +static inline unsigned long get_er(unsigned long addr) +{ +	register unsigned long value; +	asm volatile ("rer %0, %1" : "=a" (value) : "a" (addr) : "memory"); +	return value; +} + +#endif /* XCHAL_HAVE_EXTERN_REGS */ +  #endif	/* __ASSEMBLY__ */  #endif	/* _XTENSA_PROCESSOR_H */ diff --git a/arch/xtensa/include/asm/ptrace.h b/arch/xtensa/include/asm/ptrace.h index 0d42c934b66..598e752dcbc 100644 --- a/arch/xtensa/include/asm/ptrace.h +++ b/arch/xtensa/include/asm/ptrace.h @@ -7,73 +7,11 @@   *   * Copyright (C) 2001 - 2005 Tensilica Inc.   */ -  #ifndef _XTENSA_PTRACE_H  #define _XTENSA_PTRACE_H -/* - * Kernel stack - * - * 		+-----------------------+  -------- STACK_SIZE - * 		|     register file     |  | - * 		+-----------------------+  | - * 		|    struct pt_regs     |  | - * 		+-----------------------+  | ------ PT_REGS_OFFSET - * double 	:  16 bytes spill area  :  |  ^ - * excetion 	:- - - - - - - - - - - -:  |  | - * frame	:    struct pt_regs     :  |  | - * 		:- - - - - - - - - - - -:  |  | - * 		|                       |  |  | - * 		|     memory stack      |  |  | - * 		|                       |  |  | - * 		~                       ~  ~  ~ - * 		~                       ~  ~  ~ - * 		|                       |  |  | - * 		|                       |  |  | - * 		+-----------------------+  |  | --- STACK_BIAS - * 		|  struct task_struct   |  |  |  ^ - *  current --> +-----------------------+  |  |  | - * 		|  struct thread_info   |  |  |  | - *		+-----------------------+ -------- - */ - -#define KERNEL_STACK_SIZE (2 * PAGE_SIZE) - -/*  Offsets for exception_handlers[] (3 x 64-entries x 4-byte tables). */ - -#define EXC_TABLE_KSTK		0x004	/* Kernel Stack */ -#define EXC_TABLE_DOUBLE_SAVE	0x008	/* Double exception save area for a0 */ -#define EXC_TABLE_FIXUP		0x00c	/* Fixup handler */ -#define EXC_TABLE_PARAM		0x010	/* For passing a parameter to fixup */ -#define EXC_TABLE_SYSCALL_SAVE	0x014	/* For fast syscall handler */ -#define EXC_TABLE_FAST_USER	0x100	/* Fast user exception handler */ -#define EXC_TABLE_FAST_KERNEL	0x200	/* Fast kernel exception handler */ -#define EXC_TABLE_DEFAULT	0x300	/* Default C-Handler */ -#define EXC_TABLE_SIZE		0x400 +#include <uapi/asm/ptrace.h> -/* Registers used by strace */ - -#define REG_A_BASE	0x0000 -#define REG_AR_BASE	0x0100 -#define REG_PC		0x0020 -#define REG_PS		0x02e6 -#define REG_WB		0x0248 -#define REG_WS		0x0249 -#define REG_LBEG	0x0200 -#define REG_LEND	0x0201 -#define REG_LCOUNT	0x0202 -#define REG_SAR		0x0203 - -#define SYSCALL_NR	0x00ff - -/* Other PTRACE_ values defined in <linux/ptrace.h> using values 0-9,16,17,24 */ - -#define PTRACE_GETREGS		12 -#define PTRACE_SETREGS		13 -#define PTRACE_GETXTREGS	18 -#define PTRACE_SETXTREGS	19 - -#ifdef __KERNEL__  #ifndef __ASSEMBLY__ @@ -99,7 +37,8 @@ struct pt_regs {  	unsigned long windowstart;	/*  52 */  	unsigned long syscall;		/*  56 */  	unsigned long icountlevel;	/*  60 */ -	int reserved[1];		/*  64 */ +	unsigned long scompare1;	/*  64 */ +	unsigned long threadptr;	/*  68 */  	/* Additional configurable registers that are used by the compiler. */  	xtregs_opt_t xtregs_opt; @@ -110,22 +49,31 @@ struct pt_regs {  	/* current register frame.  	 * Note: The ESF for kernel exceptions ends after 16 registers!  	 */ -	unsigned long areg[16];		/* 128 (64) */ +	unsigned long areg[16];  };  #include <variant/core.h>  # define arch_has_single_step()	(1)  # define task_pt_regs(tsk) ((struct pt_regs*) \ -  (task_stack_page(tsk) + KERNEL_STACK_SIZE - (XCHAL_NUM_AREGS-16)*4) - 1) +	(task_stack_page(tsk) + KERNEL_STACK_SIZE - (XCHAL_NUM_AREGS-16)*4) - 1)  # define user_mode(regs) (((regs)->ps & 0x00000020)!=0)  # define instruction_pointer(regs) ((regs)->pc) -extern void show_regs(struct pt_regs *); +# define return_pointer(regs) (MAKE_PC_FROM_RA((regs)->areg[0], \ +					       (regs)->areg[1]))  # ifndef CONFIG_SMP  #  define profile_pc(regs) instruction_pointer(regs) +# else +#  define profile_pc(regs)						\ +	({								\ +		in_lock_functions(instruction_pointer(regs)) ?		\ +		return_pointer(regs) : instruction_pointer(regs);	\ +	})  # endif +#define user_stack_pointer(regs) ((regs)->areg[1]) +  #else	/* __ASSEMBLY__ */  # include <asm/asm-offsets.h> @@ -133,6 +81,4 @@ extern void show_regs(struct pt_regs *);  #endif	/* !__ASSEMBLY__ */ -#endif  /* __KERNEL__ */ -  #endif	/* _XTENSA_PTRACE_H */ diff --git a/arch/xtensa/include/asm/regs.h b/arch/xtensa/include/asm/regs.h index d4baed24692..4ba9f516b0e 100644 --- a/arch/xtensa/include/asm/regs.h +++ b/arch/xtensa/include/asm/regs.h @@ -27,52 +27,15 @@  /*  Special registers.  */ -#define LBEG		0 -#define LEND		1 -#define LCOUNT		2 -#define SAR		3 -#define BR		4 -#define SCOMPARE1	12 -#define ACCHI		16 -#define ACCLO		17 -#define MR		32 -#define WINDOWBASE	72 -#define WINDOWSTART	73 -#define PTEVADDR	83 -#define RASID		90 -#define ITLBCFG		91 -#define DTLBCFG		92 -#define IBREAKENABLE	96 -#define DDR		104 -#define IBREAKA		128 -#define DBREAKA		144 -#define DBREAKC		160 -#define EPC		176 -#define EPC_1		177 -#define DEPC		192 -#define EPS		192 -#define EPS_1		193 -#define EXCSAVE		208 -#define EXCSAVE_1	209 -#define INTERRUPT	226 -#define INTENABLE	228 -#define PS		230 -#define THREADPTR	231 -#define EXCCAUSE	232 -#define DEBUGCAUSE	233 -#define CCOUNT		234 -#define PRID		235 -#define ICOUNT		236 -#define ICOUNTLEVEL	237 -#define EXCVADDR	238 -#define CCOMPARE	240 -#define MISC		244 - -/*  Special names for read-only and write-only interrupt registers.  */ - -#define INTREAD		226 -#define INTSET		226 -#define INTCLEAR	227 +#define SREG_MR			32 +#define SREG_IBREAKA		128 +#define SREG_DBREAKA		144 +#define SREG_DBREAKC		160 +#define SREG_EPC		176 +#define SREG_EPS		192 +#define SREG_EXCSAVE		208 +#define SREG_CCOMPARE		240 +#define SREG_MISC		244  /*  EXCCAUSE register fields  */ @@ -89,6 +52,10 @@  #define EXCCAUSE_SPECULATION			7  #define EXCCAUSE_PRIVILEGED			8  #define EXCCAUSE_UNALIGNED			9 +#define EXCCAUSE_INSTR_DATA_ERROR		12 +#define EXCCAUSE_LOAD_STORE_DATA_ERROR		13 +#define EXCCAUSE_INSTR_ADDR_ERROR		14 +#define EXCCAUSE_LOAD_STORE_ADDR_ERROR		15  #define EXCCAUSE_ITLB_MISS			16  #define EXCCAUSE_ITLB_MULTIHIT			17  #define EXCCAUSE_ITLB_PRIVILEGE			18 @@ -115,12 +82,14 @@  #define PS_CALLINC_SHIFT	16  #define PS_CALLINC_MASK		0x00030000  #define PS_OWB_SHIFT		8 +#define PS_OWB_WIDTH		4  #define PS_OWB_MASK		0x00000F00  #define PS_RING_SHIFT		6  #define PS_RING_MASK		0x000000C0  #define PS_UM_BIT		5  #define PS_EXCM_BIT		4  #define PS_INTLEVEL_SHIFT	0 +#define PS_INTLEVEL_WIDTH	4  #define PS_INTLEVEL_MASK	0x0000000F  /*  DBREAKCn register fields.  */ @@ -142,4 +111,3 @@  #define DEBUGCAUSE_ICOUNT_BIT		0	/* ICOUNT would incr. to zero */  #endif /* _XTENSA_SPECREG_H */ - diff --git a/arch/xtensa/include/asm/resource.h b/arch/xtensa/include/asm/resource.h deleted file mode 100644 index 17b5ab31177..00000000000 --- a/arch/xtensa/include/asm/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/resource.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_RESOURCE_H -#define _XTENSA_RESOURCE_H - -#include <asm-generic/resource.h> - -#endif	/* _XTENSA_RESOURCE_H */ diff --git a/arch/xtensa/include/asm/rmap.h b/arch/xtensa/include/asm/rmap.h deleted file mode 100644 index 649588b7e9a..00000000000 --- a/arch/xtensa/include/asm/rmap.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/rmap.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_RMAP_H -#define _XTENSA_RMAP_H - -#include <asm-generic/rmap.h> - -#endif diff --git a/arch/xtensa/include/asm/rwsem.h b/arch/xtensa/include/asm/rwsem.h index e39edf5c86f..249619e7e7f 100644 --- a/arch/xtensa/include/asm/rwsem.h +++ b/arch/xtensa/include/asm/rwsem.h @@ -17,44 +17,12 @@  #error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead."  #endif -#include <linux/list.h> -#include <linux/spinlock.h> -#include <asm/atomic.h> -#include <asm/system.h> - -/* - * the semaphore definition - */ -struct rw_semaphore { -	signed long		count;  #define RWSEM_UNLOCKED_VALUE		0x00000000  #define RWSEM_ACTIVE_BIAS		0x00000001  #define RWSEM_ACTIVE_MASK		0x0000ffff  #define RWSEM_WAITING_BIAS		(-0x00010000)  #define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS  #define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) -	spinlock_t		wait_lock; -	struct list_head	wait_list; -}; - -#define __RWSEM_INITIALIZER(name) \ -	{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, \ -	  LIST_HEAD_INIT((name).wait_list) } - -#define DECLARE_RWSEM(name)		\ -	struct rw_semaphore name = __RWSEM_INITIALIZER(name) - -extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); - -static inline void init_rwsem(struct rw_semaphore *sem) -{ -	sem->count = RWSEM_UNLOCKED_VALUE; -	spin_lock_init(&sem->wait_lock); -	INIT_LIST_HEAD(&sem->wait_list); -}  /*   * lock for reading @@ -160,9 +128,4 @@ static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem)  	return atomic_add_return(delta, (atomic_t *)(&sem->count));  } -static inline int rwsem_is_locked(struct rw_semaphore *sem) -{ -	return (sem->count != 0); -} -  #endif	/* _XTENSA_RWSEM_H */ diff --git a/arch/xtensa/include/asm/scatterlist.h b/arch/xtensa/include/asm/scatterlist.h deleted file mode 100644 index a0421a61d9e..00000000000 --- a/arch/xtensa/include/asm/scatterlist.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/scatterlist.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SCATTERLIST_H -#define _XTENSA_SCATTERLIST_H - -#include <asm-generic/scatterlist.h> - -#endif	/* _XTENSA_SCATTERLIST_H */ diff --git a/arch/xtensa/include/asm/sections.h b/arch/xtensa/include/asm/sections.h deleted file mode 100644 index 40b5191b55a..00000000000 --- a/arch/xtensa/include/asm/sections.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/sections.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SECTIONS_H -#define _XTENSA_SECTIONS_H - -#include <asm-generic/sections.h> - -#endif	/* _XTENSA_SECTIONS_H */ diff --git a/arch/xtensa/include/asm/sembuf.h b/arch/xtensa/include/asm/sembuf.h deleted file mode 100644 index c15870493b3..00000000000 --- a/arch/xtensa/include/asm/sembuf.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * include/asm-xtensa/sembuf.h - * - * The semid64_ds structure for Xtensa architecture. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - * - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - * - */ - -#ifndef _XTENSA_SEMBUF_H -#define _XTENSA_SEMBUF_H - -#include <asm/byteorder.h> - -struct semid64_ds { -	struct ipc64_perm sem_perm;		/* permissions .. see ipc.h */ -#ifdef __XTENSA_EL__ -	__kernel_time_t	sem_otime;		/* last semop time */ -	unsigned long	__unused1; -	__kernel_time_t	sem_ctime;		/* last change time */ -	unsigned long	__unused2; -#else -	unsigned long	__unused1; -	__kernel_time_t	sem_otime;		/* last semop time */ -	unsigned long	__unused2; -	__kernel_time_t	sem_ctime;		/* last change time */ -#endif -	unsigned long	sem_nsems;		/* no. of semaphores in array */ -	unsigned long	__unused3; -	unsigned long	__unused4; -}; - -#endif /* __ASM_XTENSA_SEMBUF_H */ diff --git a/arch/xtensa/include/asm/setup.h b/arch/xtensa/include/asm/setup.h deleted file mode 100644 index e3636520d8c..00000000000 --- a/arch/xtensa/include/asm/setup.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/setup.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SETUP_H -#define _XTENSA_SETUP_H - -#define COMMAND_LINE_SIZE	256 - -#endif diff --git a/arch/xtensa/include/asm/shmbuf.h b/arch/xtensa/include/asm/shmbuf.h deleted file mode 100644 index ad4b0121782..00000000000 --- a/arch/xtensa/include/asm/shmbuf.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * include/asm-xtensa/shmbuf.h - * - * The shmid64_ds structure for Xtensa architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 64-bit time_t to solve y2038 problem - * - 2 miscellaneous 32-bit values - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SHMBUF_H -#define _XTENSA_SHMBUF_H - -#if defined (__XTENSA_EL__) -struct shmid64_ds { -	struct ipc64_perm	shm_perm;	/* operation perms */ -	size_t			shm_segsz;	/* size of segment (bytes) */ -	__kernel_time_t		shm_atime;	/* last attach time */ -	unsigned long		__unused1; -	__kernel_time_t		shm_dtime;	/* last detach time */ -	unsigned long		__unused2; -	__kernel_time_t		shm_ctime;	/* last change time */ -	unsigned long		__unused3; -	__kernel_pid_t		shm_cpid;	/* pid of creator */ -	__kernel_pid_t		shm_lpid;	/* pid of last operator */ -	unsigned long		shm_nattch;	/* no. of current attaches */ -	unsigned long		__unused4; -	unsigned long		__unused5; -}; -#elif defined (__XTENSA_EB__) -struct shmid64_ds { -	struct ipc64_perm	shm_perm;	/* operation perms */ -	size_t			shm_segsz;	/* size of segment (bytes) */ -	__kernel_time_t		shm_atime;	/* last attach time */ -	unsigned long		__unused1; -	__kernel_time_t		shm_dtime;	/* last detach time */ -	unsigned long		__unused2; -	__kernel_time_t		shm_ctime;	/* last change time */ -	unsigned long		__unused3; -	__kernel_pid_t		shm_cpid;	/* pid of creator */ -	__kernel_pid_t		shm_lpid;	/* pid of last operator */ -	unsigned long		shm_nattch;	/* no. of current attaches */ -	unsigned long		__unused4; -	unsigned long		__unused5; -}; -#else -# error endian order not defined -#endif - - -struct shminfo64 { -	unsigned long	shmmax; -	unsigned long	shmmin; -	unsigned long	shmmni; -	unsigned long	shmseg; -	unsigned long	shmall; -	unsigned long	__unused1; -	unsigned long	__unused2; -	unsigned long	__unused3; -	unsigned long	__unused4; -}; - -#endif	/* _XTENSA_SHMBUF_H */ diff --git a/arch/xtensa/include/asm/sigcontext.h b/arch/xtensa/include/asm/sigcontext.h deleted file mode 100644 index 03383af8c3b..00000000000 --- a/arch/xtensa/include/asm/sigcontext.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * include/asm-xtensa/sigcontext.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2007 Tensilica Inc. - */ - -#ifndef _XTENSA_SIGCONTEXT_H -#define _XTENSA_SIGCONTEXT_H - - -struct sigcontext { -	unsigned long sc_pc; -	unsigned long sc_ps; -	unsigned long sc_lbeg; -	unsigned long sc_lend; -	unsigned long sc_lcount; -	unsigned long sc_sar; -	unsigned long sc_acclo; -	unsigned long sc_acchi; -	unsigned long sc_a[16]; -	void *sc_xtregs; -}; - -#endif /* _XTENSA_SIGCONTEXT_H */ diff --git a/arch/xtensa/include/asm/siginfo.h b/arch/xtensa/include/asm/siginfo.h deleted file mode 100644 index 6916248295d..00000000000 --- a/arch/xtensa/include/asm/siginfo.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/siginfo.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SIGINFO_H -#define _XTENSA_SIGINFO_H - -#include <asm-generic/siginfo.h> - -#endif	/* _XTENSA_SIGINFO_H */ diff --git a/arch/xtensa/include/asm/signal.h b/arch/xtensa/include/asm/signal.h index 633ba73bc4d..de169b4eaee 100644 --- a/arch/xtensa/include/asm/signal.h +++ b/arch/xtensa/include/asm/signal.h @@ -9,164 +9,15 @@   *   * Copyright (C) 2001 - 2005 Tensilica Inc.   */ -  #ifndef _XTENSA_SIGNAL_H  #define _XTENSA_SIGNAL_H - -#define _NSIG		64 -#define _NSIG_BPW	32 -#define _NSIG_WORDS	(_NSIG / _NSIG_BPW) - -#ifndef __ASSEMBLY__ - -#include <linux/types.h> - -/* Avoid too many header ordering problems.  */ -struct siginfo; -typedef unsigned long old_sigset_t;		/* at least 32 bits */ -typedef struct { -	unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -#endif - -#define SIGHUP		 1 -#define SIGINT		 2 -#define SIGQUIT		 3 -#define SIGILL		 4 -#define SIGTRAP		 5 -#define SIGABRT		 6 -#define SIGIOT		 6 -#define SIGBUS		 7 -#define SIGFPE		 8 -#define SIGKILL		 9 -#define SIGUSR1		10 -#define SIGSEGV		11 -#define SIGUSR2		12 -#define SIGPIPE		13 -#define SIGALRM		14 -#define SIGTERM		15 -#define SIGSTKFLT	16 -#define SIGCHLD		17 -#define SIGCONT		18 -#define SIGSTOP		19 -#define SIGTSTP		20 -#define SIGTTIN		21 -#define SIGTTOU		22 -#define SIGURG		23 -#define SIGXCPU		24 -#define SIGXFSZ		25 -#define SIGVTALRM	26 -#define SIGPROF		27 -#define SIGWINCH	28 -#define SIGIO		29 -#define SIGPOLL		SIGIO -/* #define SIGLOST		29 */ -#define SIGPWR		30 -#define SIGSYS		31 -#define	SIGUNUSED	31 - -/* These should not be considered constants from userland.  */ -#define SIGRTMIN	32 -#define SIGRTMAX	(_NSIG-1) - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP	0x00000001 -#define SA_NOCLDWAIT	0x00000002 /* not supported yet */ -#define SA_SIGINFO	0x00000004 -#define SA_ONSTACK	0x08000000 -#define SA_RESTART	0x10000000 -#define SA_NODEFER	0x40000000 -#define SA_RESETHAND	0x80000000 - -#define SA_NOMASK	SA_NODEFER -#define SA_ONESHOT	SA_RESETHAND - -#define SA_RESTORER	0x04000000 - -/* - * sigaltstack controls - */ -#define SS_ONSTACK	1 -#define SS_DISABLE	2 - -#define MINSIGSTKSZ	2048 -#define SIGSTKSZ	8192 +#include <uapi/asm/signal.h>  #ifndef __ASSEMBLY__ +#define __ARCH_HAS_SA_RESTORER -#define SIG_BLOCK          0	/* for blocking signals */ -#define SIG_UNBLOCK        1	/* for unblocking signals */ -#define SIG_SETMASK        2	/* for setting the signal mask */ - -/* Type of a signal handler.  */ -typedef void (*__sighandler_t)(int); - -#define SIG_DFL	((__sighandler_t)0)	/* default signal handling */ -#define SIG_IGN	((__sighandler_t)1)	/* ignore signal */ -#define SIG_ERR	((__sighandler_t)-1)	/* error return from signal */ - -#ifdef __KERNEL__ -struct old_sigaction { -	__sighandler_t sa_handler; -	old_sigset_t sa_mask; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -}; - -struct sigaction { -	__sighandler_t sa_handler; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -	sigset_t sa_mask;		/* mask last for extensibility */ -}; - -struct k_sigaction { -	struct sigaction sa; -}; - -#else - -/* Here we must cater to libcs that poke about in kernel headers.  */ - -struct sigaction { -	union { -	  __sighandler_t _sa_handler; -	  void (*_sa_sigaction)(int, struct siginfo *, void *); -	} _u; -	sigset_t sa_mask; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -}; - -#define sa_handler	_u._sa_handler -#define sa_sigaction	_u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { -	void *ss_sp; -	int ss_flags; -	size_t ss_size; -} stack_t; - -#ifdef __KERNEL__  #include <asm/sigcontext.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0) -#endif	/* __KERNEL__ */  #endif	/* __ASSEMBLY__ */  #endif	/* _XTENSA_SIGNAL_H */ diff --git a/arch/xtensa/include/asm/smp.h b/arch/xtensa/include/asm/smp.h index 83c569e3bdb..4e43f564389 100644 --- a/arch/xtensa/include/asm/smp.h +++ b/arch/xtensa/include/asm/smp.h @@ -1,27 +1,43 @@  /* - * include/asm-xtensa/smp.h - *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_SMP_H  #define _XTENSA_SMP_H -extern struct xtensa_cpuinfo boot_cpu_data; +#ifdef CONFIG_SMP -#define cpu_data (&boot_cpu_data) -#define current_cpu_data boot_cpu_data +#define raw_smp_processor_id()	(current_thread_info()->cpu) +#define cpu_logical_map(cpu)	(cpu) -struct xtensa_cpuinfo { -	unsigned long	*pgd_cache; -	unsigned long	*pte_cache; -	unsigned long	pgtable_cache_sz; +struct start_info { +	unsigned long stack;  }; +extern struct start_info start_info; -#define cpu_logical_map(cpu)	(cpu) +struct cpumask; +void arch_send_call_function_ipi_mask(const struct cpumask *mask); +void arch_send_call_function_single_ipi(int cpu); + +void smp_init_cpus(void); +void secondary_init_irq(void); +void ipi_init(void); +struct seq_file; +void show_ipi_list(struct seq_file *p, int prec); + +#ifdef CONFIG_HOTPLUG_CPU + +void __cpu_die(unsigned int cpu); +int __cpu_disable(void); +void cpu_die(void); +void cpu_restart(void); + +#endif /* CONFIG_HOTPLUG_CPU */ + +#endif /* CONFIG_SMP */  #endif	/* _XTENSA_SMP_H */ diff --git a/arch/xtensa/include/asm/socket.h b/arch/xtensa/include/asm/socket.h deleted file mode 100644 index cbdf2ffaacf..00000000000 --- a/arch/xtensa/include/asm/socket.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * include/asm-xtensa/socket.h - * - * Copied from i386. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _XTENSA_SOCKET_H -#define _XTENSA_SOCKET_H - -#include <asm/sockios.h> - -/* For setsockoptions(2) */ -#define SOL_SOCKET	1 - -#define SO_DEBUG	1 -#define SO_REUSEADDR	2 -#define SO_TYPE		3 -#define SO_ERROR	4 -#define SO_DONTROUTE	5 -#define SO_BROADCAST	6 -#define SO_SNDBUF	7 -#define SO_RCVBUF	8 -#define SO_SNDBUFFORCE	32 -#define SO_RCVBUFFORCE	33 -#define SO_KEEPALIVE	9 -#define SO_OOBINLINE	10 -#define SO_NO_CHECK	11 -#define SO_PRIORITY	12 -#define SO_LINGER	13 -#define SO_BSDCOMPAT	14 -/* To add :#define SO_REUSEPORT 15 */ -#define SO_PASSCRED	16 -#define SO_PEERCRED	17 -#define SO_RCVLOWAT	18 -#define SO_SNDLOWAT	19 -#define SO_RCVTIMEO	20 -#define SO_SNDTIMEO	21 - -/* Security levels - as per NRL IPv6 - don't actually do anything */ - -#define SO_SECURITY_AUTHENTICATION		22 -#define SO_SECURITY_ENCRYPTION_TRANSPORT	23 -#define SO_SECURITY_ENCRYPTION_NETWORK		24 - -#define SO_BINDTODEVICE	25 - -/* Socket filtering */ - -#define SO_ATTACH_FILTER        26 -#define SO_DETACH_FILTER        27 - -#define SO_PEERNAME		28 -#define SO_TIMESTAMP		29 -#define SCM_TIMESTAMP		SO_TIMESTAMP - -#define SO_ACCEPTCONN		30 -#define SO_PEERSEC		31 -#define SO_PASSSEC		34 -#define SO_TIMESTAMPNS		35 -#define SCM_TIMESTAMPNS		SO_TIMESTAMPNS - -#define SO_MARK			36 - -#define SO_TIMESTAMPING		37 -#define SCM_TIMESTAMPING	SO_TIMESTAMPING - -#define SO_PROTOCOL		38 -#define SO_DOMAIN		39 - -#define SO_RXQ_OVFL             40 - -#endif	/* _XTENSA_SOCKET_H */ diff --git a/arch/xtensa/include/asm/sockios.h b/arch/xtensa/include/asm/sockios.h deleted file mode 100644 index efe0af379f0..00000000000 --- a/arch/xtensa/include/asm/sockios.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * include/asm-xtensa/sockios.h - * - * Socket-level I/O control calls.  Copied from MIPS. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1995 by Ralf Baechle - * Copyright (C) 2001 Tensilica Inc. - */ - -#ifndef _XTENSA_SOCKIOS_H -#define _XTENSA_SOCKIOS_H - -#include <asm/ioctl.h> - -/* Socket-level I/O control calls. */ - -#define FIOGETOWN	_IOR('f', 123, int) -#define FIOSETOWN 	_IOW('f', 124, int) - -#define SIOCATMARK	_IOR('s', 7, int) -#define SIOCSPGRP	_IOW('s', 8, pid_t) -#define SIOCGPGRP	_IOR('s', 9, pid_t) - -#define SIOCGSTAMP	0x8906		/* Get stamp (timeval) */ -#define SIOCGSTAMPNS	0x8907		/* Get stamp (timespec) */ - -#endif	/* _XTENSA_SOCKIOS_H */ diff --git a/arch/xtensa/include/asm/spinlock.h b/arch/xtensa/include/asm/spinlock.h index 8ff23649581..1d95fa5dcd1 100644 --- a/arch/xtensa/include/asm/spinlock.h +++ b/arch/xtensa/include/asm/spinlock.h @@ -11,6 +11,195 @@  #ifndef _XTENSA_SPINLOCK_H  #define _XTENSA_SPINLOCK_H -#include <linux/spinlock.h> +/* + * spinlock + * + * There is at most one owner of a spinlock.  There are not different + * types of spinlock owners like there are for rwlocks (see below). + * + * When trying to obtain a spinlock, the function "spins" forever, or busy- + * waits, until the lock is obtained.  When spinning, presumably some other + * owner will soon give up the spinlock making it available to others.  Use + * the trylock functions to avoid spinning forever. + * + * possible values: + * + *    0         nobody owns the spinlock + *    1         somebody owns the spinlock + */ + +#define arch_spin_is_locked(x) ((x)->slock != 0) +#define arch_spin_unlock_wait(lock) \ +	do { while (arch_spin_is_locked(lock)) cpu_relax(); } while (0) + +#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock) + +static inline void arch_spin_lock(arch_spinlock_t *lock) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       wsr     %0, scompare1\n" +			"1:     movi    %0, 1\n" +			"       s32c1i  %0, %1, 0\n" +			"       bnez    %0, 1b\n" +			: "=&a" (tmp) +			: "a" (&lock->slock) +			: "memory"); +} + +/* Returns 1 if the lock is obtained, 0 otherwise. */ + +static inline int arch_spin_trylock(arch_spinlock_t *lock) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       wsr     %0, scompare1\n" +			"       movi    %0, 1\n" +			"       s32c1i  %0, %1, 0\n" +			: "=&a" (tmp) +			: "a" (&lock->slock) +			: "memory"); + +	return tmp == 0 ? 1 : 0; +} + +static inline void arch_spin_unlock(arch_spinlock_t *lock) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       s32ri   %0, %1, 0\n" +			: "=&a" (tmp) +			: "a" (&lock->slock) +			: "memory"); +} + +/* + * rwlock + * + * Read-write locks are really a more flexible spinlock.  They allow + * multiple readers but only one writer.  Write ownership is exclusive + * (i.e., all other readers and writers are blocked from ownership while + * there is a write owner).  These rwlocks are unfair to writers.  Writers + * can be starved for an indefinite time by readers. + * + * possible values: + * + *   0          nobody owns the rwlock + *  >0          one or more readers own the rwlock + *                (the positive value is the actual number of readers) + *  0x80000000  one writer owns the rwlock, no other writers, no readers + */ + +#define arch_write_can_lock(x)  ((x)->lock == 0) + +static inline void arch_write_lock(arch_rwlock_t *rw) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       wsr     %0, scompare1\n" +			"1:     movi    %0, 1\n" +			"       slli    %0, %0, 31\n" +			"       s32c1i  %0, %1, 0\n" +			"       bnez    %0, 1b\n" +			: "=&a" (tmp) +			: "a" (&rw->lock) +			: "memory"); +} + +/* Returns 1 if the lock is obtained, 0 otherwise. */ + +static inline int arch_write_trylock(arch_rwlock_t *rw) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       wsr     %0, scompare1\n" +			"       movi    %0, 1\n" +			"       slli    %0, %0, 31\n" +			"       s32c1i  %0, %1, 0\n" +			: "=&a" (tmp) +			: "a" (&rw->lock) +			: "memory"); + +	return tmp == 0 ? 1 : 0; +} + +static inline void arch_write_unlock(arch_rwlock_t *rw) +{ +	unsigned long tmp; + +	__asm__ __volatile__( +			"       movi    %0, 0\n" +			"       s32ri   %0, %1, 0\n" +			: "=&a" (tmp) +			: "a" (&rw->lock) +			: "memory"); +} + +static inline void arch_read_lock(arch_rwlock_t *rw) +{ +	unsigned long tmp; +	unsigned long result; + +	__asm__ __volatile__( +			"1:     l32i    %1, %2, 0\n" +			"       bltz    %1, 1b\n" +			"       wsr     %1, scompare1\n" +			"       addi    %0, %1, 1\n" +			"       s32c1i  %0, %2, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (&rw->lock) +			: "memory"); +} + +/* Returns 1 if the lock is obtained, 0 otherwise. */ + +static inline int arch_read_trylock(arch_rwlock_t *rw) +{ +	unsigned long result; +	unsigned long tmp; + +	__asm__ __volatile__( +			"       l32i    %1, %2, 0\n" +			"       addi    %0, %1, 1\n" +			"       bltz    %0, 1f\n" +			"       wsr     %1, scompare1\n" +			"       s32c1i  %0, %2, 0\n" +			"       sub     %0, %0, %1\n" +			"1:\n" +			: "=&a" (result), "=&a" (tmp) +			: "a" (&rw->lock) +			: "memory"); + +	return result == 0; +} + +static inline void arch_read_unlock(arch_rwlock_t *rw) +{ +	unsigned long tmp1, tmp2; + +	__asm__ __volatile__( +			"1:     l32i    %1, %2, 0\n" +			"       addi    %0, %1, -1\n" +			"       wsr     %1, scompare1\n" +			"       s32c1i  %0, %2, 0\n" +			"       bne     %0, %1, 1b\n" +			: "=&a" (tmp1), "=&a" (tmp2) +			: "a" (&rw->lock) +			: "memory"); +} + +#define arch_read_lock_flags(lock, flags)	arch_read_lock(lock) +#define arch_write_lock_flags(lock, flags)	arch_write_lock(lock)  #endif	/* _XTENSA_SPINLOCK_H */ diff --git a/arch/xtensa/include/asm/spinlock_types.h b/arch/xtensa/include/asm/spinlock_types.h new file mode 100644 index 00000000000..7ec5ce10c9e --- /dev/null +++ b/arch/xtensa/include/asm/spinlock_types.h @@ -0,0 +1,20 @@ +#ifndef __ASM_SPINLOCK_TYPES_H +#define __ASM_SPINLOCK_TYPES_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +# error "please don't include this file directly" +#endif + +typedef struct { +	volatile unsigned int slock; +} arch_spinlock_t; + +#define __ARCH_SPIN_LOCK_UNLOCKED	{ 0 } + +typedef struct { +	volatile unsigned int lock; +} arch_rwlock_t; + +#define __ARCH_RW_LOCK_UNLOCKED		{ 0 } + +#endif diff --git a/arch/xtensa/include/asm/stacktrace.h b/arch/xtensa/include/asm/stacktrace.h new file mode 100644 index 00000000000..6a05fcb0a20 --- /dev/null +++ b/arch/xtensa/include/asm/stacktrace.h @@ -0,0 +1,36 @@ +/* + * arch/xtensa/include/asm/stacktrace.h + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2001 - 2013 Tensilica Inc. + */ +#ifndef _XTENSA_STACKTRACE_H +#define _XTENSA_STACKTRACE_H + +#include <linux/sched.h> + +struct stackframe { +	unsigned long pc; +	unsigned long sp; +}; + +static __always_inline unsigned long *stack_pointer(struct task_struct *task) +{ +	unsigned long *sp; + +	if (!task || task == current) +		__asm__ __volatile__ ("mov %0, a1\n" : "=a"(sp)); +	else +		sp = (unsigned long *)task->thread.sp; + +	return sp; +} + +void walk_stackframe(unsigned long *sp, +		int (*fn)(struct stackframe *frame, void *data), +		void *data); + +#endif /* _XTENSA_STACKTRACE_H */ diff --git a/arch/xtensa/include/asm/stat.h b/arch/xtensa/include/asm/stat.h deleted file mode 100644 index c4992038cee..00000000000 --- a/arch/xtensa/include/asm/stat.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * include/asm-xtensa/stat.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2007 Tensilica Inc. - */ - -#ifndef _XTENSA_STAT_H -#define _XTENSA_STAT_H - -#define STAT_HAVE_NSEC 1 - -struct stat { -	unsigned long	st_dev; -	unsigned long	st_ino; -	unsigned int	st_mode; -	unsigned int	st_nlink; -	unsigned int	st_uid; -	unsigned int	st_gid; -	unsigned long	st_rdev; -	long		st_size; -	unsigned long	st_blksize; -	unsigned long	st_blocks; -	unsigned long	st_atime; -	unsigned long	st_atime_nsec; -	unsigned long	st_mtime; -	unsigned long	st_mtime_nsec; -	unsigned long	st_ctime; -	unsigned long	st_ctime_nsec; -	unsigned long	__unused4; -	unsigned long	__unused5; -}; - -struct stat64  { -	unsigned long long st_dev;	/* Device */ -	unsigned long long st_ino;	/* File serial number */ -	unsigned int  st_mode;		/* File mode. */ -	unsigned int  st_nlink;		/* Link count. */ -	unsigned int  st_uid;		/* User ID of the file's owner. */ -	unsigned int  st_gid;		/* Group ID of the file's group. */ -	unsigned long long st_rdev;	/* Device number, if device. */ -	long long st_size;		/* Size of file, in bytes. */ -	unsigned long st_blksize;	/* Optimal block size for I/O. */ -	unsigned long __unused2; -	unsigned long long st_blocks;	/* Number 512-byte blocks allocated. */ -	unsigned long st_atime;		/* Time of last access. */ -	unsigned long st_atime_nsec; -	unsigned long st_mtime;		/* Time of last modification. */ -	unsigned long st_mtime_nsec; -	unsigned long st_ctime;		/* Time of last status change. */ -	unsigned long st_ctime_nsec; -	unsigned long __unused4; -	unsigned long __unused5; -}; - -#endif	/* _XTENSA_STAT_H */ diff --git a/arch/xtensa/include/asm/statfs.h b/arch/xtensa/include/asm/statfs.h deleted file mode 100644 index 9c3d1a21313..00000000000 --- a/arch/xtensa/include/asm/statfs.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * include/asm-xtensa/statfs.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_STATFS_H -#define _XTENSA_STATFS_H - -#include <asm-generic/statfs.h> - -#endif	/* _XTENSA_STATFS_H */ - diff --git a/arch/xtensa/include/asm/string.h b/arch/xtensa/include/asm/string.h index 5fb8c27cbef..8d5d9dfadb0 100644 --- a/arch/xtensa/include/asm/string.h +++ b/arch/xtensa/include/asm/string.h @@ -74,7 +74,7 @@ static inline int strcmp(const char *__cs, const char *__ct)  		"beqz	%2, 2f\n\t"  		"beq	%2, %3, 1b\n"  		"2:\n\t" -		"sub	%2, %3, %2" +		"sub	%2, %2, %3"  		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)  		: "0" (__cs), "1" (__ct)); @@ -99,7 +99,7 @@ static inline int strncmp(const char *__cs, const char *__ct, size_t __n)  		"beqz	%3, 2f\n\t"  		"beq	%2, %3, 1b\n"  		"2:\n\t" -		"sub	%2, %3, %2" +		"sub	%2, %2, %3"  		: "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)  		: "0" (__cs), "1" (__ct), "r" (__cs+__n)); @@ -118,7 +118,4 @@ extern void *memmove(void *__dest, __const__ void *__src, size_t __n);  /* Don't build bcopy at all ...  */  #define __HAVE_ARCH_BCOPY -#define __HAVE_ARCH_MEMSCAN -#define memscan memchr -  #endif	/* _XTENSA_STRING_H */ diff --git a/arch/xtensa/include/asm/swab.h b/arch/xtensa/include/asm/swab.h deleted file mode 100644 index 226a3916231..00000000000 --- a/arch/xtensa/include/asm/swab.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * include/asm-xtensa/swab.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_SWAB_H -#define _XTENSA_SWAB_H - -#include <linux/types.h> -#include <linux/compiler.h> - -#define __SWAB_64_THRU_32__ - -static inline __attribute_const__ __u32 __arch_swab32(__u32 x) -{ -    __u32 res; -    /* instruction sequence from Xtensa ISA release 2/2000 */ -    __asm__("ssai     8           \n\t" -	    "srli     %0, %1, 16  \n\t" -	    "src      %0, %0, %1  \n\t" -	    "src      %0, %0, %0  \n\t" -	    "src      %0, %1, %0  \n" -	    : "=&a" (res) -	    : "a" (x) -	    ); -    return res; -} -#define __arch_swab32 __arch_swab32 - -static inline __attribute_const__ __u16 __arch_swab16(__u16 x) -{ -    /* Given that 'short' values are signed (i.e., can be negative), -     * we cannot assume that the upper 16-bits of the register are -     * zero.  We are careful to mask values after shifting. -     */ - -    /* There exists an anomaly between xt-gcc and xt-xcc.  xt-gcc -     * inserts an extui instruction after putting this function inline -     * to ensure that it uses only the least-significant 16 bits of -     * the result.  xt-xcc doesn't use an extui, but assumes the -     * __asm__ macro follows convention that the upper 16 bits of an -     * 'unsigned short' result are still zero.  This macro doesn't -     * follow convention; indeed, it leaves garbage in the upport 16 -     * bits of the register. - -     * Declaring the temporary variables 'res' and 'tmp' to be 32-bit -     * types while the return type of the function is a 16-bit type -     * forces both compilers to insert exactly one extui instruction -     * (or equivalent) to mask off the upper 16 bits. */ - -    __u32 res; -    __u32 tmp; - -    __asm__("extui    %1, %2, 8, 8\n\t" -	    "slli     %0, %2, 8   \n\t" -	    "or       %0, %0, %1  \n" -	    : "=&a" (res), "=&a" (tmp) -	    : "a" (x) -	    ); - -    return res; -} -#define __arch_swab16 __arch_swab16 - -#endif /* _XTENSA_SWAB_H */ diff --git a/arch/xtensa/include/asm/switch_to.h b/arch/xtensa/include/asm/switch_to.h new file mode 100644 index 00000000000..6b73bf0eb1f --- /dev/null +++ b/arch/xtensa/include/asm/switch_to.h @@ -0,0 +1,22 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2001 - 2005 Tensilica Inc. + */ + +#ifndef _XTENSA_SWITCH_TO_H +#define _XTENSA_SWITCH_TO_H + +/* * switch_to(n) should switch tasks to task nr n, first + * checking that n isn't the current task, in which case it does nothing. + */ +extern void *_switch_to(void *last, void *next); + +#define switch_to(prev,next,last)		\ +do {						\ +	(last) = _switch_to(prev, next);	\ +} while(0) + +#endif /* _XTENSA_SWITCH_TO_H */ diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h index efcf33b92e4..3673ff1f1bc 100644 --- a/arch/xtensa/include/asm/syscall.h +++ b/arch/xtensa/include/asm/syscall.h @@ -9,21 +9,9 @@   */  struct pt_regs; -struct sigaction; -asmlinkage long xtensa_execve(char*, char**, char**, struct pt_regs*); -asmlinkage long xtensa_clone(unsigned long, unsigned long, struct pt_regs*);  asmlinkage long xtensa_ptrace(long, long, long, long);  asmlinkage long xtensa_sigreturn(struct pt_regs*);  asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); -asmlinkage long xtensa_sigsuspend(struct pt_regs*); -asmlinkage long xtensa_rt_sigsuspend(struct pt_regs*); -asmlinkage long xtensa_sigaction(int, const struct old_sigaction*, -				 struct old_sigaction*); -asmlinkage long xtensa_sigaltstack(struct pt_regs *regs); -asmlinkage long sys_rt_sigaction(int, -				 const struct sigaction __user *, -				 struct sigaction __user *, -				 size_t);  asmlinkage long xtensa_shmat(int, char __user *, int);  asmlinkage long xtensa_fadvise64_64(int, int,  				    unsigned long long, unsigned long long); @@ -31,9 +19,9 @@ asmlinkage long xtensa_fadvise64_64(int, int,  /* Should probably move to linux/syscalls.h */  struct pollfd;  asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp, -	fd_set __user *exp, struct timespec __user *tsp, void __user *sig); +			     fd_set __user *exp, struct timespec __user *tsp, +			     void __user *sig);  asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds, -	struct timespec __user *tsp, const sigset_t __user *sigmask, -	size_t sigsetsize); - - +			  struct timespec __user *tsp, +			  const sigset_t __user *sigmask, +			  size_t sigsetsize); diff --git a/arch/xtensa/include/asm/sysmem.h b/arch/xtensa/include/asm/sysmem.h new file mode 100644 index 00000000000..c015c5c8e3f --- /dev/null +++ b/arch/xtensa/include/asm/sysmem.h @@ -0,0 +1,38 @@ +/* + * sysmem-related prototypes. + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2014 Cadence Design Systems Inc. + */ + +#ifndef _XTENSA_SYSMEM_H +#define _XTENSA_SYSMEM_H + +#define SYSMEM_BANKS_MAX 31 + +struct meminfo { +	unsigned long start; +	unsigned long end; +}; + +/* + * Bank array is sorted by .start. + * Banks don't overlap and there's at least one page gap + * between adjacent bank entries. + */ +struct sysmem_info { +	int nr_banks; +	struct meminfo bank[SYSMEM_BANKS_MAX]; +}; + +extern struct sysmem_info sysmem; + +int add_sysmem_bank(unsigned long start, unsigned long end); +int mem_reserve(unsigned long, unsigned long, int); +void bootmem_init(void); +void zones_init(void); + +#endif /* _XTENSA_SYSMEM_H */ diff --git a/arch/xtensa/include/asm/termbits.h b/arch/xtensa/include/asm/termbits.h deleted file mode 100644 index 0d6c8715b24..00000000000 --- a/arch/xtensa/include/asm/termbits.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - * include/asm-xtensa/termbits.h - * - * Copied from SH. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_TERMBITS_H -#define _XTENSA_TERMBITS_H - - -#include <linux/posix_types.h> - -typedef unsigned char	cc_t; -typedef unsigned int	speed_t; -typedef unsigned int	tcflag_t; - -#define NCCS 19 -struct termios { -	tcflag_t c_iflag;		/* input mode flags */ -	tcflag_t c_oflag;		/* output mode flags */ -	tcflag_t c_cflag;		/* control mode flags */ -	tcflag_t c_lflag;		/* local mode flags */ -	cc_t c_line;			/* line discipline */ -	cc_t c_cc[NCCS];		/* control characters */ -}; - -struct termios2 { -	tcflag_t c_iflag;		/* input mode flags */ -	tcflag_t c_oflag;		/* output mode flags */ -	tcflag_t c_cflag;		/* control mode flags */ -	tcflag_t c_lflag;		/* local mode flags */ -	cc_t c_line;			/* line discipline */ -	cc_t c_cc[NCCS];		/* control characters */ -	speed_t c_ispeed;		/* input speed */ -	speed_t c_ospeed;		/* output speed */ -}; - -struct ktermios { -	tcflag_t c_iflag;		/* input mode flags */ -	tcflag_t c_oflag;		/* output mode flags */ -	tcflag_t c_cflag;		/* control mode flags */ -	tcflag_t c_lflag;		/* local mode flags */ -	cc_t c_line;			/* line discipline */ -	cc_t c_cc[NCCS];		/* control characters */ -	speed_t c_ispeed;		/* input speed */ -	speed_t c_ospeed;		/* output speed */ -}; - -/* c_cc characters */ - -#define VINTR 0 -#define VQUIT 1 -#define VERASE 2 -#define VKILL 3 -#define VEOF 4 -#define VTIME 5 -#define VMIN 6 -#define VSWTC 7 -#define VSTART 8 -#define VSTOP 9 -#define VSUSP 10 -#define VEOL 11 -#define VREPRINT 12 -#define VDISCARD 13 -#define VWERASE 14 -#define VLNEXT 15 -#define VEOL2 16 - -/* c_iflag bits */ - -#define IGNBRK	0000001 -#define BRKINT	0000002 -#define IGNPAR	0000004 -#define PARMRK	0000010 -#define INPCK	0000020 -#define ISTRIP	0000040 -#define INLCR	0000100 -#define IGNCR	0000200 -#define ICRNL	0000400 -#define IUCLC	0001000 -#define IXON	0002000 -#define IXANY	0004000 -#define IXOFF	0010000 -#define IMAXBEL	0020000 -#define IUTF8	0040000 - -/* c_oflag bits */ - -#define OPOST	0000001 -#define OLCUC	0000002 -#define ONLCR	0000004 -#define OCRNL	0000010 -#define ONOCR	0000020 -#define ONLRET	0000040 -#define OFILL	0000100 -#define OFDEL	0000200 -#define NLDLY	0000400 -#define   NL0	0000000 -#define   NL1	0000400 -#define CRDLY	0003000 -#define   CR0	0000000 -#define   CR1	0001000 -#define   CR2	0002000 -#define   CR3	0003000 -#define TABDLY	0014000 -#define   TAB0	0000000 -#define   TAB1	0004000 -#define   TAB2	0010000 -#define   TAB3	0014000 -#define   XTABS	0014000 -#define BSDLY	0020000 -#define   BS0	0000000 -#define   BS1	0020000 -#define VTDLY	0040000 -#define   VT0	0000000 -#define   VT1	0040000 -#define FFDLY	0100000 -#define   FF0	0000000 -#define   FF1	0100000 - -/* c_cflag bit meaning */ - -#define CBAUD	0010017 -#define  B0	0000000		/* hang up */ -#define  B50	0000001 -#define  B75	0000002 -#define  B110	0000003 -#define  B134	0000004 -#define  B150	0000005 -#define  B200	0000006 -#define  B300	0000007 -#define  B600	0000010 -#define  B1200	0000011 -#define  B1800	0000012 -#define  B2400	0000013 -#define  B4800	0000014 -#define  B9600	0000015 -#define  B19200	0000016 -#define  B38400	0000017 -#define EXTA B19200 -#define EXTB B38400 -#define CSIZE	0000060 -#define   CS5	0000000 -#define   CS6	0000020 -#define   CS7	0000040 -#define   CS8	0000060 -#define CSTOPB	0000100 -#define CREAD	0000200 -#define PARENB	0000400 -#define PARODD	0001000 -#define HUPCL	0002000 -#define CLOCAL	0004000 -#define CBAUDEX 0010000 -#define	   BOTHER 0010000 -#define    B57600 0010001 -#define   B115200 0010002 -#define   B230400 0010003 -#define   B460800 0010004 -#define   B500000 0010005 -#define   B576000 0010006 -#define   B921600 0010007 -#define  B1000000 0010010 -#define  B1152000 0010011 -#define  B1500000 0010012 -#define  B2000000 0010013 -#define  B2500000 0010014 -#define  B3000000 0010015 -#define  B3500000 0010016 -#define  B4000000 0010017 -#define CIBAUD	  002003600000		/* input baud rate */ -#define CMSPAR	  010000000000		/* mark or space (stick) parity */ -#define CRTSCTS	  020000000000		/* flow control */ - -#define IBSHIFT	16		/* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ - -#define ISIG	0000001 -#define ICANON	0000002 -#define XCASE	0000004 -#define ECHO	0000010 -#define ECHOE	0000020 -#define ECHOK	0000040 -#define ECHONL	0000100 -#define NOFLSH	0000200 -#define TOSTOP	0000400 -#define ECHOCTL	0001000 -#define ECHOPRT	0002000 -#define ECHOKE	0004000 -#define FLUSHO	0010000 -#define PENDIN	0040000 -#define IEXTEN	0100000 -#define EXTPROC	0200000 - -/* tcflow() and TCXONC use these */ - -#define	TCOOFF		0 -#define	TCOON		1 -#define	TCIOFF		2 -#define	TCION		3 - -/* tcflush() and TCFLSH use these */ - -#define	TCIFLUSH	0 -#define	TCOFLUSH	1 -#define	TCIOFLUSH	2 - -/* tcsetattr uses these */ - -#define	TCSANOW		0 -#define	TCSADRAIN	1 -#define	TCSAFLUSH	2 - -#endif	/* _XTENSA_TERMBITS_H */ diff --git a/arch/xtensa/include/asm/termios.h b/arch/xtensa/include/asm/termios.h deleted file mode 100644 index 4673f42f88a..00000000000 --- a/arch/xtensa/include/asm/termios.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * include/asm-xtensa/termios.h - * - * Copied from SH. - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_TERMIOS_H -#define _XTENSA_TERMIOS_H - -#include <asm/termbits.h> -#include <asm/ioctls.h> - -struct winsize { -	unsigned short ws_row; -	unsigned short ws_col; -	unsigned short ws_xpixel; -	unsigned short ws_ypixel; -}; - -#define NCC 8 -struct termio { -	unsigned short c_iflag;		/* input mode flags */ -	unsigned short c_oflag;		/* output mode flags */ -	unsigned short c_cflag;		/* control mode flags */ -	unsigned short c_lflag;		/* local mode flags */ -	unsigned char c_line;		/* line discipline */ -	unsigned char c_cc[NCC];	/* control characters */ -}; - -/* Modem lines */ - -#define TIOCM_LE	0x001 -#define TIOCM_DTR	0x002 -#define TIOCM_RTS	0x004 -#define TIOCM_ST	0x008 -#define TIOCM_SR	0x010 -#define TIOCM_CTS	0x020 -#define TIOCM_CAR	0x040 -#define TIOCM_RNG	0x080 -#define TIOCM_DSR	0x100 -#define TIOCM_CD	TIOCM_CAR -#define TIOCM_RI	TIOCM_RNG -#define TIOCM_OUT1	0x2000 -#define TIOCM_OUT2	0x4000 -#define TIOCM_LOOP	0x8000 - -/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ - -#ifdef __KERNEL__ - -/*	intr=^C		quit=^\		erase=del	kill=^U -	eof=^D		vtime=\0	vmin=\1		sxtc=\0 -	start=^Q	stop=^S		susp=^Z		eol=\0 -	reprint=^R	discard=^U	werase=^W	lnext=^V -	eol2=\0 -*/ -#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" - -/* - * Translate a "termio" structure into a "termios". Ugh. - */ - -#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ -	unsigned short __tmp; \ -	get_user(__tmp,&(termio)->x); \ -	*(unsigned short *) &(termios)->x = __tmp; \ -} - -#define user_termio_to_kernel_termios(termios, termio) \ -({ \ -	SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ -	SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ -	SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ -	SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ -	copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ -}) - -/* - * Translate a "termios" structure into a "termio". Ugh. - */ - -#define kernel_termios_to_user_termio(termio, termios) \ -({ \ -	put_user((termios)->c_iflag, &(termio)->c_iflag); \ -	put_user((termios)->c_oflag, &(termio)->c_oflag); \ -	put_user((termios)->c_cflag, &(termio)->c_cflag); \ -	put_user((termios)->c_lflag, &(termio)->c_lflag); \ -	put_user((termios)->c_line,  &(termio)->c_line); \ -	copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ -}) - -#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2)) -#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2)) -#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) -#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) - -#endif	/* __KERNEL__ */ - -#endif	/* _XTENSA_TERMIOS_H */ diff --git a/arch/xtensa/include/asm/thread_info.h b/arch/xtensa/include/asm/thread_info.h index 7be8accb0b0..470153e8547 100644 --- a/arch/xtensa/include/asm/thread_info.h +++ b/arch/xtensa/include/asm/thread_info.h @@ -76,8 +76,6 @@ struct thread_info {  #endif -#define PREEMPT_ACTIVE		0x10000000 -  /*   * macros/functions for gaining access to the thread information structure   */ @@ -128,20 +126,14 @@ static inline struct thread_info *current_thread_info(void)  #define TIF_SIGPENDING		1	/* signal pending */  #define TIF_NEED_RESCHED	2	/* rescheduling necessary */  #define TIF_SINGLESTEP		3	/* restore singlestep on return to user mode */ -#define TIF_IRET		4	/* return with iret */  #define TIF_MEMDIE		5	/* is terminating due to OOM killer */  #define TIF_RESTORE_SIGMASK	6	/* restore signal mask in do_signal() */ -#define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */ -#define TIF_FREEZE		17	/* is freezing for suspend */ +#define TIF_NOTIFY_RESUME	7	/* callback before returning to user */  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)  #define _TIF_SINGLESTEP		(1<<TIF_SINGLESTEP) -#define _TIF_IRET		(1<<TIF_IRET) -#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG) -#define _TIF_RESTORE_SIGMASK	(1<<TIF_RESTORE_SIGMASK) -#define _TIF_FREEZE		(1<<TIF_FREEZE)  #define _TIF_WORK_MASK		0x0000FFFE	/* work to do on interrupt/exception return */  #define _TIF_ALLWORK_MASK	0x0000FFFF	/* work to do on any return to u-space */ diff --git a/arch/xtensa/include/asm/timex.h b/arch/xtensa/include/asm/timex.h index 053bc427210..ca929e6a38b 100644 --- a/arch/xtensa/include/asm/timex.h +++ b/arch/xtensa/include/asm/timex.h @@ -1,72 +1,52 @@  /* - * include/asm-xtensa/timex.h - *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_TIMEX_H  #define _XTENSA_TIMEX_H -#ifdef __KERNEL__ -  #include <asm/processor.h>  #include <linux/stringify.h>  #define _INTLEVEL(x)	XCHAL_INT ## x ## _LEVEL  #define INTLEVEL(x)	_INTLEVEL(x) -#if INTLEVEL(XCHAL_TIMER0_INTERRUPT) == 1 +#if XCHAL_NUM_TIMERS > 0 && \ +	INTLEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL  # define LINUX_TIMER     0  # define LINUX_TIMER_INT XCHAL_TIMER0_INTERRUPT -#elif INTLEVEL(XCHAL_TIMER1_INTERRUPT) == 1 +#elif XCHAL_NUM_TIMERS > 1 && \ +	INTLEVEL(XCHAL_TIMER1_INTERRUPT) <= XCHAL_EXCM_LEVEL  # define LINUX_TIMER     1  # define LINUX_TIMER_INT XCHAL_TIMER1_INTERRUPT -#elif INTLEVEL(XCHAL_TIMER2_INTERRUPT) == 1 +#elif XCHAL_NUM_TIMERS > 2 && \ +	INTLEVEL(XCHAL_TIMER2_INTERRUPT) <= XCHAL_EXCM_LEVEL  # define LINUX_TIMER     2  # define LINUX_TIMER_INT XCHAL_TIMER2_INTERRUPT  #else  # error "Bad timer number for Linux configurations!"  #endif -#define LINUX_TIMER_MASK        (1L << LINUX_TIMER_INT) - -#define CLOCK_TICK_RATE 	1193180	/* (everyone is using this value) */ -#define CLOCK_TICK_FACTOR       20 /* Factor of both 10^6 and CLOCK_TICK_RATE */ - -#ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT -extern unsigned long ccount_per_jiffy; -extern unsigned long nsec_per_ccount; -#define CCOUNT_PER_JIFFY ccount_per_jiffy -#define NSEC_PER_CCOUNT  nsec_per_ccount -#else -#define CCOUNT_PER_JIFFY (CONFIG_XTENSA_CPU_CLOCK*(1000000UL/HZ)) -#define NSEC_PER_CCOUNT (1000UL / CONFIG_XTENSA_CPU_CLOCK) -#endif - +extern unsigned long ccount_freq;  typedef unsigned long long cycles_t; -/* - * Only used for SMP. - */ - -extern cycles_t cacheflush_time; -  #define get_cycles()	(0) +void local_timer_setup(unsigned cpu);  /*   * Register access.   */ -#define WSR_CCOUNT(r)	  asm volatile ("wsr %0,"__stringify(CCOUNT) :: "a" (r)) -#define RSR_CCOUNT(r)	  asm volatile ("rsr %0,"__stringify(CCOUNT) : "=a" (r)) -#define WSR_CCOMPARE(x,r) asm volatile ("wsr %0,"__stringify(CCOMPARE)"+"__stringify(x) :: "a"(r)) -#define RSR_CCOMPARE(x,r) asm volatile ("rsr %0,"__stringify(CCOMPARE)"+"__stringify(x) : "=a"(r)) +#define WSR_CCOUNT(r)	  asm volatile ("wsr %0, ccount" :: "a" (r)) +#define RSR_CCOUNT(r)	  asm volatile ("rsr %0, ccount" : "=a" (r)) +#define WSR_CCOMPARE(x,r) asm volatile ("wsr %0,"__stringify(SREG_CCOMPARE)"+"__stringify(x) :: "a"(r)) +#define RSR_CCOMPARE(x,r) asm volatile ("rsr %0,"__stringify(SREG_CCOMPARE)"+"__stringify(x) : "=a"(r))  static inline unsigned long get_ccount (void)  { @@ -92,5 +72,4 @@ static inline void set_linux_timer (unsigned long ccompare)  	WSR_CCOMPARE(LINUX_TIMER, ccompare);  } -#endif	/* __KERNEL__ */  #endif	/* _XTENSA_TIMEX_H */ diff --git a/arch/xtensa/include/asm/tlbflush.h b/arch/xtensa/include/asm/tlbflush.h index 46d240074f7..06875feb27c 100644 --- a/arch/xtensa/include/asm/tlbflush.h +++ b/arch/xtensa/include/asm/tlbflush.h @@ -1,18 +1,14 @@  /* - * include/asm-xtensa/tlbflush.h - *   * This file is subject to the terms and conditions of the GNU General Public   * License.  See the file "COPYING" in the main directory of this archive   * for more details.   * - * Copyright (C) 2001 - 2005 Tensilica Inc. + * Copyright (C) 2001 - 2013 Tensilica Inc.   */  #ifndef _XTENSA_TLBFLUSH_H  #define _XTENSA_TLBFLUSH_H -#ifdef __KERNEL__ -  #include <linux/stringify.h>  #include <asm/processor.h> @@ -34,12 +30,34 @@   *  - flush_tlb_range(mm, start, end) flushes a range of pages   */ -extern void flush_tlb_all(void); -extern void flush_tlb_mm(struct mm_struct*); -extern void flush_tlb_page(struct vm_area_struct*,unsigned long); -extern void flush_tlb_range(struct vm_area_struct*,unsigned long,unsigned long); +void local_flush_tlb_all(void); +void local_flush_tlb_mm(struct mm_struct *mm); +void local_flush_tlb_page(struct vm_area_struct *vma, +		unsigned long page); +void local_flush_tlb_range(struct vm_area_struct *vma, +		unsigned long start, unsigned long end); +void local_flush_tlb_kernel_range(unsigned long start, unsigned long end); + +#ifdef CONFIG_SMP + +void flush_tlb_all(void); +void flush_tlb_mm(struct mm_struct *); +void flush_tlb_page(struct vm_area_struct *, unsigned long); +void flush_tlb_range(struct vm_area_struct *, unsigned long, +		unsigned long); +void flush_tlb_kernel_range(unsigned long start, unsigned long end); + +#else /* !CONFIG_SMP */ + +#define flush_tlb_all()			   local_flush_tlb_all() +#define flush_tlb_mm(mm)		   local_flush_tlb_mm(mm) +#define flush_tlb_page(vma, page)	   local_flush_tlb_page(vma, page) +#define flush_tlb_range(vma, vmaddr, end)  local_flush_tlb_range(vma, vmaddr, \ +								 end) +#define flush_tlb_kernel_range(start, end) local_flush_tlb_kernel_range(start, \ +									end) -#define flush_tlb_kernel_range(start,end) flush_tlb_all() +#endif /* CONFIG_SMP */  /* TLB operations. */ @@ -86,26 +104,26 @@ static inline void invalidate_dtlb_entry_no_isync (unsigned entry)  static inline void set_itlbcfg_register (unsigned long val)  { -	__asm__ __volatile__("wsr  %0, "__stringify(ITLBCFG)"\n\t" "isync\n\t" +	__asm__ __volatile__("wsr  %0, itlbcfg\n\t" "isync\n\t"  			     : : "a" (val));  }  static inline void set_dtlbcfg_register (unsigned long val)  { -	__asm__ __volatile__("wsr  %0, "__stringify(DTLBCFG)"; dsync\n\t" +	__asm__ __volatile__("wsr  %0, dtlbcfg; dsync\n\t"  	    		     : : "a" (val));  }  static inline void set_ptevaddr_register (unsigned long val)  { -	__asm__ __volatile__(" wsr  %0, "__stringify(PTEVADDR)"; isync\n" +	__asm__ __volatile__(" wsr  %0, ptevaddr; isync\n"  			     : : "a" (val));  }  static inline unsigned long read_ptevaddr_register (void)  {  	unsigned long tmp; -	__asm__ __volatile__("rsr  %0, "__stringify(PTEVADDR)"\n\t" : "=a" (tmp)); +	__asm__ __volatile__("rsr  %0, ptevaddr\n\t" : "=a" (tmp));  	return tmp;  } @@ -187,5 +205,4 @@ static inline unsigned long read_itlb_translation (int way)  }  #endif	/* __ASSEMBLY__ */ -#endif	/* __KERNEL__ */  #endif	/* _XTENSA_TLBFLUSH_H */ diff --git a/arch/xtensa/include/asm/topology.h b/arch/xtensa/include/asm/topology.h deleted file mode 100644 index 7309e38a0cc..00000000000 --- a/arch/xtensa/include/asm/topology.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/topology.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_TOPOLOGY_H -#define _XTENSA_TOPOLOGY_H - -#include <asm-generic/topology.h> - -#endif	/* _XTENSA_TOPOLOGY_H */ diff --git a/arch/xtensa/include/asm/traps.h b/arch/xtensa/include/asm/traps.h new file mode 100644 index 00000000000..677bfcf4ee5 --- /dev/null +++ b/arch/xtensa/include/asm/traps.h @@ -0,0 +1,59 @@ +/* + * arch/xtensa/include/asm/traps.h + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2012 Tensilica Inc. + */ +#ifndef _XTENSA_TRAPS_H +#define _XTENSA_TRAPS_H + +#include <asm/ptrace.h> + +/* + * handler must be either of the following: + *  void (*)(struct pt_regs *regs); + *  void (*)(struct pt_regs *regs, unsigned long exccause); + */ +extern void * __init trap_set_handler(int cause, void *handler); +extern void do_unhandled(struct pt_regs *regs, unsigned long exccause); +void secondary_trap_init(void); + +static inline void spill_registers(void) +{ +#if XCHAL_NUM_AREGS > 16 +	__asm__ __volatile__ ( +		"	call12	1f\n" +		"	_j	2f\n" +		"	retw\n" +		"	.align	4\n" +		"1:\n" +		"	_entry	a1, 48\n" +		"	addi	a12, a0, 3\n" +#if XCHAL_NUM_AREGS > 32 +		"	.rept	(" __stringify(XCHAL_NUM_AREGS) " - 32) / 12\n" +		"	_entry	a1, 48\n" +		"	mov	a12, a0\n" +		"	.endr\n" +#endif +		"	_entry	a1, 48\n" +#if XCHAL_NUM_AREGS % 12 == 0 +		"	mov	a8, a8\n" +#elif XCHAL_NUM_AREGS % 12 == 4 +		"	mov	a12, a12\n" +#elif XCHAL_NUM_AREGS % 12 == 8 +		"	mov	a4, a4\n" +#endif +		"	retw\n" +		"2:\n" +		: : : "a12", "a13", "memory"); +#else +	__asm__ __volatile__ ( +		"	mov	a12, a12\n" +		: : : "memory"); +#endif +} + +#endif /* _XTENSA_TRAPS_H */ diff --git a/arch/xtensa/include/asm/types.h b/arch/xtensa/include/asm/types.h index c89569a8da0..2b410b8c7f7 100644 --- a/arch/xtensa/include/asm/types.h +++ b/arch/xtensa/include/asm/types.h @@ -7,36 +7,17 @@   *   * Copyright (C) 2001 - 2005 Tensilica Inc.   */ -  #ifndef _XTENSA_TYPES_H  #define _XTENSA_TYPES_H -#include <asm-generic/int-ll64.h> - -#ifdef __ASSEMBLY__ -# define __XTENSA_UL(x)		(x) -# define __XTENSA_UL_CONST(x)	x -#else -# define __XTENSA_UL(x)		((unsigned long)(x)) -# define __XTENSA_UL_CONST(x)	x##UL -#endif +#include <uapi/asm/types.h>  #ifndef __ASSEMBLY__ - -typedef unsigned short umode_t; -  /*   * These aren't exported outside the kernel to avoid name space clashes   */ -#ifdef __KERNEL__  #define BITS_PER_LONG 32 -/* Dma addresses are 32-bits wide.  */ - -typedef u32 dma_addr_t; - -#endif	/* __KERNEL__ */  #endif -  #endif	/* _XTENSA_TYPES_H */ diff --git a/arch/xtensa/include/asm/uaccess.h b/arch/xtensa/include/asm/uaccess.h index 5b0c18c1cce..fd686dc45d1 100644 --- a/arch/xtensa/include/asm/uaccess.h +++ b/arch/xtensa/include/asm/uaccess.h @@ -17,6 +17,10 @@  #define _XTENSA_UACCESS_H  #include <linux/errno.h> +#ifndef __ASSEMBLY__ +#include <linux/prefetch.h> +#endif +#include <asm/types.h>  #define VERIFY_READ    0  #define VERIFY_WRITE   1 @@ -26,7 +30,6 @@  #include <asm/current.h>  #include <asm/asm-offsets.h>  #include <asm/processor.h> -#include <asm/types.h>  /*   * These assembly macros mirror the C macros that follow below.  They @@ -157,7 +160,6 @@  #else /* __ASSEMBLY__ not defined */  #include <linux/sched.h> -#include <asm/types.h>  /*   * The fs value determines whether argument validity checking should @@ -178,7 +180,8 @@  #define segment_eq(a,b)	((a).seg == (b).seg)  #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) -#define __user_ok(addr,size) (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size))) +#define __user_ok(addr,size) \ +		(((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size)))  #define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size)))  #define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size)) @@ -232,10 +235,10 @@ do {									\  	int __cb;							\  	retval = 0;							\  	switch (size) {							\ -        case 1: __put_user_asm(x,ptr,retval,1,"s8i",__cb);  break;	\ -        case 2: __put_user_asm(x,ptr,retval,2,"s16i",__cb); break;	\ -        case 4: __put_user_asm(x,ptr,retval,4,"s32i",__cb); break;	\ -        case 8: {							\ +	case 1: __put_user_asm(x,ptr,retval,1,"s8i",__cb);  break;	\ +	case 2: __put_user_asm(x,ptr,retval,2,"s16i",__cb); break;	\ +	case 4: __put_user_asm(x,ptr,retval,4,"s32i",__cb); break;	\ +	case 8: {							\  		     __typeof__(*ptr) __v64 = x;			\  		     retval = __copy_to_user(ptr,&__v64,8);		\  		     break;						\ @@ -289,7 +292,7 @@ do {									\   * __check_align_* macros still work.   */  #define __put_user_asm(x, addr, err, align, insn, cb)	\ -   __asm__ __volatile__(				\ +__asm__ __volatile__(					\  	__check_align_##align				\  	"1: "insn"  %2, %3, 0		\n"		\  	"2:				\n"		\ @@ -299,8 +302,8 @@ do {									\  	"   .long  2b			\n"		\  	"5:				\n"		\  	"   l32r   %1, 4b		\n"		\ -        "   movi   %0, %4		\n"		\ -        "   jx     %1			\n"		\ +	"   movi   %0, %4		\n"		\ +	"   jx     %1			\n"		\  	"   .previous			\n"		\  	"   .section  __ex_table,\"a\"	\n"		\  	"   .long	1b, 5b		\n"		\ @@ -332,13 +335,13 @@ extern long __get_user_bad(void);  do {									\  	int __cb;							\  	retval = 0;							\ -        switch (size) {							\ -          case 1: __get_user_asm(x,ptr,retval,1,"l8ui",__cb);  break;	\ -          case 2: __get_user_asm(x,ptr,retval,2,"l16ui",__cb); break;	\ -          case 4: __get_user_asm(x,ptr,retval,4,"l32i",__cb);  break;	\ -          case 8: retval = __copy_from_user(&x,ptr,8);    break;	\ -          default: (x) = __get_user_bad();				\ -        }								\ +	switch (size) {							\ +	case 1: __get_user_asm(x,ptr,retval,1,"l8ui",__cb);  break;	\ +	case 2: __get_user_asm(x,ptr,retval,2,"l16ui",__cb); break;	\ +	case 4: __get_user_asm(x,ptr,retval,4,"l32i",__cb);  break;	\ +	case 8: retval = __copy_from_user(&x,ptr,8);    break;	\ +	default: (x) = __get_user_bad();				\ +	}								\  } while (0) @@ -347,7 +350,7 @@ do {									\   * __check_align_* macros still work.   */  #define __get_user_asm(x, addr, err, align, insn, cb) \ -   __asm__ __volatile__(			\ +__asm__ __volatile__(			\  	__check_align_##align			\  	"1: "insn"  %2, %3, 0		\n"	\  	"2:				\n"	\ @@ -358,8 +361,8 @@ do {									\  	"5:				\n"	\  	"   l32r   %1, 4b		\n"	\  	"   movi   %2, 0		\n"	\ -        "   movi   %0, %4		\n"	\ -        "   jx     %1			\n"	\ +	"   movi   %0, %4		\n"	\ +	"   jx     %1			\n"	\  	"   .previous			\n"	\  	"   .section  __ex_table,\"a\"	\n"	\  	"   .long	1b, 5b		\n"	\ @@ -419,8 +422,10 @@ __generic_copy_from_user(void *to, const void *from, unsigned long n)  #define copy_to_user(to,from,n) __generic_copy_to_user((to),(from),(n))  #define copy_from_user(to,from,n) __generic_copy_from_user((to),(from),(n)) -#define __copy_to_user(to,from,n) __generic_copy_to_user_nocheck((to),(from),(n)) -#define __copy_from_user(to,from,n) __generic_copy_from_user_nocheck((to),(from),(n)) +#define __copy_to_user(to,from,n) \ +	__generic_copy_to_user_nocheck((to),(from),(n)) +#define __copy_from_user(to,from,n) \ +	__generic_copy_from_user_nocheck((to),(from),(n))  #define __copy_to_user_inatomic __copy_to_user  #define __copy_from_user_inatomic __copy_from_user diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index 528042c2951..cb4c2ce8d44 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h @@ -1,724 +1,12 @@ -/* - * include/asm-xtensa/unistd.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ -  #ifndef _XTENSA_UNISTD_H  #define _XTENSA_UNISTD_H -#ifndef __SYSCALL -# define __SYSCALL(nr,func,nargs) -#endif - -#define __NR_spill				  0 -__SYSCALL(  0, sys_ni_syscall, 0) -#define __NR_xtensa				  1 -__SYSCALL(  1, sys_ni_syscall, 0) -#define __NR_available4				  2 -__SYSCALL(  2, sys_ni_syscall, 0) -#define __NR_available5				  3 -__SYSCALL(  3, sys_ni_syscall, 0) -#define __NR_available6				  4 -__SYSCALL(  4, sys_ni_syscall, 0) -#define __NR_available7				  5 -__SYSCALL(  5, sys_ni_syscall, 0) -#define __NR_available8				  6 -__SYSCALL(  6, sys_ni_syscall, 0) -#define __NR_available9				  7 -__SYSCALL(  7, sys_ni_syscall, 0) - -/* File Operations */ - -#define __NR_open 				  8 -__SYSCALL(  8, sys_open, 3) -#define __NR_close 				  9 -__SYSCALL(  9, sys_close, 1) -#define __NR_dup 				 10 -__SYSCALL( 10, sys_dup, 1) -#define __NR_dup2 				 11 -__SYSCALL( 11, sys_dup2, 2) -#define __NR_read 				 12 -__SYSCALL( 12, sys_read, 3) -#define __NR_write 				 13 -__SYSCALL( 13, sys_write, 3) -#define __NR_select 				 14 -__SYSCALL( 14, sys_select, 5) -#define __NR_lseek 				 15 -__SYSCALL( 15, sys_lseek, 3) -#define __NR_poll 				 16 -__SYSCALL( 16, sys_poll, 3) -#define __NR__llseek				 17 -__SYSCALL( 17, sys_llseek, 5) -#define __NR_epoll_wait 			 18 -__SYSCALL( 18, sys_epoll_wait, 4) -#define __NR_epoll_ctl 				 19 -__SYSCALL( 19, sys_epoll_ctl, 4) -#define __NR_epoll_create 			 20 -__SYSCALL( 20, sys_epoll_create, 1) -#define __NR_creat 				 21 -__SYSCALL( 21, sys_creat, 2) -#define __NR_truncate 				 22 -__SYSCALL( 22, sys_truncate, 2) -#define __NR_ftruncate 				 23 -__SYSCALL( 23, sys_ftruncate, 2) -#define __NR_readv 				 24 -__SYSCALL( 24, sys_readv, 3) -#define __NR_writev 				 25 -__SYSCALL( 25, sys_writev, 3) -#define __NR_fsync 				 26 -__SYSCALL( 26, sys_fsync, 1) -#define __NR_fdatasync 				 27 -__SYSCALL( 27, sys_fdatasync, 1) -#define __NR_truncate64 			 28 -__SYSCALL( 28, sys_truncate64, 2) -#define __NR_ftruncate64 			 29 -__SYSCALL( 29, sys_ftruncate64, 2) -#define __NR_pread64 				 30 -__SYSCALL( 30, sys_pread64, 6) -#define __NR_pwrite64 				 31 -__SYSCALL( 31, sys_pwrite64, 6) - -#define __NR_link 				 32 -__SYSCALL( 32, sys_link, 2) -#define __NR_rename 				 33 -__SYSCALL( 33, sys_rename, 2) -#define __NR_symlink 				 34 -__SYSCALL( 34, sys_symlink, 2) -#define __NR_readlink 				 35 -__SYSCALL( 35, sys_readlink, 3) -#define __NR_mknod 				 36 -__SYSCALL( 36, sys_mknod, 3) -#define __NR_pipe 				 37 -__SYSCALL( 37, sys_pipe, 1) -#define __NR_unlink 				 38 -__SYSCALL( 38, sys_unlink, 1) -#define __NR_rmdir 				 39 -__SYSCALL( 39, sys_rmdir, 1) - -#define __NR_mkdir 				 40 -__SYSCALL( 40, sys_mkdir, 2) -#define __NR_chdir 				 41 -__SYSCALL( 41, sys_chdir, 1) -#define __NR_fchdir 				 42 -__SYSCALL( 42, sys_fchdir, 1) -#define __NR_getcwd 				 43 -__SYSCALL( 43, sys_getcwd, 2) - -#define __NR_chmod 				 44 -__SYSCALL( 44, sys_chmod, 2) -#define __NR_chown 				 45 -__SYSCALL( 45, sys_chown, 3) -#define __NR_stat 				 46 -__SYSCALL( 46, sys_newstat, 2) -#define __NR_stat64 				 47 -__SYSCALL( 47, sys_stat64, 2) - -#define __NR_lchown 				 48 -__SYSCALL( 48, sys_lchown, 3) -#define __NR_lstat 				 49 -__SYSCALL( 49, sys_newlstat, 2) -#define __NR_lstat64 				 50 -__SYSCALL( 50, sys_lstat64, 2) -#define __NR_available51			 51 -__SYSCALL( 51, sys_ni_syscall, 0) - -#define __NR_fchmod 				 52 -__SYSCALL( 52, sys_fchmod, 2) -#define __NR_fchown 				 53 -__SYSCALL( 53, sys_fchown, 3) -#define __NR_fstat 				 54 -__SYSCALL( 54, sys_newfstat, 2) -#define __NR_fstat64 				 55 -__SYSCALL( 55, sys_fstat64, 2) - -#define __NR_flock 				 56 -__SYSCALL( 56, sys_flock, 2) -#define __NR_access 				 57 -__SYSCALL( 57, sys_access, 2) -#define __NR_umask 				 58 -__SYSCALL( 58, sys_umask, 1) -#define __NR_getdents 				 59 -__SYSCALL( 59, sys_getdents, 3) -#define __NR_getdents64 			 60 -__SYSCALL( 60, sys_getdents64, 3) -#define __NR_fcntl64 				 61 -__SYSCALL( 61, sys_fcntl64, 3) -#define __NR_available62			 62 -__SYSCALL( 62, sys_ni_syscall, 0) -#define __NR_fadvise64_64 			 63 -__SYSCALL( 63, xtensa_fadvise64_64, 6) -#define __NR_utime				 64	/* glibc 2.3.3 ?? */ -__SYSCALL( 64, sys_utime, 2) -#define __NR_utimes 				 65 -__SYSCALL( 65, sys_utimes, 2) -#define __NR_ioctl 				 66 -__SYSCALL( 66, sys_ioctl, 3) -#define __NR_fcntl 				 67 -__SYSCALL( 67, sys_fcntl, 3) - -#define __NR_setxattr 				 68 -__SYSCALL( 68, sys_setxattr, 5) -#define __NR_getxattr 				 69 -__SYSCALL( 69, sys_getxattr, 4) -#define __NR_listxattr 				 70 -__SYSCALL( 70, sys_listxattr, 3) -#define __NR_removexattr 			 71 -__SYSCALL( 71, sys_removexattr, 2) -#define __NR_lsetxattr 				 72 -__SYSCALL( 72, sys_lsetxattr, 5) -#define __NR_lgetxattr 				 73 -__SYSCALL( 73, sys_lgetxattr, 4) -#define __NR_llistxattr 			 74 -__SYSCALL( 74, sys_llistxattr, 3) -#define __NR_lremovexattr 			 75 -__SYSCALL( 75, sys_lremovexattr, 2) -#define __NR_fsetxattr 				 76 -__SYSCALL( 76, sys_fsetxattr, 5) -#define __NR_fgetxattr 				 77 -__SYSCALL( 77, sys_fgetxattr, 4) -#define __NR_flistxattr 			 78 -__SYSCALL( 78, sys_flistxattr, 3) -#define __NR_fremovexattr 			 79 -__SYSCALL( 79, sys_fremovexattr, 2) - -/* File Map / Shared Memory Operations */ - -#define __NR_mmap2 				 80 -__SYSCALL( 80, sys_mmap_pgoff, 6) -#define __NR_munmap 				 81 -__SYSCALL( 81, sys_munmap, 2) -#define __NR_mprotect 				 82 -__SYSCALL( 82, sys_mprotect, 3) -#define __NR_brk 				 83 -__SYSCALL( 83, sys_brk, 1) -#define __NR_mlock 				 84 -__SYSCALL( 84, sys_mlock, 2) -#define __NR_munlock 				 85 -__SYSCALL( 85, sys_munlock, 2) -#define __NR_mlockall 				 86 -__SYSCALL( 86, sys_mlockall, 1) -#define __NR_munlockall 			 87 -__SYSCALL( 87, sys_munlockall, 0) -#define __NR_mremap 				 88 -__SYSCALL( 88, sys_mremap, 4) -#define __NR_msync 				 89 -__SYSCALL( 89, sys_msync, 3) -#define __NR_mincore 				 90 -__SYSCALL( 90, sys_mincore, 3) -#define __NR_madvise 				 91 -__SYSCALL( 91, sys_madvise, 3) -#define __NR_shmget				 92 -__SYSCALL( 92, sys_shmget, 4) -#define __NR_shmat				 93 -__SYSCALL( 93, xtensa_shmat, 4) -#define __NR_shmctl				 94 -__SYSCALL( 94, sys_shmctl, 4) -#define __NR_shmdt				 95 -__SYSCALL( 95, sys_shmdt, 4) - -/* Socket Operations */ - -#define __NR_socket 				 96 -__SYSCALL( 96, sys_socket, 3) -#define __NR_setsockopt 			 97 -__SYSCALL( 97, sys_setsockopt, 5) -#define __NR_getsockopt 			 98 -__SYSCALL( 98, sys_getsockopt, 5) -#define __NR_shutdown 				 99 -__SYSCALL( 99, sys_shutdown, 2) - -#define __NR_bind 				100 -__SYSCALL(100, sys_bind, 3) -#define __NR_connect 				101 -__SYSCALL(101, sys_connect, 3) -#define __NR_listen 				102 -__SYSCALL(102, sys_listen, 2) -#define __NR_accept 				103 -__SYSCALL(103, sys_accept, 3) - -#define __NR_getsockname 			104 -__SYSCALL(104, sys_getsockname, 3) -#define __NR_getpeername 			105 -__SYSCALL(105, sys_getpeername, 3) -#define __NR_sendmsg 				106 -__SYSCALL(106, sys_sendmsg, 3) -#define __NR_recvmsg 				107 -__SYSCALL(107, sys_recvmsg, 3) -#define __NR_send 				108 -__SYSCALL(108, sys_send, 4) -#define __NR_recv 				109 -__SYSCALL(109, sys_recv, 4) -#define __NR_sendto 				110 -__SYSCALL(110, sys_sendto, 6) -#define __NR_recvfrom 				111 -__SYSCALL(111, sys_recvfrom, 6) - -#define __NR_socketpair 			112 -__SYSCALL(112, sys_socketpair, 4) -#define __NR_sendfile 				113 -__SYSCALL(113, sys_sendfile, 4) -#define __NR_sendfile64 			114 -__SYSCALL(114, sys_sendfile64, 4) -#define __NR_available115			115 -__SYSCALL(115, sys_ni_syscall, 0) - -/* Process Operations */ - -#define __NR_clone 				116 -__SYSCALL(116, xtensa_clone, 5) -#define __NR_execve 				117 -__SYSCALL(117, xtensa_execve, 3) -#define __NR_exit 				118 -__SYSCALL(118, sys_exit, 1) -#define __NR_exit_group 			119 -__SYSCALL(119, sys_exit_group, 1) -#define __NR_getpid 				120 -__SYSCALL(120, sys_getpid, 0) -#define __NR_wait4 				121 -__SYSCALL(121, sys_wait4, 4) -#define __NR_waitid 				122 -__SYSCALL(122, sys_waitid, 5) -#define __NR_kill 				123 -__SYSCALL(123, sys_kill, 2) -#define __NR_tkill 				124 -__SYSCALL(124, sys_tkill, 2) -#define __NR_tgkill 				125 -__SYSCALL(125, sys_tgkill, 3) -#define __NR_set_tid_address 			126 -__SYSCALL(126, sys_set_tid_address, 1) -#define __NR_gettid 				127 -__SYSCALL(127, sys_gettid, 0) -#define __NR_setsid 				128 -__SYSCALL(128, sys_setsid, 0) -#define __NR_getsid 				129 -__SYSCALL(129, sys_getsid, 1) -#define __NR_prctl 				130 -__SYSCALL(130, sys_prctl, 5) -#define __NR_personality 			131 -__SYSCALL(131, sys_personality, 1) -#define __NR_getpriority 			132 -__SYSCALL(132, sys_getpriority, 2) -#define __NR_setpriority 			133 -__SYSCALL(133, sys_setpriority, 3) -#define __NR_setitimer 				134 -__SYSCALL(134, sys_setitimer, 3) -#define __NR_getitimer 				135 -__SYSCALL(135, sys_getitimer, 2) -#define __NR_setuid 				136 -__SYSCALL(136, sys_setuid, 1) -#define __NR_getuid 				137 -__SYSCALL(137, sys_getuid, 0) -#define __NR_setgid 				138 -__SYSCALL(138, sys_setgid, 1) -#define __NR_getgid 				139 -__SYSCALL(139, sys_getgid, 0) -#define __NR_geteuid 				140 -__SYSCALL(140, sys_geteuid, 0) -#define __NR_getegid 				141 -__SYSCALL(141, sys_getegid, 0) -#define __NR_setreuid 				142 -__SYSCALL(142, sys_setreuid, 2) -#define __NR_setregid 				143 -__SYSCALL(143, sys_setregid, 2) -#define __NR_setresuid 				144 -__SYSCALL(144, sys_setresuid, 3) -#define __NR_getresuid 				145 -__SYSCALL(145, sys_getresuid, 3) -#define __NR_setresgid 				146 -__SYSCALL(146, sys_setresgid, 3) -#define __NR_getresgid 				147 -__SYSCALL(147, sys_getresgid, 3) -#define __NR_setpgid 				148 -__SYSCALL(148, sys_setpgid, 2) -#define __NR_getpgid 				149 -__SYSCALL(149, sys_getpgid, 1) -#define __NR_getppid 				150 -__SYSCALL(150, sys_getppid, 0) -#define __NR_getpgrp				151 -__SYSCALL(151, sys_getpgrp, 0) - -#define __NR_reserved152 			152	/* set_thread_area */ -__SYSCALL(152, sys_ni_syscall, 0) -#define __NR_reserved153 			153	/* get_thread_area */ -__SYSCALL(153, sys_ni_syscall, 0) -#define __NR_times 				154 -__SYSCALL(154, sys_times, 1) -#define __NR_acct 				155 -__SYSCALL(155, sys_acct, 1) -#define __NR_sched_setaffinity 			156 -__SYSCALL(156, sys_sched_setaffinity, 3) -#define __NR_sched_getaffinity 			157 -__SYSCALL(157, sys_sched_getaffinity, 3) -#define __NR_capget 				158 -__SYSCALL(158, sys_capget, 2) -#define __NR_capset 				159 -__SYSCALL(159, sys_capset, 2) -#define __NR_ptrace 				160 -__SYSCALL(160, sys_ptrace, 4) -#define __NR_semtimedop				161 -__SYSCALL(161, sys_semtimedop, 5) -#define __NR_semget				162 -__SYSCALL(162, sys_semget, 4) -#define __NR_semop				163 -__SYSCALL(163, sys_semop, 4) -#define __NR_semctl				164 -__SYSCALL(164, sys_semctl, 4) -#define __NR_available165			165 -__SYSCALL(165, sys_ni_syscall, 0) -#define __NR_msgget				166 -__SYSCALL(166, sys_msgget, 4) -#define __NR_msgsnd				167 -__SYSCALL(167, sys_msgsnd, 4) -#define __NR_msgrcv				168 -__SYSCALL(168, sys_msgrcv, 4) -#define __NR_msgctl				169 -__SYSCALL(169, sys_msgctl, 4) -#define __NR_available170			170 -__SYSCALL(170, sys_ni_syscall, 0) -#define __NR_available171			171 -__SYSCALL(171, sys_ni_syscall, 0) - -/* File System */ - -#define __NR_mount 				172 -__SYSCALL(172, sys_mount, 5) -#define __NR_swapon 				173 -__SYSCALL(173, sys_swapon, 2) -#define __NR_chroot 				174 -__SYSCALL(174, sys_chroot, 1) -#define __NR_pivot_root 			175 -__SYSCALL(175, sys_pivot_root, 2) -#define __NR_umount 				176 -__SYSCALL(176, sys_umount, 2) -#define __NR_swapoff 				177 -__SYSCALL(177, sys_swapoff, 1) -#define __NR_sync 				178 -__SYSCALL(178, sys_sync, 0) -#define __NR_available179			179 -__SYSCALL(179, sys_ni_syscall, 0) -#define __NR_setfsuid 				180 -__SYSCALL(180, sys_setfsuid, 1) -#define __NR_setfsgid 				181 -__SYSCALL(181, sys_setfsgid, 1) -#define __NR_sysfs 				182 -__SYSCALL(182, sys_sysfs, 3) -#define __NR_ustat 				183 -__SYSCALL(183, sys_ustat, 2) -#define __NR_statfs 				184 -__SYSCALL(184, sys_statfs, 2) -#define __NR_fstatfs 				185 -__SYSCALL(185, sys_fstatfs, 2) -#define __NR_statfs64 				186 -__SYSCALL(186, sys_statfs64, 3) -#define __NR_fstatfs64 				187 -__SYSCALL(187, sys_fstatfs64, 3) - -/* System */ - -#define __NR_setrlimit 				188 -__SYSCALL(188, sys_setrlimit, 2) -#define __NR_getrlimit 				189 -__SYSCALL(189, sys_getrlimit, 2) -#define __NR_getrusage 				190 -__SYSCALL(190, sys_getrusage, 2) -#define __NR_futex				191 -__SYSCALL(191, sys_futex, 5) -#define __NR_gettimeofday 			192 -__SYSCALL(192, sys_gettimeofday, 2) -#define __NR_settimeofday 			193 -__SYSCALL(193, sys_settimeofday, 2) -#define __NR_adjtimex 				194 -__SYSCALL(194, sys_adjtimex, 1) -#define __NR_nanosleep	 			195 -__SYSCALL(195, sys_nanosleep, 2) -#define __NR_getgroups 				196 -__SYSCALL(196, sys_getgroups, 2) -#define __NR_setgroups 				197 -__SYSCALL(197, sys_setgroups, 2) -#define __NR_sethostname 			198 -__SYSCALL(198, sys_sethostname, 2) -#define __NR_setdomainname 			199 -__SYSCALL(199, sys_setdomainname, 2) -#define __NR_syslog 				200 -__SYSCALL(200, sys_syslog, 3) -#define __NR_vhangup 				201 -__SYSCALL(201, sys_vhangup, 0) -#define __NR_uselib 				202 -__SYSCALL(202, sys_uselib, 1) -#define __NR_reboot 				203 -__SYSCALL(203, sys_reboot, 3) -#define __NR_quotactl 				204 -__SYSCALL(204, sys_quotactl, 4) -#define __NR_nfsservctl 			205 -__SYSCALL(205, sys_nfsservctl, 3) -#define __NR__sysctl 				206 -__SYSCALL(206, sys_sysctl, 1) -#define __NR_bdflush 				207 -__SYSCALL(207, sys_bdflush, 2) -#define __NR_uname 				208 -__SYSCALL(208, sys_newuname, 1) -#define __NR_sysinfo 				209 -__SYSCALL(209, sys_sysinfo, 1) -#define __NR_init_module 			210 -__SYSCALL(210, sys_init_module, 2) -#define __NR_delete_module 			211 -__SYSCALL(211, sys_delete_module, 1) - -#define __NR_sched_setparam 			212 -__SYSCALL(212, sys_sched_setparam, 2) -#define __NR_sched_getparam 			213 -__SYSCALL(213, sys_sched_getparam, 2) -#define __NR_sched_setscheduler 		214 -__SYSCALL(214, sys_sched_setscheduler, 3) -#define __NR_sched_getscheduler 		215 -__SYSCALL(215, sys_sched_getscheduler, 1) -#define __NR_sched_get_priority_max 		216 -__SYSCALL(216, sys_sched_get_priority_max, 1) -#define __NR_sched_get_priority_min 		217 -__SYSCALL(217, sys_sched_get_priority_min, 1) -#define __NR_sched_rr_get_interval 		218 -__SYSCALL(218, sys_sched_rr_get_interval, 2) -#define __NR_sched_yield 			219 -__SYSCALL(219, sys_sched_yield, 0) -#define __NR_available222 			222 -__SYSCALL(222, sys_ni_syscall, 0) - -/* Signal Handling */ - -#define __NR_restart_syscall 			223 -__SYSCALL(223, sys_restart_syscall, 0) -#define __NR_sigaltstack 			224 -__SYSCALL(224, xtensa_sigaltstack, 2) -#define __NR_rt_sigreturn 			225 -__SYSCALL(225, xtensa_rt_sigreturn, 1) -#define __NR_rt_sigaction 			226 -__SYSCALL(226, sys_rt_sigaction, 4) -#define __NR_rt_sigprocmask 			227 -__SYSCALL(227, sys_rt_sigprocmask, 4) -#define __NR_rt_sigpending 			228 -__SYSCALL(228, sys_rt_sigpending, 2) -#define __NR_rt_sigtimedwait 			229 -__SYSCALL(229, sys_rt_sigtimedwait, 4) -#define __NR_rt_sigqueueinfo 			230 -__SYSCALL(230, sys_rt_sigqueueinfo, 3) -#define __NR_rt_sigsuspend 			231 -__SYSCALL(231, xtensa_rt_sigsuspend, 2) - -/* Message */ - -#define __NR_mq_open 				232 -__SYSCALL(232, sys_mq_open, 4) -#define __NR_mq_unlink 				233 -__SYSCALL(233, sys_mq_unlink, 1) -#define __NR_mq_timedsend 			234 -__SYSCALL(234, sys_mq_timedsend, 5) -#define __NR_mq_timedreceive 			235 -__SYSCALL(235, sys_mq_timedreceive, 5) -#define __NR_mq_notify 				236 -__SYSCALL(236, sys_mq_notify, 2) -#define __NR_mq_getsetattr 			237 -__SYSCALL(237, sys_mq_getsetattr, 3) -#define __NR_available238			238 -__SYSCALL(238, sys_ni_syscall, 0) - -/* IO */ - -#define __NR_io_setup 				239 -__SYSCALL(239, sys_io_setup, 2) -#define __NR_io_destroy 			240 -__SYSCALL(240, sys_io_destroy, 1) -#define __NR_io_submit 				241 -__SYSCALL(241, sys_io_submit, 3) -#define __NR_io_getevents 			242 -__SYSCALL(242, sys_io_getevents, 5) -#define __NR_io_cancel 				243 -__SYSCALL(243, sys_io_cancel, 3) -#define __NR_clock_settime 			244 -__SYSCALL(244, sys_clock_settime, 2) -#define __NR_clock_gettime 			245 -__SYSCALL(245, sys_clock_gettime, 2) -#define __NR_clock_getres 			246 -__SYSCALL(246, sys_clock_getres, 2) -#define __NR_clock_nanosleep 			247 -__SYSCALL(247, sys_clock_nanosleep, 4) - -/* Timer */ - -#define __NR_timer_create 			248 -__SYSCALL(248, sys_timer_create, 3) -#define __NR_timer_delete 			249 -__SYSCALL(249, sys_timer_delete, 1) -#define __NR_timer_settime 			250 -__SYSCALL(250, sys_timer_settime, 4) -#define __NR_timer_gettime 			251 -__SYSCALL(251, sys_timer_gettime, 2) -#define __NR_timer_getoverrun 			252 -__SYSCALL(252, sys_timer_getoverrun, 1) - -/* System */ - -#define __NR_reserved244 			253 -__SYSCALL(253, sys_ni_syscall, 0) -#define __NR_lookup_dcookie 			254 -__SYSCALL(254, sys_lookup_dcookie, 4) -#define __NR_available255			255 -__SYSCALL(255, sys_ni_syscall, 0) -#define __NR_add_key 				256 -__SYSCALL(256, sys_add_key, 5) -#define __NR_request_key 			257 -__SYSCALL(257, sys_request_key, 5) -#define __NR_keyctl 				258 -__SYSCALL(258, sys_keyctl, 5) -#define __NR_available259			259 -__SYSCALL(259, sys_ni_syscall, 0) - - -#define __NR_readahead				260 -__SYSCALL(260, sys_readahead, 5) -#define __NR_remap_file_pages			261 -__SYSCALL(261, sys_remap_file_pages, 5) -#define __NR_migrate_pages			262 -__SYSCALL(262, sys_migrate_pages, 0) -#define __NR_mbind				263 -__SYSCALL(263, sys_mbind, 6) -#define __NR_get_mempolicy			264 -__SYSCALL(264, sys_get_mempolicy, 5) -#define __NR_set_mempolicy			265 -__SYSCALL(265, sys_set_mempolicy, 3) -#define __NR_unshare				266 -__SYSCALL(266, sys_unshare, 1) -#define __NR_move_pages				267 -__SYSCALL(267, sys_move_pages, 0) -#define __NR_splice				268 -__SYSCALL(268, sys_splice, 0) -#define __NR_tee				269 -__SYSCALL(269, sys_tee, 0) -#define __NR_vmsplice				270 -__SYSCALL(270, sys_vmsplice, 0) -#define __NR_available271			271 -__SYSCALL(271, sys_ni_syscall, 0) - -#define __NR_pselect6				272 -__SYSCALL(272, sys_pselect6, 0) -#define __NR_ppoll				273 -__SYSCALL(273, sys_ppoll, 0) -#define __NR_epoll_pwait			274 -__SYSCALL(274, sys_epoll_pwait, 0) -#define __NR_available275			275 -__SYSCALL(275, sys_ni_syscall, 0) - -#define __NR_inotify_init			276 -__SYSCALL(276, sys_inotify_init, 0) -#define __NR_inotify_add_watch			277 -__SYSCALL(277, sys_inotify_add_watch, 3) -#define __NR_inotify_rm_watch			278 -__SYSCALL(278, sys_inotify_rm_watch, 2) -#define __NR_available279			279 -__SYSCALL(279, sys_ni_syscall, 0) - -#define __NR_getcpu				280 -__SYSCALL(280, sys_getcpu, 0) -#define __NR_kexec_load				281 -__SYSCALL(281, sys_ni_syscall, 0) - -#define __NR_ioprio_set				282 -__SYSCALL(282, sys_ioprio_set, 2) -#define __NR_ioprio_get				283 -__SYSCALL(283, sys_ioprio_get, 3) - -#define __NR_set_robust_list			284 -__SYSCALL(284, sys_set_robust_list, 3) -#define __NR_get_robust_list			285 -__SYSCALL(285, sys_get_robust_list, 3) -#define __NR_reserved286			286	/* sync_file_rangeX */ -__SYSCALL(286, sys_ni_syscall, 3) -#define __NR_available287			287 -__SYSCALL(287, sys_faccessat, 0) - -/* Relative File Operations */ - -#define __NR_openat				288 -__SYSCALL(288, sys_openat, 4) -#define __NR_mkdirat				289 -__SYSCALL(289, sys_mkdirat, 3) -#define __NR_mknodat				290 -__SYSCALL(290, sys_mknodat, 4) -#define __NR_unlinkat				291 -__SYSCALL(291, sys_unlinkat, 3) -#define __NR_renameat				292 -__SYSCALL(292, sys_renameat, 4) -#define __NR_linkat				293 -__SYSCALL(293, sys_linkat, 5) -#define __NR_symlinkat				294 -__SYSCALL(294, sys_symlinkat, 3) -#define __NR_readlinkat				295 -__SYSCALL(295, sys_readlinkat, 4) -#define __NR_utimensat				296 -__SYSCALL(296, sys_utimensat, 0) -#define __NR_fchownat				297 -__SYSCALL(297, sys_fchownat, 5) -#define __NR_futimesat				298 -__SYSCALL(298, sys_futimesat, 4) -#define __NR_fstatat64				299 -__SYSCALL(299, sys_fstatat64, 0) -#define __NR_fchmodat				300 -__SYSCALL(300, sys_fchmodat, 4) -#define __NR_faccessat				301 -__SYSCALL(301, sys_faccessat, 4) -#define __NR_available302			302 -__SYSCALL(302, sys_ni_syscall, 0) -#define __NR_available303			303 -__SYSCALL(303, sys_ni_syscall, 0) - -#define __NR_signalfd				304 -__SYSCALL(304, sys_signalfd, 3) -/*  305 was __NR_timerfd  */ -__SYSCALL(305, sys_ni_syscall, 0) -#define __NR_eventfd				306 -__SYSCALL(306, sys_eventfd, 1) -#define __NR_recvmmsg				307 -__SYSCALL(307, sys_recvmmsg, 5) - -#define __NR_syscall_count			308 - -/* - * sysxtensa syscall handler - * - * int sysxtensa (SYS_XTENSA_ATOMIC_SET,     ptr, val,    unused); - * int sysxtensa (SYS_XTENSA_ATOMIC_ADD,     ptr, val,    unused); - * int sysxtensa (SYS_XTENSA_ATOMIC_EXG_ADD, ptr, val,    unused); - * int sysxtensa (SYS_XTENSA_ATOMIC_CMP_SWP, ptr, oldval, newval); - *        a2            a6                   a3    a4      a5 - */ - -#define SYS_XTENSA_RESERVED               0     /* don't use this */ -#define SYS_XTENSA_ATOMIC_SET             1     /* set variable */ -#define SYS_XTENSA_ATOMIC_EXG_ADD         2     /* exchange memory and add */ -#define SYS_XTENSA_ATOMIC_ADD             3     /* add to memory */ -#define SYS_XTENSA_ATOMIC_CMP_SWP         4     /* compare and swap */ - -#define SYS_XTENSA_COUNT                  5     /* count */ - -#ifdef __KERNEL__ - -/* - * "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_SYS_CLONE +#include <uapi/asm/unistd.h>  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_UTIME  #define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND  #define __ARCH_WANT_SYS_GETPGRP  /*  @@ -733,5 +21,4 @@ __SYSCALL(307, sys_recvmmsg, 5)  #define __IGNORE_vfork				/* use clone */  #define __IGNORE_fadvise64			/* use fadvise64_64 */ -#endif	/* __KERNEL__ */ -#endif	/* _XTENSA_UNISTD_H */ +#endif /* _XTENSA_UNISTD_H */ diff --git a/arch/xtensa/include/asm/vectors.h b/arch/xtensa/include/asm/vectors.h new file mode 100644 index 00000000000..f74ddfbb92e --- /dev/null +++ b/arch/xtensa/include/asm/vectors.h @@ -0,0 +1,130 @@ +/* + * arch/xtensa/include/asm/xchal_vaddr_remap.h + * + * Xtensa macros for MMU V3 Support. Deals with re-mapping the Virtual + * Memory Addresses from "Virtual == Physical" to their prevvious V2 MMU + * mappings (KSEG at 0xD0000000 and KIO at 0XF0000000). + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2008 - 2012 Tensilica Inc. + * + * Pete Delaney <piet@tensilica.com> + * Marc Gauthier <marc@tensilica.com + */ + +#ifndef _XTENSA_VECTORS_H +#define _XTENSA_VECTORS_H + +#include <variant/core.h> + +#define XCHAL_KIO_CACHED_VADDR		0xe0000000 +#define XCHAL_KIO_BYPASS_VADDR		0xf0000000 +#define XCHAL_KIO_DEFAULT_PADDR		0xf0000000 +#define XCHAL_KIO_SIZE			0x10000000 + +#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) +#define XCHAL_KIO_PADDR			xtensa_get_kio_paddr() +#else +#define XCHAL_KIO_PADDR			XCHAL_KIO_DEFAULT_PADDR +#endif + +#if defined(CONFIG_MMU) + +/* Will Become VECBASE */ +#define VIRTUAL_MEMORY_ADDRESS		0xD0000000 + +/* Image Virtual Start Address */ +#define KERNELOFFSET			0xD0003000 + +#if defined(XCHAL_HAVE_PTP_MMU) && XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY +  /* MMU v3  - XCHAL_HAVE_PTP_MMU  == 1 */ +  #define LOAD_MEMORY_ADDRESS		0x00003000 +#else +  /* MMU V2 -  XCHAL_HAVE_PTP_MMU  == 0 */ +  #define LOAD_MEMORY_ADDRESS		0xD0003000 +#endif + +#else /* !defined(CONFIG_MMU) */ +  /* MMU Not being used - Virtual == Physical */ + +  /* VECBASE */ +  #define VIRTUAL_MEMORY_ADDRESS	0x00002000 + +  /* Location of the start of the kernel text, _start */ +  #define KERNELOFFSET			0x00003000 + +  /* Loaded just above possibly live vectors */ +  #define LOAD_MEMORY_ADDRESS		0x00003000 + +#endif /* CONFIG_MMU */ + +#define XC_VADDR(offset)		(VIRTUAL_MEMORY_ADDRESS  + offset) + +/* Used to set VECBASE register */ +#define VECBASE_RESET_VADDR		VIRTUAL_MEMORY_ADDRESS + +#define RESET_VECTOR_VECOFS		(XCHAL_RESET_VECTOR_VADDR - \ +						VECBASE_RESET_VADDR) +#define RESET_VECTOR_VADDR		XC_VADDR(RESET_VECTOR_VECOFS) + +#define RESET_VECTOR1_VECOFS		(XCHAL_RESET_VECTOR1_VADDR - \ +						VECBASE_RESET_VADDR) +#define RESET_VECTOR1_VADDR		XC_VADDR(RESET_VECTOR1_VECOFS) + +#if defined(XCHAL_HAVE_VECBASE) && XCHAL_HAVE_VECBASE + +#define USER_VECTOR_VADDR		XC_VADDR(XCHAL_USER_VECOFS) +#define KERNEL_VECTOR_VADDR		XC_VADDR(XCHAL_KERNEL_VECOFS) +#define DOUBLEEXC_VECTOR_VADDR		XC_VADDR(XCHAL_DOUBLEEXC_VECOFS) +#define WINDOW_VECTORS_VADDR		XC_VADDR(XCHAL_WINDOW_OF4_VECOFS) +#define INTLEVEL2_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL2_VECOFS) +#define INTLEVEL3_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL3_VECOFS) +#define INTLEVEL4_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL4_VECOFS) +#define INTLEVEL5_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL5_VECOFS) +#define INTLEVEL6_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL6_VECOFS) + +#define DEBUG_VECTOR_VADDR		XC_VADDR(XCHAL_DEBUG_VECOFS) + +#define NMI_VECTOR_VADDR		XC_VADDR(XCHAL_NMI_VECOFS) + +#define INTLEVEL7_VECTOR_VADDR		XC_VADDR(XCHAL_INTLEVEL7_VECOFS) + +/* + * These XCHAL_* #defines from varian/core.h + * are not valid to use with V3 MMU. Non-XCHAL + * constants are defined above and should be used. + */ +#undef  XCHAL_VECBASE_RESET_VADDR +#undef  XCHAL_RESET_VECTOR0_VADDR +#undef  XCHAL_USER_VECTOR_VADDR +#undef  XCHAL_KERNEL_VECTOR_VADDR +#undef  XCHAL_DOUBLEEXC_VECTOR_VADDR +#undef  XCHAL_WINDOW_VECTORS_VADDR +#undef  XCHAL_INTLEVEL2_VECTOR_VADDR +#undef  XCHAL_INTLEVEL3_VECTOR_VADDR +#undef  XCHAL_INTLEVEL4_VECTOR_VADDR +#undef  XCHAL_INTLEVEL5_VECTOR_VADDR +#undef  XCHAL_INTLEVEL6_VECTOR_VADDR +#undef  XCHAL_DEBUG_VECTOR_VADDR +#undef  XCHAL_NMI_VECTOR_VADDR +#undef  XCHAL_INTLEVEL7_VECTOR_VADDR + +#else + +#define USER_VECTOR_VADDR		XCHAL_USER_VECTOR_VADDR +#define KERNEL_VECTOR_VADDR		XCHAL_KERNEL_VECTOR_VADDR +#define DOUBLEEXC_VECTOR_VADDR		XCHAL_DOUBLEEXC_VECTOR_VADDR +#define WINDOW_VECTORS_VADDR		XCHAL_WINDOW_VECTORS_VADDR +#define INTLEVEL2_VECTOR_VADDR		XCHAL_INTLEVEL2_VECTOR_VADDR +#define INTLEVEL3_VECTOR_VADDR		XCHAL_INTLEVEL3_VECTOR_VADDR +#define INTLEVEL4_VECTOR_VADDR		XCHAL_INTLEVEL4_VECTOR_VADDR +#define INTLEVEL5_VECTOR_VADDR		XCHAL_INTLEVEL5_VECTOR_VADDR +#define INTLEVEL6_VECTOR_VADDR		XCHAL_INTLEVEL6_VECTOR_VADDR +#define DEBUG_VECTOR_VADDR		XCHAL_DEBUG_VECTOR_VADDR + +#endif + +#endif /* _XTENSA_VECTORS_H */ diff --git a/arch/xtensa/include/asm/xor.h b/arch/xtensa/include/asm/xor.h deleted file mode 100644 index e7b1f083991..00000000000 --- a/arch/xtensa/include/asm/xor.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * include/asm-xtensa/xor.h - * - * This file is subject to the terms and conditions of the GNU General Public - * License.  See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2001 - 2005 Tensilica Inc. - */ - -#ifndef _XTENSA_XOR_H -#define _XTENSA_XOR_H - -#include <asm-generic/xor.h> - -#endif  | 
