diff options
Diffstat (limited to 'arch/microblaze/include/asm')
74 files changed, 634 insertions, 1603 deletions
diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild index db5294c30ca..35b3ecaf25d 100644 --- a/arch/microblaze/include/asm/Kbuild +++ b/arch/microblaze/include/asm/Kbuild @@ -1,3 +1,11 @@ -include include/asm-generic/Kbuild.asm -header-y  += elf.h +generic-y += barrier.h +generic-y += clkdev.h +generic-y += cputime.h +generic-y += device.h +generic-y += exec.h +generic-y += hash.h +generic-y += mcs_spinlock.h +generic-y += preempt.h +generic-y += syscalls.h +generic-y += trace_clock.h diff --git a/arch/microblaze/include/asm/atomic.h b/arch/microblaze/include/asm/atomic.h index 6d2e1d418be..42ac382a09d 100644 --- a/arch/microblaze/include/asm/atomic.h +++ b/arch/microblaze/include/asm/atomic.h @@ -1,7 +1,9 @@  #ifndef _ASM_MICROBLAZE_ATOMIC_H  #define _ASM_MICROBLAZE_ATOMIC_H +#include <asm/cmpxchg.h>  #include <asm-generic/atomic.h> +#include <asm-generic/atomic64.h>  /*   * Atomically test *v and decrement if it is greater than 0. @@ -20,5 +22,6 @@ static inline int atomic_dec_if_positive(atomic_t *v)  	return res;  } +#define atomic_dec_if_positive atomic_dec_if_positive  #endif /* _ASM_MICROBLAZE_ATOMIC_H */ diff --git a/arch/microblaze/include/asm/auxvec.h b/arch/microblaze/include/asm/auxvec.h deleted file mode 100644 index 8b137891791..00000000000 --- a/arch/microblaze/include/asm/auxvec.h +++ /dev/null @@ -1 +0,0 @@ - diff --git a/arch/microblaze/include/asm/bitsperlong.h b/arch/microblaze/include/asm/bitsperlong.h deleted file mode 100644 index 6dc0bb0c13b..00000000000 --- a/arch/microblaze/include/asm/bitsperlong.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/bitsperlong.h> diff --git a/arch/microblaze/include/asm/byteorder.h b/arch/microblaze/include/asm/byteorder.h deleted file mode 100644 index 31902762a42..00000000000 --- a/arch/microblaze/include/asm/byteorder.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _ASM_MICROBLAZE_BYTEORDER_H -#define _ASM_MICROBLAZE_BYTEORDER_H - -#ifdef __MICROBLAZEEL__ -#include <linux/byteorder/little_endian.h> -#else -#include <linux/byteorder/big_endian.h> -#endif - -#endif /* _ASM_MICROBLAZE_BYTEORDER_H */ diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h index 7ebd955460d..ffea82a16d2 100644 --- a/arch/microblaze/include/asm/cacheflush.h +++ b/arch/microblaze/include/asm/cacheflush.h @@ -84,12 +84,13 @@ do { \  #define flush_dcache_mmap_lock(mapping)		do { } while (0)  #define flush_dcache_mmap_unlock(mapping)	do { } while (0) -  #define flush_cache_dup_mm(mm)				do { } while (0)  #define flush_cache_vmap(start, end)			do { } while (0)  #define flush_cache_vunmap(start, end)			do { } while (0)  #define flush_cache_mm(mm)			do { } while (0) -#define flush_cache_page(vma, vmaddr, pfn)	do { } while (0) + +#define flush_cache_page(vma, vmaddr, pfn) \ +	flush_dcache_range(pfn << PAGE_SHIFT, (pfn << PAGE_SHIFT) + PAGE_SIZE);  /* MS: kgdb code use this macro, wrong len with FLASH */  #if 0 @@ -101,17 +102,23 @@ do { \  #define flush_cache_range(vma, start, len) do { } while (0) -#define copy_to_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	u32 addr = virt_to_phys(dst);					\ -	invalidate_icache_range((unsigned) (addr), (unsigned) (addr) + (len));\ -	memcpy((dst), (src), (len));					\ -	flush_dcache_range((unsigned) (addr), (unsigned) (addr) + (len));\ -} while (0) - -#define copy_from_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	memcpy((dst), (src), (len));					\ -} while (0) +static inline void copy_to_user_page(struct vm_area_struct *vma, +				     struct page *page, unsigned long vaddr, +				     void *dst, void *src, int len) +{ +	u32 addr = virt_to_phys(dst); +	memcpy(dst, src, len); +	if (vma->vm_flags & VM_EXEC) { +		invalidate_icache_range(addr, addr + PAGE_SIZE); +		flush_dcache_range(addr, addr + PAGE_SIZE); +	} +} + +static inline void copy_from_user_page(struct vm_area_struct *vma, +				       struct page *page, unsigned long vaddr, +				       void *dst, void *src, int len) +{ +	memcpy(dst, src, len); +}  #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ diff --git a/arch/microblaze/include/asm/clinkage.h b/arch/microblaze/include/asm/clinkage.h deleted file mode 100644 index 9e218435a55..00000000000 --- a/arch/microblaze/include/asm/clinkage.h +++ /dev/null @@ -1 +0,0 @@ -#include <linux/linkage.h> diff --git a/arch/microblaze/include/asm/cmpxchg.h b/arch/microblaze/include/asm/cmpxchg.h new file mode 100644 index 00000000000..538afc0ab9f --- /dev/null +++ b/arch/microblaze/include/asm/cmpxchg.h @@ -0,0 +1,42 @@ +#ifndef _ASM_MICROBLAZE_CMPXCHG_H +#define _ASM_MICROBLAZE_CMPXCHG_H + +#include <linux/irqflags.h> + +void __bad_xchg(volatile void *ptr, int size); + +static inline unsigned long __xchg(unsigned long x, volatile void *ptr, +								int size) +{ +	unsigned long ret; +	unsigned long flags; + +	switch (size) { +	case 1: +		local_irq_save(flags); +		ret = *(volatile unsigned char *)ptr; +		*(volatile unsigned char *)ptr = x; +		local_irq_restore(flags); +		break; + +	case 4: +		local_irq_save(flags); +		ret = *(volatile unsigned long *)ptr; +		*(volatile unsigned long *)ptr = x; +		local_irq_restore(flags); +		break; +	default: +		__bad_xchg(ptr, size), ret = 0; +		break; +	} + +	return ret; +} + +#define xchg(ptr, x) \ +	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) + +#include <asm-generic/cmpxchg.h> +#include <asm-generic/cmpxchg-local.h> + +#endif /* _ASM_MICROBLAZE_CMPXCHG_H */ diff --git a/arch/microblaze/include/asm/cpuinfo.h b/arch/microblaze/include/asm/cpuinfo.h index cd257537ae5..3337417fcdc 100644 --- a/arch/microblaze/include/asm/cpuinfo.h +++ b/arch/microblaze/include/asm/cpuinfo.h @@ -38,6 +38,7 @@ struct cpuinfo {  	u32 use_exc;  	u32 ver_code;  	u32 mmu; +	u32 mmu_privins;  	u32 endian;  	/* CPU caches */ @@ -90,15 +91,18 @@ extern struct cpuinfo cpuinfo;  /* fwd declarations of the various CPUinfo populators */  void setup_cpuinfo(void); +void setup_cpuinfo_clk(void);  void set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu);  void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu);  static inline unsigned int fcpu(struct device_node *cpu, char *n)  { -	int *val; -	return (val = (int *) of_get_property(cpu, n, NULL)) ? -							be32_to_cpup(val) : 0; +	u32 val = 0; + +	of_property_read_u32(cpu, n, &val); + +	return val;  }  #endif /* _ASM_MICROBLAZE_CPUINFO_H */ diff --git a/arch/microblaze/include/asm/cputime.h b/arch/microblaze/include/asm/cputime.h deleted file mode 100644 index 6d68ad7e0ea..00000000000 --- a/arch/microblaze/include/asm/cputime.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/cputime.h> diff --git a/arch/microblaze/include/asm/delay.h b/arch/microblaze/include/asm/delay.h index 05b7d39e439..66fc24c2423 100644 --- a/arch/microblaze/include/asm/delay.h +++ b/arch/microblaze/include/asm/delay.h @@ -13,6 +13,8 @@  #ifndef _ASM_MICROBLAZE_DELAY_H  #define _ASM_MICROBLAZE_DELAY_H +#include <linux/param.h> +  extern inline void __delay(unsigned long loops)  {  	asm volatile ("# __delay		\n\t"		\ diff --git a/arch/microblaze/include/asm/device.h b/arch/microblaze/include/asm/device.h deleted file mode 100644 index 123b2fe72d0..00000000000 --- a/arch/microblaze/include/asm/device.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Arch specific extensions to struct device - * - * This file is subject to the terms and conditions of the GNU General Public - * License v2. See the file "COPYING" in the main directory of this archive - * for more details. - */ - -#ifndef _ASM_MICROBLAZE_DEVICE_H -#define _ASM_MICROBLAZE_DEVICE_H - -struct device_node; - -struct dev_archdata { -	/* DMA operations on that device */ -	struct dma_map_ops	*dma_ops; -	void                    *dma_data; -}; - -struct pdev_archdata { -	u64 dma_mask; -}; - -#endif /* _ASM_MICROBLAZE_DEVICE_H */ - - diff --git a/arch/microblaze/include/asm/dma-mapping.h b/arch/microblaze/include/asm/dma-mapping.h index 8fbb0ec1023..ab353723076 100644 --- a/arch/microblaze/include/asm/dma-mapping.h +++ b/arch/microblaze/include/asm/dma-mapping.h @@ -16,7 +16,7 @@  #define _ASM_MICROBLAZE_DMA_MAPPING_H  /* - * See Documentation/PCI/PCI-DMA-mapping.txt and + * See Documentation/DMA-API-HOWTO.txt and   * Documentation/DMA-API.txt for documentation.   */ @@ -28,22 +28,12 @@  #include <linux/dma-attrs.h>  #include <asm/io.h>  #include <asm-generic/dma-coherent.h> +#include <asm/cacheflush.h>  #define DMA_ERROR_CODE		(~(dma_addr_t)0x0)  #define __dma_alloc_coherent(dev, gfp, size, handle)	NULL  #define __dma_free_coherent(size, addr)		((void)0) -#define __dma_sync(addr, size, rw)		((void)0) - -static inline unsigned long device_to_mask(struct device *dev) -{ -	if (dev->dma_mask && *dev->dma_mask) -		return *dev->dma_mask; -	/* Assume devices without mask can take 32 bit addresses */ -	return 0xfffffffful; -} - -extern struct dma_map_ops *dma_ops;  /*   * Available generic sets of operations @@ -52,20 +42,7 @@ extern struct dma_map_ops dma_direct_ops;  static inline struct dma_map_ops *get_dma_ops(struct device *dev)  { -	/* We don't handle the NULL dev case for ISA for now. We could -	 * do it via an out of line call but it is not needed for now. The -	 * only ISA DMA device we support is the floppy and we have a hack -	 * in the floppy driver directly to get a device for us. -	 */ -	if (unlikely(!dev) || !dev->archdata.dma_ops) -		return NULL; - -	return dev->archdata.dma_ops; -} - -static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) -{ -	dev->archdata.dma_ops = ops; +	return &dma_direct_ops;  }  static inline int dma_supported(struct device *dev, u64 mask) @@ -95,9 +72,27 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask)  #include <asm-generic/dma-mapping-common.h> +static inline void __dma_sync(unsigned long paddr, +			      size_t size, enum dma_data_direction direction) +{ +	switch (direction) { +	case DMA_TO_DEVICE: +	case DMA_BIDIRECTIONAL: +		flush_dcache_range(paddr, paddr + size); +		break; +	case DMA_FROM_DEVICE: +		invalidate_dcache_range(paddr, paddr + size); +		break; +	default: +		BUG(); +	} +} +  static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)  {  	struct dma_map_ops *ops = get_dma_ops(dev); + +	debug_dma_mapping_error(dev, dma_addr);  	if (ops->mapping_error)  		return ops->mapping_error(dev, dma_addr); @@ -107,35 +102,41 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)  #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) -static inline void *dma_alloc_coherent(struct device *dev, size_t size, -					dma_addr_t *dma_handle, gfp_t flag) +#define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) + +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *dma_handle, gfp_t flag, +				    struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = get_dma_ops(dev);  	void *memory;  	BUG_ON(!ops); -	memory = ops->alloc_coherent(dev, size, dma_handle, flag); +	memory = ops->alloc(dev, size, dma_handle, flag, attrs);  	debug_dma_alloc_coherent(dev, size, *dma_handle, memory);  	return memory;  } -static inline void dma_free_coherent(struct device *dev, size_t size, -				     void *cpu_addr, dma_addr_t dma_handle) +#define dma_free_coherent(d,s,c,h) dma_free_attrs(d, s, c, h, NULL) + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *cpu_addr, dma_addr_t dma_handle, +				  struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = get_dma_ops(dev);  	BUG_ON(!ops);  	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); -	ops->free_coherent(dev, size, cpu_addr, dma_handle); +	ops->free(dev, size, cpu_addr, dma_handle, attrs);  }  static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,  		enum dma_data_direction direction)  {  	BUG_ON(direction == DMA_NONE); -	__dma_sync(vaddr, size, (int)direction); +	__dma_sync(virt_to_phys(vaddr), size, (int)direction);  }  #endif	/* _ASM_MICROBLAZE_DMA_MAPPING_H */ diff --git a/arch/microblaze/include/asm/elf.h b/arch/microblaze/include/asm/elf.h index 098dfdde4b0..65902444906 100644 --- a/arch/microblaze/include/asm/elf.h +++ b/arch/microblaze/include/asm/elf.h @@ -7,116 +7,24 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_ELF_H  #define _ASM_MICROBLAZE_ELF_H -/* - * Note there is no "official" ELF designation for Microblaze. - * I've snaffled the value from the microblaze binutils source code - * /binutils/microblaze/include/elf/microblaze.h - */ -#define EM_XILINX_MICROBLAZE	0xbaab -#define ELF_ARCH		EM_XILINX_MICROBLAZE - -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -#define elf_check_arch(x)	((x)->e_machine == EM_XILINX_MICROBLAZE) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS	ELFCLASS32 +#include <uapi/asm/elf.h>  #ifndef __uClinux__ - -/* - * ELF register definitions.. - */ - -#include <asm/ptrace.h> -#include <asm/byteorder.h> -  #ifndef ELF_GREG_T -#define ELF_GREG_T -typedef unsigned long elf_greg_t;  #endif -  #ifndef ELF_NGREG -#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))  #endif -  #ifndef ELF_GREGSET_T -#define ELF_GREGSET_T -typedef elf_greg_t elf_gregset_t[ELF_NGREG];  #endif -  #ifndef ELF_FPREGSET_T -#define ELF_FPREGSET_T - -/* TBD */ -#define ELF_NFPREG	33	/* includes fsr */ -typedef unsigned long elf_fpreg_t; -typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; - -/* typedef struct user_fpu_struct elf_fpregset_t; */  #endif - -/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical - * use of this is to invoke "./ld.so someprog" to test out a new version of - * the loader.  We need to make sure that it is out of the way of the program - * that it will "exec", and that there is sufficient room for the brk. - */ - -#define ELF_ET_DYN_BASE         (0x08000000) -  #ifdef __MICROBLAZEEL__ -#define ELF_DATA	ELFDATA2LSB  #else -#define ELF_DATA	ELFDATA2MSB -#endif - -#define ELF_EXEC_PAGESIZE	PAGE_SIZE - - -#define ELF_CORE_COPY_REGS(_dest, _regs)			\ -	memcpy((char *) &_dest, (char *) _regs,		\ -	sizeof(struct pt_regs)); - -/* This yields a mask that user programs can use to figure out what - * instruction set this CPU supports.  This could be done in user space, - * but it's not easy, and we've already done it here. - */ -#define ELF_HWCAP	(0) - -/* This yields a string that ld.so will use to load implementation - * specific libraries for optimization.  This is more specific in - * intent than poking at uname or /proc/cpuinfo. - - * For the moment, we have only optimizations for the Intel generations, - * but that could change... - */ -#define ELF_PLATFORM  (NULL) - -/* Added _f parameter. Is this definition correct: TBD */ -#define ELF_PLAT_INIT(_r, _f)				\ -do {							\ -	_r->r1 =  _r->r1 =  _r->r2 =  _r->r3 =		\ -	_r->r4 =  _r->r5 =  _r->r6 =  _r->r7 =		\ -	_r->r8 =  _r->r9 =  _r->r10 = _r->r11 =		\ -	_r->r12 = _r->r13 = _r->r14 = _r->r15 =		\ -	_r->r16 = _r->r17 = _r->r18 = _r->r19 =		\ -	_r->r20 = _r->r21 = _r->r22 = _r->r23 =		\ -	_r->r24 = _r->r25 = _r->r26 = _r->r27 =		\ -	_r->r28 = _r->r29 = _r->r30 = _r->r31 =		\ -	0;						\ -} while (0) - -#ifdef __KERNEL__ -#define SET_PERSONALITY(ex) set_personality(PER_LINUX_32BIT)  #endif - +#define SET_PERSONALITY(ex) \ +	set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))  #endif /* __uClinux__ */ -  #endif /* _ASM_MICROBLAZE_ELF_H */ diff --git a/arch/microblaze/include/asm/entry.h b/arch/microblaze/include/asm/entry.h index ec89f2ad0fe..b4a4cb150aa 100644 --- a/arch/microblaze/include/asm/entry.h +++ b/arch/microblaze/include/asm/entry.h @@ -29,42 +29,8 @@ DECLARE_PER_CPU(unsigned int, KM); /* Kernel/user mode */  DECLARE_PER_CPU(unsigned int, ENTRY_SP); /* Saved SP on kernel entry */  DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */  DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ -# endif /* __ASSEMBLY__ */ - -#ifndef CONFIG_MMU - -/* noMMU hasn't any space for args */ -# define STATE_SAVE_ARG_SPACE	(0) -#else /* CONFIG_MMU */ - -/* If true, system calls save and restore all registers (except result - * registers, of course).  If false, then `call clobbered' registers - * will not be preserved, on the theory that system calls are basically - * function calls anyway, and the caller should be able to deal with it. - * This is a security risk, of course, as `internal' values may leak out - * after a system call, but that certainly doesn't matter very much for - * a processor with no MMU protection!  For a protected-mode kernel, it - * would be faster to just zero those registers before returning. - * - * I can not rely on the glibc implementation. If you turn it off make - * sure that r11/r12 is saved in user-space. --KAA - * - * These are special variables using by the kernel trap/interrupt code - * to save registers in, at a time when there are no spare registers we - * can use to do so, and we can't depend on the value of the stack - * pointer.  This means that they must be within a signed 16-bit - * displacement of 0x00000000. - */ - -/* A `state save frame' is a struct pt_regs preceded by some extra space - * suitable for a function call stack frame. */ - -/* Amount of room on the stack reserved for arguments and to satisfy the - * C calling conventions, in addition to the space used by the struct - * pt_regs that actually holds saved values. */ -#define STATE_SAVE_ARG_SPACE	(6*4) /* Up to six arguments */ - -#endif /* CONFIG_MMU */ +extern asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall); +# endif /* __ASSEMBLY__ */  #endif /* _ASM_MICROBLAZE_ENTRY_H */ diff --git a/arch/microblaze/include/asm/errno.h b/arch/microblaze/include/asm/errno.h deleted file mode 100644 index 4c82b503d92..00000000000 --- a/arch/microblaze/include/asm/errno.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/errno.h> diff --git a/arch/microblaze/include/asm/exceptions.h b/arch/microblaze/include/asm/exceptions.h index 6479097b802..e6a8ddea1dc 100644 --- a/arch/microblaze/include/asm/exceptions.h +++ b/arch/microblaze/include/asm/exceptions.h @@ -66,6 +66,9 @@  asmlinkage void full_exception(struct pt_regs *regs, unsigned int type,  							int fsr, int addr); +asmlinkage void sw_exception(struct pt_regs *regs); +void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig); +  void die(const char *str, struct pt_regs *fp, long err);  void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr); diff --git a/arch/microblaze/include/asm/fcntl.h b/arch/microblaze/include/asm/fcntl.h deleted file mode 100644 index 46ab12db573..00000000000 --- a/arch/microblaze/include/asm/fcntl.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/fcntl.h> diff --git a/arch/microblaze/include/asm/fixmap.h b/arch/microblaze/include/asm/fixmap.h new file mode 100644 index 00000000000..06c0e2b1883 --- /dev/null +++ b/arch/microblaze/include/asm/fixmap.h @@ -0,0 +1,69 @@ +/* + * 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 + * + * Copyright 2008 Freescale Semiconductor Inc. + *   Port to powerpc added by Kumar Gala + * + * Copyright 2011 Michal Simek <monstr@monstr.eu> + * Copyright 2011 PetaLogix Qld Pty Ltd + *   Port to Microblaze + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#ifndef __ASSEMBLY__ +#include <linux/kernel.h> +#include <asm/page.h> +#ifdef CONFIG_HIGHMEM +#include <linux/threads.h> +#include <asm/kmap_types.h> +#endif + +#define FIXADDR_TOP	((unsigned long)(-PAGE_SIZE)) + +/* + * 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 virtual memory (0xfffff000) 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 + * highger than 1) use fixmap_set(idx,phys) to associate + * physical memory with fixmap indices. + * + * TLB entries of such buffers will not be flushed across + * task switches. + */ +enum fixed_addresses { +	FIX_HOLE, +#ifdef CONFIG_HIGHMEM +	FIX_KMAP_BEGIN,	/* reserved pte's for temporary kernel mappings */ +	FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * num_possible_cpus()) - 1, +#endif +	__end_of_fixed_addresses +}; + +extern void __set_fixmap(enum fixed_addresses idx, +					phys_addr_t phys, pgprot_t flags); + +#define __FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START		(FIXADDR_TOP - __FIXADDR_SIZE) + +#define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_CI + +#include <asm-generic/fixmap.h> + +#endif /* !__ASSEMBLY__ */ +#endif diff --git a/arch/microblaze/include/asm/futex.h b/arch/microblaze/include/asm/futex.h index ad3fd61b2fe..01848f056f4 100644 --- a/arch/microblaze/include/asm/futex.h +++ b/arch/microblaze/include/asm/futex.h @@ -24,12 +24,12 @@  			.word	1b,4b,2b,4b;				\  			.previous;"					\  	: "=&r" (oldval), "=&r" (ret)					\ -	: "b" (uaddr), "i" (-EFAULT), "r" (oparg)			\ +	: "r" (uaddr), "i" (-EFAULT), "r" (oparg)			\  	);								\  })  static inline int -futex_atomic_op_inuser(int encoded_op, int __user *uaddr) +futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)  {  	int op = (encoded_op >> 28) & 7;  	int cmp = (encoded_op >> 24) & 15; @@ -39,7 +39,7 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)  	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))  		oparg = 1 << oparg; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	pagefault_disable(); @@ -94,31 +94,34 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)  }  static inline int -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval)  { -	int prev, cmp; +	int ret = 0, cmp; +	u32 prev; -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT; -	__asm__ __volatile__ ("1:	lwx	%0, %2, r0;		\ -					cmp	%1, %0, %3;		\ -					beqi	%1, 3f;			\ -				2:	swx	%4, %2, r0;		\ -					addic	%1, r0, 0;		\ -					bnei	%1, 1b;			\ +	__asm__ __volatile__ ("1:	lwx	%1, %3, r0;		\ +					cmp	%2, %1, %4;		\ +					bnei	%2, 3f;			\ +				2:	swx	%5, %3, r0;		\ +					addic	%2, r0, 0;		\ +					bnei	%2, 1b;			\  				3:					\  				.section .fixup,\"ax\";			\  				4:	brid	3b;			\ -					addik	%0, r0, %5;		\ +					addik	%0, r0, %6;		\  				.previous;				\  				.section __ex_table,\"a\";		\  				.word	1b,4b,2b,4b;			\  				.previous;"				\ -		: "=&r" (prev), "=&r"(cmp)				\ +		: "+r" (ret), "=&r" (prev), "=&r"(cmp)	\  		: "r" (uaddr), "r" (oldval), "r" (newval), "i" (-EFAULT)); -	return prev; +	*uval = prev; +	return ret;  }  #endif /* __KERNEL__ */ diff --git a/arch/microblaze/include/asm/gpio.h b/arch/microblaze/include/asm/gpio.h index 2b2c18be71c..b3799d88ffc 100644 --- a/arch/microblaze/include/asm/gpio.h +++ b/arch/microblaze/include/asm/gpio.h @@ -1,53 +1,4 @@ -/* - * Generic GPIO API implementation 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_MICROBLAZE_GPIO_H -#define _ASM_MICROBLAZE_GPIO_H - -#include <linux/errno.h> -#include <asm-generic/gpio.h> - -#ifdef CONFIG_GPIOLIB - -/* - * We don't (yet) implement inlined/rapid versions for on-chip gpios. - * 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); -} - -static inline int irq_to_gpio(unsigned int irq) -{ -	return -EINVAL; -} - -#endif /* CONFIG_GPIOLIB */ - -#endif /* _ASM_MICROBLAZE_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/microblaze/include/asm/hardirq.h b/arch/microblaze/include/asm/hardirq.h index cd1ac9aad56..fb3c05a0cbb 100644 --- a/arch/microblaze/include/asm/hardirq.h +++ b/arch/microblaze/include/asm/hardirq.h @@ -1,17 +1 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * 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 _ASM_MICROBLAZE_HARDIRQ_H -#define _ASM_MICROBLAZE_HARDIRQ_H - -/* should be defined in each interrupt controller driver */ -extern unsigned int get_irq(struct pt_regs *regs); -  #include <asm-generic/hardirq.h> - -#endif /* _ASM_MICROBLAZE_HARDIRQ_H */ diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h new file mode 100644 index 00000000000..d0463893243 --- /dev/null +++ b/arch/microblaze/include/asm/highmem.h @@ -0,0 +1,96 @@ +/* + * highmem.h: virtual kernel memory mappings for high memory + * + * Used in CONFIG_HIGHMEM systems for memory pages which + * are not addressable by direct kernel virtual addresses. + * + * Copyright (C) 1999 Gerhard Wichert, Siemens AG + *		      Gerhard.Wichert@pdb.siemens.de + * + * + * Redesigned the x86 32-bit VM architecture to deal with + * up to 16 Terabyte physical memory. With current x86 CPUs + * we now support up to 64 Gigabytes physical RAM. + * + * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> + */ +#ifndef _ASM_HIGHMEM_H +#define _ASM_HIGHMEM_H + +#ifdef __KERNEL__ + +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/uaccess.h> +#include <asm/fixmap.h> + +extern pte_t *kmap_pte; +extern pgprot_t kmap_prot; +extern pte_t *pkmap_page_table; + +/* + * Right now we initialize only a single pte table. It can be extended + * easily, subsequent pte tables have to be allocated in one physical + * chunk of RAM. + */ +/* + * We use one full pte table with 4K pages. And with 16K/64K/256K pages pte + * table covers enough memory (32MB/512MB/2GB resp.), so that both FIXMAP + * and PKMAP can be placed in a single pte table. We use 512 pages for PKMAP + * in case of 16K/64K/256K page sizes. + */ + +#define PKMAP_ORDER	PTE_SHIFT +#define LAST_PKMAP	(1 << PKMAP_ORDER) + +#define PKMAP_BASE	((FIXADDR_START - PAGE_SIZE * (LAST_PKMAP + 1)) \ +								& PMD_MASK) + +#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)) + +extern void *kmap_high(struct page *page); +extern void kunmap_high(struct page *page); +extern void *kmap_atomic_prot(struct page *page, pgprot_t prot); +extern void __kunmap_atomic(void *kvaddr); + +static inline void *kmap(struct page *page) +{ +	might_sleep(); +	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 *kmap_atomic(struct page *page) +{ +	return kmap_atomic_prot(page, kmap_prot); +} + +static inline struct page *kmap_atomic_to_page(void *ptr) +{ +	unsigned long idx, vaddr = (unsigned long) ptr; +	pte_t *pte; + +	if (vaddr < FIXADDR_START) +		return virt_to_page(ptr); + +	idx = virt_to_fix(vaddr); +	pte = kmap_pte - (idx - FIX_KMAP_BEGIN); +	return pte_page(*pte); +} + +#define flush_cache_kmaps()	{ flush_icache(); flush_dcache(); } + +#endif /* __KERNEL__ */ + +#endif /* _ASM_HIGHMEM_H */ diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h index eae32220f44..433751b2a00 100644 --- a/arch/microblaze/include/asm/io.h +++ b/arch/microblaze/include/asm/io.h @@ -15,211 +15,38 @@  #include <asm/page.h>  #include <linux/types.h>  #include <linux/mm.h>          /* Get struct page {...} */ -#include <asm-generic/iomap.h>  #ifndef CONFIG_PCI  #define _IO_BASE	0  #define _ISA_MEM_BASE	0 -#define PCI_DRAM_OFFSET	0  #else  #define _IO_BASE	isa_io_base  #define _ISA_MEM_BASE	isa_mem_base -#define PCI_DRAM_OFFSET	pci_dram_offset -#endif +struct pci_dev; +extern void pci_iounmap(struct pci_dev *dev, void __iomem *); +#define pci_iounmap pci_iounmap  extern unsigned long isa_io_base; -extern unsigned long pci_io_base; -extern unsigned long pci_dram_offset; -  extern resource_size_t isa_mem_base; +#endif +#define PCI_IOBASE	((void __iomem *)_IO_BASE)  #define IO_SPACE_LIMIT (0xFFFFFFFF) -static inline unsigned char __raw_readb(const volatile void __iomem *addr) -{ -	return *(volatile unsigned char __force *)addr; -} -static inline unsigned short __raw_readw(const volatile void __iomem *addr) -{ -	return *(volatile unsigned short __force *)addr; -} -static inline unsigned int __raw_readl(const volatile void __iomem *addr) -{ -	return *(volatile unsigned int __force *)addr; -} -static inline unsigned long __raw_readq(const volatile void __iomem *addr) -{ -	return *(volatile unsigned long __force *)addr; -} -static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr) -{ -	*(volatile unsigned char __force *)addr = v; -} -static inline void __raw_writew(unsigned short v, volatile void __iomem *addr) -{ -	*(volatile unsigned short __force *)addr = v; -} -static inline void __raw_writel(unsigned int v, volatile void __iomem *addr) -{ -	*(volatile unsigned int __force *)addr = v; -} -static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) -{ -	*(volatile unsigned long __force *)addr = v; -} - -/* - * read (readb, readw, readl, readq) and write (writeb, writew, - * writel, writeq) accessors are for PCI and thus littel endian. - * Linux 2.4 for Microblaze had this wrong. - */ -static inline unsigned char readb(const volatile void __iomem *addr) -{ -	return *(volatile unsigned char __force *)addr; -} -static inline unsigned short readw(const volatile void __iomem *addr) -{ -	return le16_to_cpu(*(volatile unsigned short __force *)addr); -} -static inline unsigned int readl(const volatile void __iomem *addr) -{ -	return le32_to_cpu(*(volatile unsigned int __force *)addr); -} -static inline void writeb(unsigned char v, volatile void __iomem *addr) -{ -	*(volatile unsigned char __force *)addr = v; -} -static inline void writew(unsigned short v, volatile void __iomem *addr) -{ -	*(volatile unsigned short __force *)addr = cpu_to_le16(v); -} -static inline void writel(unsigned int v, volatile void __iomem *addr) -{ -	*(volatile unsigned int __force *)addr = cpu_to_le32(v); -} - -/* ioread and iowrite variants. thease are for now same as __raw_ - * variants of accessors. we might check for endianess in the feature - */ -#define ioread8(addr)		__raw_readb((u8 *)(addr)) -#define ioread16(addr)		__raw_readw((u16 *)(addr)) -#define ioread32(addr)		__raw_readl((u32 *)(addr)) -#define iowrite8(v, addr)	__raw_writeb((u8)(v), (u8 *)(addr)) -#define iowrite16(v, addr)	__raw_writew((u16)(v), (u16 *)(addr)) -#define iowrite32(v, addr)	__raw_writel((u32)(v), (u32 *)(addr)) - -#define ioread16be(addr)	__raw_readw((u16 *)(addr)) -#define ioread32be(addr)	__raw_readl((u32 *)(addr)) -#define iowrite16be(v, addr)	__raw_writew((u16)(v), (u16 *)(addr)) -#define iowrite32be(v, addr)	__raw_writel((u32)(v), (u32 *)(addr)) - -/* 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)) - -#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)) -  #ifdef CONFIG_MMU - -#define phys_to_virt(addr)	((void *)__phys_to_virt(addr)) -#define virt_to_phys(addr)	((unsigned long)__virt_to_phys(addr)) -#define virt_to_bus(addr)	((unsigned long)__virt_to_phys(addr)) -  #define page_to_bus(page)	(page_to_phys(page)) -#define bus_to_virt(addr)	(phys_to_virt(addr)) - -extern void iounmap(void *addr); -/*extern void *__ioremap(phys_addr_t address, unsigned long size, -		unsigned long flags);*/ -extern void __iomem *ioremap(phys_addr_t address, unsigned long size); -#define ioremap_writethrough(addr, size) ioremap((addr), (size)) -#define ioremap_nocache(addr, size)      ioremap((addr), (size)) -#define ioremap_fullcache(addr, size)    ioremap((addr), (size)) -#else /* CONFIG_MMU */ +extern void iounmap(void __iomem *addr); -/** - *	virt_to_phys - map virtual addresses to physical - *	@address: address to remap - * - *	The returned physical address is the physical (CPU) mapping for - *	the memory address given. It is only valid to use this function on - *	addresses directly mapped or allocated via kmalloc. - * - *	This function does not give bus mappings for DMA transfers. In - *	almost all conceivable cases a device driver should not be using - *	this function - */ -static inline unsigned long __iomem virt_to_phys(volatile void *address) -{ -	return __pa((unsigned long)address); -} - -#define virt_to_bus virt_to_phys - -/** - *	phys_to_virt - map physical address to virtual - *	@address: address to remap - * - *	The returned virtual address is a current CPU mapping for - *	the memory address given. It is only valid to use this function on - *	addresses that have a kernel mapping - * - *	This function does not handle bus mappings for DMA transfers. In - *	almost all conceivable cases a device driver should not be using - *	this function - */ -static inline void *phys_to_virt(unsigned long address) -{ -	return (void *)__va(address); -} - -#define bus_to_virt(a) phys_to_virt(a) - -static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size, -			unsigned long flags) -{ -	return (void *)address; -} - -#define ioremap(physaddr, size)	((void __iomem *)(unsigned long)(physaddr)) -#define iounmap(addr)		((void)0) -#define ioremap_nocache(physaddr, size)	ioremap(physaddr, size) +extern void __iomem *ioremap(phys_addr_t address, unsigned long size); +#define ioremap_writethrough(addr, size)	ioremap((addr), (size)) +#define ioremap_nocache(addr, size)		ioremap((addr), (size)) +#define ioremap_fullcache(addr, size)		ioremap((addr), (size)) +#define ioremap_wc(addr, size)			ioremap((addr), (size))  #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 - */ -#define xlate_dev_kmem_ptr(p)	p - -/* - * Big Endian - */ +/* Big Endian */  #define out_be32(a, v) __raw_writel((v), (void __iomem __force *)(a))  #define out_be16(a, v) __raw_writew((v), (a)) @@ -229,10 +56,7 @@ static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size,  #define writel_be(v, a)	out_be32((__force unsigned *)a, v)  #define readl_be(a)	in_be32((__force unsigned *)a) -/* - * Little endian - */ - +/* Little endian */  #define out_le32(a, v) __raw_writel(__cpu_to_le32(v), (a))  #define out_le16(a, v) __raw_writew(__cpu_to_le16(v), (a)) @@ -243,9 +67,14 @@ static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size,  #define out_8(a, v) __raw_writeb((v), (a))  #define in_8(a) __raw_readb(a) -#define mmiowb() +#include <asm-generic/io.h> + +#define readb_relaxed	readb +#define readw_relaxed	readw +#define readl_relaxed	readl -#define ioport_map(port, nr)	((void __iomem *)(port)) -#define ioport_unmap(addr) +#define writeb_relaxed	writeb +#define writew_relaxed	writew +#define writel_relaxed	writel  #endif /* _ASM_MICROBLAZE_IO_H */ diff --git a/arch/microblaze/include/asm/ioctl.h b/arch/microblaze/include/asm/ioctl.h deleted file mode 100644 index b279fe06dfe..00000000000 --- a/arch/microblaze/include/asm/ioctl.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/ioctl.h> diff --git a/arch/microblaze/include/asm/ioctls.h b/arch/microblaze/include/asm/ioctls.h deleted file mode 100644 index ec34c760665..00000000000 --- a/arch/microblaze/include/asm/ioctls.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/ioctls.h> diff --git a/arch/microblaze/include/asm/ipcbuf.h b/arch/microblaze/include/asm/ipcbuf.h deleted file mode 100644 index 84c7e51cb6d..00000000000 --- a/arch/microblaze/include/asm/ipcbuf.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/ipcbuf.h> diff --git a/arch/microblaze/include/asm/irq.h b/arch/microblaze/include/asm/irq.h index ec5583d6111..bab3b1393ad 100644 --- a/arch/microblaze/include/asm/irq.h +++ b/arch/microblaze/include/asm/irq.h @@ -9,46 +9,13 @@  #ifndef _ASM_MICROBLAZE_IRQ_H  #define _ASM_MICROBLAZE_IRQ_H -#define NR_IRQS 32 +#define NR_IRQS		(32 + 1)  #include <asm-generic/irq.h> -#include <linux/interrupt.h> - -/* This type is the placeholder for a hardware interrupt number. It has to - * be big enough to enclose whatever representation is used by a given - * platform. - */ -typedef unsigned long irq_hw_number_t; - -extern unsigned int nr_irq; - -#define NO_IRQ (-1) -  struct pt_regs;  extern void do_IRQ(struct pt_regs *regs); -/** FIXME - not implement - * irq_dispose_mapping - Unmap an interrupt - * @virq: linux virq number of the interrupt to unmap - */ -static inline void irq_dispose_mapping(unsigned int virq) -{ -	return; -} - -struct irq_host; - -/** - * irq_create_mapping - Map a hardware interrupt into linux virq space - * @host: host owning this hardware interrupt or NULL for default host - * @hwirq: hardware irq number in that host space - * - * Only one mapping per hardware interrupt is permitted. Returns a linux - * virq number. - * If the sense/trigger is to be specified, set_irq_type() should be called - * on the number returned from that call. - */ -extern unsigned int irq_create_mapping(struct irq_host *host, -					irq_hw_number_t hwirq); +/* should be defined in each interrupt controller driver */ +extern unsigned int get_irq(void);  #endif /* _ASM_MICROBLAZE_IRQ_H */ diff --git a/arch/microblaze/include/asm/irqflags.h b/arch/microblaze/include/asm/irqflags.h index 5fd31905775..c9a6262832c 100644 --- a/arch/microblaze/include/asm/irqflags.h +++ b/arch/microblaze/include/asm/irqflags.h @@ -12,9 +12,9 @@  #include <linux/types.h>  #include <asm/registers.h> -#ifdef CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR +#if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long flags;  	asm volatile("	msrclr %0, %1	\n" @@ -25,7 +25,7 @@ static inline unsigned long arch_local_irq_save(void)  	return flags;  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	/* this uses r0 without declaring it - is that correct? */  	asm volatile("	msrclr r0, %0	\n" @@ -35,7 +35,7 @@ static inline void arch_local_irq_disable(void)  		     : "memory");  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	/* this uses r0 without declaring it - is that correct? */  	asm volatile("	msrset	r0, %0	\n" @@ -47,7 +47,7 @@ static inline void arch_local_irq_enable(void)  #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ -static inline unsigned long arch_local_irq_save(void) +static inline notrace unsigned long arch_local_irq_save(void)  {  	unsigned long flags, tmp;  	asm volatile ("	mfs	%0, rmsr	\n" @@ -61,7 +61,7 @@ static inline unsigned long arch_local_irq_save(void)  	return flags;  } -static inline void arch_local_irq_disable(void) +static inline notrace void arch_local_irq_disable(void)  {  	unsigned long tmp;  	asm volatile("	mfs	%0, rmsr	\n" @@ -74,7 +74,7 @@ static inline void arch_local_irq_disable(void)  		     : "memory");  } -static inline void arch_local_irq_enable(void) +static inline notrace void arch_local_irq_enable(void)  {  	unsigned long tmp;  	asm volatile("	mfs	%0, rmsr	\n" @@ -89,7 +89,7 @@ static inline void arch_local_irq_enable(void)  #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ -static inline unsigned long arch_local_save_flags(void) +static inline notrace unsigned long arch_local_save_flags(void)  {  	unsigned long flags;  	asm volatile("	mfs	%0, rmsr	\n" @@ -100,7 +100,7 @@ static inline unsigned long arch_local_save_flags(void)  	return flags;  } -static inline void arch_local_irq_restore(unsigned long flags) +static inline notrace void arch_local_irq_restore(unsigned long flags)  {  	asm volatile("	mts	rmsr, %0	\n"  		     "	nop			\n" @@ -109,12 +109,12 @@ static inline void arch_local_irq_restore(unsigned long flags)  		     : "memory");  } -static inline bool arch_irqs_disabled_flags(unsigned long flags) +static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)  {  	return (flags & MSR_IE) == 0;  } -static inline bool arch_irqs_disabled(void) +static inline notrace bool arch_irqs_disabled(void)  {  	return arch_irqs_disabled_flags(arch_local_save_flags());  } diff --git a/arch/microblaze/include/asm/memblock.h b/arch/microblaze/include/asm/memblock.h deleted file mode 100644 index 20a8e257c77..00000000000 --- a/arch/microblaze/include/asm/memblock.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2008 Michal Simek <monstr@monstr.eu> - * - * 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 _ASM_MICROBLAZE_MEMBLOCK_H -#define _ASM_MICROBLAZE_MEMBLOCK_H - -#endif /* _ASM_MICROBLAZE_MEMBLOCK_H */ - - diff --git a/arch/microblaze/include/asm/mman.h b/arch/microblaze/include/asm/mman.h deleted file mode 100644 index 8eebf89f5ab..00000000000 --- a/arch/microblaze/include/asm/mman.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/mman.h> diff --git a/arch/microblaze/include/asm/mmu.h b/arch/microblaze/include/asm/mmu.h index 8d6a654ceff..1f9edddf7f4 100644 --- a/arch/microblaze/include/asm/mmu.h +++ b/arch/microblaze/include/asm/mmu.h @@ -56,6 +56,12 @@ typedef struct _SEGREG {  extern void _tlbie(unsigned long va);	/* invalidate a TLB entry */  extern void _tlbia(void);		/* invalidate all TLB entries */ + +/* + * tlb_skip size stores actual number skipped TLBs from TLB0 - every directy TLB + * mapping has to increase tlb_skip size. + */ +extern u32 tlb_skip;  #   endif /* __ASSEMBLY__ */  /* @@ -69,6 +75,12 @@ extern void _tlbia(void);		/* invalidate all TLB entries */  #  define MICROBLAZE_TLB_SIZE 64 +/* For cases when you want to skip some TLB entries */ +#  define MICROBLAZE_TLB_SKIP 0 + +/* Use the last TLB for temporary access to LMB */ +#  define MICROBLAZE_LMB_TLB_ID 63 +  /*   * TLB entries are defined by a "high" tag portion and a "low" data   * portion. The data portion is 32-bits. diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h index 24eab1674d3..0ccd8c402cd 100644 --- a/arch/microblaze/include/asm/mmu_context.h +++ b/arch/microblaze/include/asm/mmu_context.h @@ -1,5 +1,5 @@  #ifdef CONFIG_MMU -# include "mmu_context_mm.h" +# include <asm/mmu_context_mm.h>  #else  # include <asm-generic/mmu_context.h>  #endif diff --git a/arch/microblaze/include/asm/mmu_context_mm.h b/arch/microblaze/include/asm/mmu_context_mm.h index 3e5c254e8d1..d6864774644 100644 --- a/arch/microblaze/include/asm/mmu_context_mm.h +++ b/arch/microblaze/include/asm/mmu_context_mm.h @@ -11,7 +11,7 @@  #ifndef _ASM_MICROBLAZE_MMU_CONTEXT_H  #define _ASM_MICROBLAZE_MMU_CONTEXT_H -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/bitops.h>  #include <asm/mmu.h>  #include <asm-generic/mm_hooks.h> diff --git a/arch/microblaze/include/asm/msgbuf.h b/arch/microblaze/include/asm/msgbuf.h deleted file mode 100644 index 809134c644a..00000000000 --- a/arch/microblaze/include/asm/msgbuf.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/msgbuf.h> diff --git a/arch/microblaze/include/asm/namei.h b/arch/microblaze/include/asm/namei.h deleted file mode 100644 index 61d60b8a07d..00000000000 --- a/arch/microblaze/include/asm/namei.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * 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 _ASM_MICROBLAZE_NAMEI_H -#define _ASM_MICROBLAZE_NAMEI_H - -#ifdef __KERNEL__ - -/* This dummy routine maybe changed to something useful - * for /usr/gnemul/ emulation stuff. - * Look at asm-sparc/namei.h for details. - */ -#define __emul_prefix() NULL - -#endif /* __KERNEL__ */ - -#endif /* _ASM_MICROBLAZE_NAMEI_H */ diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm/page.h index ed9d0f6e2cd..fd850879854 100644 --- a/arch/microblaze/include/asm/page.h +++ b/arch/microblaze/include/asm/page.h @@ -23,12 +23,10 @@  #ifdef __KERNEL__  /* PAGE_SHIFT determines the page size */ -#if defined(CONFIG_MICROBLAZE_32K_PAGES) -#define PAGE_SHIFT		15 +#if defined(CONFIG_MICROBLAZE_64K_PAGES) +#define PAGE_SHIFT		16  #elif defined(CONFIG_MICROBLAZE_16K_PAGES)  #define PAGE_SHIFT		14 -#elif defined(CONFIG_MICROBLAZE_8K_PAGES) -#define PAGE_SHIFT		13  #else  #define PAGE_SHIFT		12  #endif @@ -37,6 +35,8 @@  #define LOAD_OFFSET	ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR)) +#define PTE_SHIFT	(PAGE_SHIFT - 2)	/* 1024 ptes per page */ +  #ifndef __ASSEMBLY__  /* MS be sure that SLAB allocates aligned objects */ @@ -71,7 +71,6 @@ extern unsigned int __page_offset;   * The basic type of a PTE - 32 bit physical addressing.   */  typedef unsigned long pte_basic_t; -#define PTE_SHIFT	(PAGE_SHIFT - 2)	/* 1024 ptes per page */  #define PTE_FMT		"%.8lx"  #endif /* CONFIG_MMU */ @@ -135,8 +134,10 @@ extern unsigned long min_low_pfn;  extern unsigned long max_pfn;  extern unsigned long memory_start; -extern unsigned long memory_end;  extern unsigned long memory_size; +extern unsigned long lowmem_size; + +extern unsigned long kernel_tlb;  extern int page_is_ram(unsigned long pfn); @@ -167,22 +168,14 @@ extern int page_is_ram(unsigned long pfn);  #  else /* CONFIG_MMU */  #  define ARCH_PFN_OFFSET	(memory_start >> PAGE_SHIFT)  #  define pfn_valid(pfn)	((pfn) < (max_mapnr + ARCH_PFN_OFFSET)) -#  define VALID_PAGE(page) 	((page - mem_map) < max_mapnr)  #  endif /* CONFIG_MMU */  # endif /* __ASSEMBLY__ */  #define	virt_addr_valid(vaddr)	(pfn_valid(virt_to_pfn(vaddr))) - -#  ifndef CONFIG_MMU -#  define __pa(vaddr)	((unsigned long) (vaddr)) -#  define __va(paddr)	((void *) (paddr)) -#  else /* CONFIG_MMU */ -#  define __pa(x)	__virt_to_phys((unsigned long)(x)) -#  define __va(x)	((void *)__phys_to_virt((unsigned long)(x))) -#  endif /* CONFIG_MMU */ - +# define __pa(x)	__virt_to_phys((unsigned long)(x)) +# define __va(x)	((void *)__phys_to_virt((unsigned long)(x)))  /* Convert between virtual and physical address for MMU. */  /* Handle MicroBlaze processor with virtual memory. */ diff --git a/arch/microblaze/include/asm/param.h b/arch/microblaze/include/asm/param.h deleted file mode 100644 index 965d4542797..00000000000 --- a/arch/microblaze/include/asm/param.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/param.h> diff --git a/arch/microblaze/include/asm/pci-bridge.h b/arch/microblaze/include/asm/pci-bridge.h index 0c68764ab54..cb5d3979480 100644 --- a/arch/microblaze/include/asm/pci-bridge.h +++ b/arch/microblaze/include/asm/pci-bridge.h @@ -13,28 +13,15 @@  struct device_node; -enum { -	/* Force re-assigning all resources (ignore firmware -	 * setup completely) -	 */ -	PCI_REASSIGN_ALL_RSRC	= 0x00000001, - -	/* Re-assign all bus numbers */ -	PCI_REASSIGN_ALL_BUS	= 0x00000002, - -	/* Do not try to assign, just use existing setup */ -	PCI_PROBE_ONLY		= 0x00000004, - -	/* Don't bother with ISA alignment unless the bridge has -	 * ISA forwarding enabled -	 */ -	PCI_CAN_SKIP_ISA_ALIGN	= 0x00000008, - -	/* Enable domain numbers in /proc */ -	PCI_ENABLE_PROC_DOMAINS	= 0x00000010, -	/* ... except for domain 0 */ -	PCI_COMPAT_DOMAIN_0		= 0x00000020, -}; +#ifdef CONFIG_PCI +extern struct list_head hose_list; +extern int pcibios_vaddr_is_ioport(void __iomem *address); +#else +static inline int pcibios_vaddr_is_ioport(void __iomem *address) +{ +	return 0; +} +#endif  /*   * Structure of a PCI controller (host bridge) @@ -76,7 +63,7 @@ struct pci_controller {  	 * Used for variants of PCI indirect handling and possible quirks:  	 *  SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1  	 *  EXT_REG - provides access to PCI-e extended registers -	 *  SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS +	 *  SURPRESS_PRIMARY_BUS - we suppress the setting of PCI_PRIMARY_BUS  	 *   on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS  	 *   to determine which bus number to match on when generating type0  	 *   config cycles @@ -104,6 +91,7 @@ struct pci_controller {  	int global_number;	/* PCI domain number */  }; +#ifdef CONFIG_PCI  static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)  {  	return bus->sysdata; @@ -116,6 +104,7 @@ static inline int isa_vaddr_is_ioport(void __iomem *address)  	 */  	return 0;  } +#endif /* CONFIG_PCI */  /* These are used for config access before all the PCI probing     has been done. */ @@ -150,42 +139,6 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,  /* Allocate & free a PCI host bridge structure */  extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);  extern void pcibios_free_controller(struct pci_controller *phb); -extern void pcibios_setup_phb_resources(struct pci_controller *hose); - -#ifdef CONFIG_PCI -extern unsigned int pci_flags; - -static inline void pci_set_flags(int flags) -{ -	pci_flags = flags; -} - -static inline void pci_add_flags(int flags) -{ -	pci_flags |= flags; -} - -static inline int pci_has_flag(int flag) -{ -	return pci_flags & flag; -} - -extern struct list_head hose_list; - -extern int pcibios_vaddr_is_ioport(void __iomem *address); -#else -static inline int pcibios_vaddr_is_ioport(void __iomem *address) -{ -	return 0; -} - -static inline void pci_set_flags(int flags) { } -static inline void pci_add_flags(int flags) { } -static inline int pci_has_flag(int flag) -{ -	return 0; -} -#endif	/* CONFIG_PCI */  #endif	/* __KERNEL__ */  #endif	/* _ASM_MICROBLAZE_PCI_BRIDGE_H */ diff --git a/arch/microblaze/include/asm/pci.h b/arch/microblaze/include/asm/pci.h index 2232ff942ba..468aca8cec0 100644 --- a/arch/microblaze/include/asm/pci.h +++ b/arch/microblaze/include/asm/pci.h @@ -22,6 +22,8 @@  #include <asm/prom.h>  #include <asm/pci-bridge.h> +#include <asm-generic/pci-dma-compat.h> +  #define PCIBIOS_MIN_IO		0x1000  #define PCIBIOS_MIN_MEM		0x10000000 @@ -40,26 +42,7 @@ struct pci_dev;   * Set this to 1 if you want the kernel to re-assign all PCI   * bus numbers (don't do that on ppc64 yet !)   */ -#define pcibios_assign_all_busses() \ -	(pci_has_flag(PCI_REASSIGN_ALL_BUS)) - -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, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} - -#ifdef CONFIG_PCI -extern void set_pci_dma_ops(struct dma_map_ops *dma_ops); -extern struct dma_map_ops *get_pci_dma_ops(void); -#else	/* CONFIG_PCI */ -#define set_pci_dma_ops(d) -#define get_pci_dma_ops()	NULL -#endif +#define pcibios_assign_all_busses()	0  #ifdef CONFIG_PCI  static inline void pci_dma_burst_advice(struct pci_dev *pdev, @@ -100,14 +83,6 @@ extern int pci_mmap_legacy_page_range(struct pci_bus *bus,   */  #define PCI_DMA_BUS_IS_PHYS     (1) -extern void pcibios_resource_to_bus(struct pci_dev *dev, -			struct pci_bus_region *region, -			struct resource *res); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, -			struct resource *res, -			struct pci_bus_region *region); -  static inline struct resource *pcibios_select_root(struct pci_dev *pdev,  			struct resource *res)  { @@ -139,8 +114,6 @@ extern void of_scan_pci_bridge(struct device_node *node,  extern void of_scan_bus(struct device_node *node, struct pci_bus *bus);  extern void of_rescan_bus(struct device_node *node, struct pci_bus *bus); -extern int pci_read_irq_line(struct pci_dev *dev); -  extern int pci_bus_find_capability(struct pci_bus *bus,  						unsigned int devfn, int cap); @@ -158,14 +131,12 @@ extern void pci_resource_to_user(const struct pci_dev *dev, int bar,  extern void pcibios_setup_bus_devices(struct pci_bus *bus);  extern void pcibios_setup_bus_self(struct pci_bus *bus); -/* This part of code was originaly in xilinx-pci.h */ +/* This part of code was originally in xilinx-pci.h */  #ifdef CONFIG_PCI_XILINX  extern void __init xilinx_pci_init(void);  #else  static inline void __init xilinx_pci_init(void) { return; }  #endif -#include <asm-generic/pci-dma-compat.h> -  #endif	/* __KERNEL__ */  #endif /* __ASM_MICROBLAZE_PCI_H */ diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h index ebd35792482..7fdf7fabc7d 100644 --- a/arch/microblaze/include/asm/pgalloc.h +++ b/arch/microblaze/include/asm/pgalloc.h @@ -122,8 +122,13 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm,  #endif  	ptepage = alloc_pages(flags, 0); -	if (ptepage) -		clear_highpage(ptepage); +	if (!ptepage) +		return NULL; +	clear_highpage(ptepage); +	if (!pgtable_page_ctor(ptepage)) { +		__free_page(ptepage); +		return NULL; +	}  	return ptepage;  } @@ -158,8 +163,9 @@ extern inline void pte_free_slow(struct page *ptepage)  	__free_page(ptepage);  } -extern inline void pte_free(struct mm_struct *mm, struct page *ptepage) +static inline void pte_free(struct mm_struct *mm, struct page *ptepage)  { +	pgtable_page_dtor(ptepage);  	__free_page(ptepage);  } diff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h index cae268c22ba..95cef0b5f83 100644 --- a/arch/microblaze/include/asm/pgtable.h +++ b/arch/microblaze/include/asm/pgtable.h @@ -13,9 +13,6 @@  #include <asm/setup.h> -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)		\ -		remap_pfn_range(vma, vaddr, pfn, size, prot) -  #ifndef __ASSEMBLY__  extern int mem_init_done;  #endif @@ -94,8 +91,7 @@ static inline pte_t pte_mkspecial(pte_t pte)	{ return pte; }  /* Start and end of the vmalloc area. */  /* Make sure to map the vmalloc area above the pinned kernel memory area     of 32Mb.  */ -#define VMALLOC_START	(CONFIG_KERNEL_START + \ -				max(32 * 1024 * 1024UL, memory_size)) +#define VMALLOC_START	(CONFIG_KERNEL_START + CONFIG_LOWMEM_SIZE)  #define VMALLOC_END	ioremap_bot  #endif /* __ASSEMBLY__ */ @@ -235,12 +231,6 @@ static inline pte_t pte_mkspecial(pte_t pte)	{ return pte; }  #ifndef _PAGE_SHARED  #define _PAGE_SHARED	0  #endif -#ifndef _PAGE_HWWRITE -#define _PAGE_HWWRITE	0 -#endif -#ifndef _PAGE_HWEXEC -#define _PAGE_HWEXEC	0 -#endif  #ifndef _PAGE_EXEC  #define _PAGE_EXEC	0  #endif @@ -411,20 +401,19 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)  static inline unsigned long pte_update(pte_t *p, unsigned long clr,  				unsigned long set)  { -	unsigned long old, tmp, msr; - -	__asm__ __volatile__("\ -	msrclr	%2, 0x2\n\ -	nop\n\ -	lw	%0, %4, r0\n\ -	andn	%1, %0, %5\n\ -	or	%1, %1, %6\n\ -	sw	%1, %4, r0\n\ -	mts     rmsr, %2\n\ -	nop" -	: "=&r" (old), "=&r" (tmp), "=&r" (msr), "=m" (*p) -	: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set), "m" (*p) -	: "cc"); +	unsigned long flags, old, tmp; + +	raw_local_irq_save(flags); + +	__asm__ __volatile__(	"lw	%0, %2, r0	\n" +				"andn	%1, %0, %3	\n" +				"or	%1, %1, %4	\n" +				"sw	%1, %2, r0	\n" +			: "=&r" (old), "=&r" (tmp) +			: "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set) +			: "cc"); + +	raw_local_irq_restore(flags);  	return old;  } @@ -444,8 +433,9 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,  	*ptep = pte;  } -static inline int ptep_test_and_clear_young(struct mm_struct *mm, -		unsigned long addr, pte_t *ptep) +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, +		unsigned long address, pte_t *ptep)  {  	return (pte_update(ptep, _PAGE_ACCESSED, 0) & _PAGE_ACCESSED) != 0;  } @@ -457,6 +447,7 @@ static inline int ptep_test_and_clear_dirty(struct mm_struct *mm,  		(_PAGE_DIRTY | _PAGE_HWWRITE), 0) & _PAGE_DIRTY) != 0;  } +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR  static inline pte_t ptep_get_and_clear(struct mm_struct *mm,  		unsigned long addr, pte_t *ptep)  { @@ -542,8 +533,6 @@ extern unsigned long iopa(unsigned long addr);  /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */  #define kern_addr_valid(addr)	(1) -#define io_remap_page_range remap_page_range -  /*   * No page table caches to initialise   */ @@ -571,7 +560,7 @@ void __init *early_get_page(void);  extern unsigned long ioremap_bot, ioremap_base; -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); +void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *dma_handle);  void consistent_free(size_t size, void *vaddr);  void consistent_sync(void *vaddr, size_t size, int direction);  void consistent_sync_page(struct page *page, unsigned long offset, diff --git a/arch/microblaze/include/asm/poll.h b/arch/microblaze/include/asm/poll.h deleted file mode 100644 index c98509d3149..00000000000 --- a/arch/microblaze/include/asm/poll.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/poll.h> diff --git a/arch/microblaze/include/asm/posix_types.h b/arch/microblaze/include/asm/posix_types.h deleted file mode 100644 index 0e15039673e..00000000000 --- a/arch/microblaze/include/asm/posix_types.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _ASM_MICROBLAZE_POSIX_TYPES_H -#define _ASM_MICROBLAZE_POSIX_TYPES_H - -typedef unsigned short	__kernel_mode_t; -#define __kernel_mode_t __kernel_mode_t - -#include <asm-generic/posix_types.h> - -#endif /* _ASM_MICROBLAZE_POSIX_TYPES_H */ diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h index 8eeb09211ec..9d31b057c35 100644 --- a/arch/microblaze/include/asm/processor.h +++ b/arch/microblaze/include/asm/processor.h @@ -22,8 +22,6 @@  extern const struct seq_operations cpuinfo_op;  # define cpu_relax()		barrier() -# define cpu_sleep()		do {} while (0) -# define prepare_to_copy(tsk)	do {} while (0)  #define task_pt_regs(tsk) \  		(((struct pt_regs *)(THREAD_SIZE + task_stack_page(tsk))) - 1) @@ -31,6 +29,9 @@ extern const struct seq_operations cpuinfo_op;  /* Do necessary setup to start up a newly executed thread. */  void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long usp); +extern void ret_from_fork(void); +extern void ret_from_kernel_thread(void); +  # endif /* __ASSEMBLY__ */  # ifndef CONFIG_MMU @@ -77,11 +78,6 @@ extern unsigned long thread_saved_pc(struct task_struct *t);  extern unsigned long get_wchan(struct task_struct *p); -/* - * create a kernel thread without removing it from tasklists - */ -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  # define KSTK_EIP(tsk)	(0)  # define KSTK_ESP(tsk)	(0) @@ -125,17 +121,11 @@ struct thread_struct {  	.pgdir = swapper_pg_dir, \  } -/* Do necessary setup to start up a newly executed thread.  */ -void start_thread(struct pt_regs *regs, -		unsigned long pc, unsigned long usp); -  /* Free all resources held by a thread. */ -extern inline void release_thread(struct task_struct *dead_task) +static inline void release_thread(struct task_struct *dead_task)  {  } -extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -  /* Free current thread data structures etc.  */  static inline void exit_thread(void)  { @@ -155,7 +145,7 @@ unsigned long get_wchan(struct task_struct *p);  #  define task_regs(task) ((struct pt_regs *)task_tos(task) - 1)  #  define task_pt_regs_plus_args(tsk) \ -	(((void *)task_pt_regs(tsk)) - STATE_SAVE_ARG_SPACE) +	((void *)task_pt_regs(tsk))  #  define task_sp(task)	(task_regs(task)->r1)  #  define task_pc(task)	(task_regs(task)->pc) @@ -169,6 +159,10 @@ unsigned long get_wchan(struct task_struct *p);  #  define STACK_TOP	TASK_SIZE  #  define STACK_TOP_MAX	STACK_TOP +#ifdef CONFIG_DEBUG_FS +extern struct dentry *of_debugfs_root; +#endif +  #  endif /* __ASSEMBLY__ */  # endif /* CONFIG_MMU */  #endif /* _ASM_MICROBLAZE_PROCESSOR_H */ diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h index bdc38312ae4..2f03ac81585 100644 --- a/arch/microblaze/include/asm/prom.h +++ b/arch/microblaze/include/asm/prom.h @@ -11,86 +11,17 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   */ - -#include <linux/of.h>	/* linux/of.h gets to determine #include ordering */ -  #ifndef _ASM_MICROBLAZE_PROM_H  #define _ASM_MICROBLAZE_PROM_H -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#include <linux/types.h> -#include <asm/irq.h> -#include <asm/atomic.h> -#define HAVE_ARCH_DEVTREE_FIXUPS +#include <linux/of.h>  /* Other Prototypes */ -extern int early_uartlite_console(void); -extern int early_uart16550_console(void); - -#ifdef CONFIG_PCI -/* - * PCI <-> OF matching functions - * (XXX should these be here?) - */ -struct pci_bus; -struct pci_dev; -extern int pci_device_from_OF_node(struct device_node *node, -					u8 *bus, u8 *devfn); -extern struct device_node *pci_busdev_to_OF_node(struct pci_bus *bus, -							int devfn); -extern struct device_node *pci_device_to_OF_node(struct pci_dev *dev); -extern void pci_create_OF_bus_map(void); -#endif - -/* - * OF address retreival & translation - */ - -#ifdef CONFIG_PCI -extern unsigned long pci_address_to_pio(phys_addr_t address); -#define pci_address_to_pio pci_address_to_pio -#endif	/* CONFIG_PCI */ - -/* Parse the ibm,dma-window property of an OF node into the busno, phys and - * size parameters. - */ -void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, -		unsigned long *busno, unsigned long *phys, unsigned long *size); - -extern void kdump_move_device_tree(void); - -/* CPU OF node matching */ -struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); - -/* Get the MAC address */ -extern const void *of_get_mac_address(struct device_node *np); - -/** - * of_irq_map_pci - Resolve the interrupt for a PCI device - * @pdev:	the device whose interrupt is to be resolved - * @out_irq:	structure of_irq filled by this function - * - * This function resolves the PCI interrupt for a given PCI device. If a - * device-node exists for a given pci_dev, it will use normal OF tree - * walking. If not, it will implement standard swizzling and walk up the - * PCI tree until an device-node is found, at which point it will finish - * resolving using the OF tree walking. - */ -struct pci_dev; -struct of_irq; -extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); - -#endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */ +enum early_consoles { +	UARTLITE = 1, +	UART16550 = 2, +}; -/* These includes are put at the bottom because they may contain things - * that are overridden by this file.  Ideally they shouldn't be included - * by this file, but there are a bunch of .c files that currently depend - * on it.  Eventually they will be cleaned up. */ -#include <linux/of_fdt.h> -#include <linux/of_irq.h> -#include <linux/platform_device.h> +extern int of_early_console(void *version);  #endif /* _ASM_MICROBLAZE_PROM_H */ diff --git a/arch/microblaze/include/asm/ptrace.h b/arch/microblaze/include/asm/ptrace.h index d74dbfb92c0..5b18ec124e5 100644 --- a/arch/microblaze/include/asm/ptrace.h +++ b/arch/microblaze/include/asm/ptrace.h @@ -5,77 +5,23 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_PTRACE_H  #define _ASM_MICROBLAZE_PTRACE_H -#ifndef __ASSEMBLY__ - -typedef unsigned long microblaze_reg_t; +#include <uapi/asm/ptrace.h> -struct pt_regs { -	microblaze_reg_t r0; -	microblaze_reg_t r1; -	microblaze_reg_t r2; -	microblaze_reg_t r3; -	microblaze_reg_t r4; -	microblaze_reg_t r5; -	microblaze_reg_t r6; -	microblaze_reg_t r7; -	microblaze_reg_t r8; -	microblaze_reg_t r9; -	microblaze_reg_t r10; -	microblaze_reg_t r11; -	microblaze_reg_t r12; -	microblaze_reg_t r13; -	microblaze_reg_t r14; -	microblaze_reg_t r15; -	microblaze_reg_t r16; -	microblaze_reg_t r17; -	microblaze_reg_t r18; -	microblaze_reg_t r19; -	microblaze_reg_t r20; -	microblaze_reg_t r21; -	microblaze_reg_t r22; -	microblaze_reg_t r23; -	microblaze_reg_t r24; -	microblaze_reg_t r25; -	microblaze_reg_t r26; -	microblaze_reg_t r27; -	microblaze_reg_t r28; -	microblaze_reg_t r29; -	microblaze_reg_t r30; -	microblaze_reg_t r31; -	microblaze_reg_t pc; -	microblaze_reg_t msr; -	microblaze_reg_t ear; -	microblaze_reg_t esr; -	microblaze_reg_t fsr; -	int pt_mode; -}; - -#ifdef __KERNEL__ +#ifndef __ASSEMBLY__  #define kernel_mode(regs)		((regs)->pt_mode)  #define user_mode(regs)			(!kernel_mode(regs))  #define instruction_pointer(regs)	((regs)->pc)  #define profile_pc(regs)		instruction_pointer(regs) +#define user_stack_pointer(regs)	((regs)->r1) -void show_regs(struct pt_regs *); - -#else /* __KERNEL__ */ - -/* pt_regs offsets used by gdbserver etc in ptrace syscalls */ -#define PT_GPR(n)       ((n) * sizeof(microblaze_reg_t)) -#define PT_PC           (32 * sizeof(microblaze_reg_t)) -#define PT_MSR          (33 * sizeof(microblaze_reg_t)) -#define PT_EAR          (34 * sizeof(microblaze_reg_t)) -#define PT_ESR          (35 * sizeof(microblaze_reg_t)) -#define PT_FSR          (36 * sizeof(microblaze_reg_t)) -#define PT_KERNEL_MODE  (37 * sizeof(microblaze_reg_t)) - -#endif /* __KERNEL */ +static inline long regs_return_value(struct pt_regs *regs) +{ +	return regs->r3; +}  #endif /* __ASSEMBLY__ */ -  #endif /* _ASM_MICROBLAZE_PTRACE_H */ diff --git a/arch/microblaze/include/asm/pvr.h b/arch/microblaze/include/asm/pvr.h index 37db96a15b4..4bbdb4c03b5 100644 --- a/arch/microblaze/include/asm/pvr.h +++ b/arch/microblaze/include/asm/pvr.h @@ -1,9 +1,9 @@  /*   * Support for the MicroBlaze PVR (Processor Version Register)   * - * Copyright (C) 2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2009 - 2011 Michal Simek <monstr@monstr.eu>   * Copyright (C) 2007 John Williams <john.williams@petalogix.com> - * Copyright (C) 2007 - 2009 PetaLogix + * Copyright (C) 2007 - 2011 PetaLogix   *   * 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 @@ -46,11 +46,11 @@ struct pvr_s {  #define PVR2_I_LMB_MASK			0x10000000  #define PVR2_INTERRUPT_IS_EDGE_MASK	0x08000000  #define PVR2_EDGE_IS_POSITIVE_MASK	0x04000000 -#define PVR2_D_PLB_MASK			0x02000000	/* new */ -#define PVR2_I_PLB_MASK			0x01000000	/* new */ -#define PVR2_INTERCONNECT		0x00800000	/* new */ -#define PVR2_USE_EXTEND_FSL		0x00080000	/* new */ -#define PVR2_USE_FSL_EXC		0x00040000	/* new */ +#define PVR2_D_PLB_MASK			0x02000000 /* new */ +#define PVR2_I_PLB_MASK			0x01000000 /* new */ +#define PVR2_INTERCONNECT		0x00800000 /* new */ +#define PVR2_USE_EXTEND_FSL		0x00080000 /* new */ +#define PVR2_USE_FSL_EXC		0x00040000 /* new */  #define PVR2_USE_MSR_INSTR		0x00020000  #define PVR2_USE_PCMP_INSTR		0x00010000  #define PVR2_AREA_OPTIMISED		0x00008000 @@ -59,7 +59,7 @@ struct pvr_s {  #define PVR2_USE_HW_MUL_MASK		0x00001000  #define PVR2_USE_FPU_MASK		0x00000800  #define PVR2_USE_MUL64_MASK		0x00000400 -#define PVR2_USE_FPU2_MASK		0x00000200	/* new */ +#define PVR2_USE_FPU2_MASK		0x00000200 /* new */  #define PVR2_USE_IPLBEXC 		0x00000100  #define PVR2_USE_DPLBEXC		0x00000080  #define PVR2_OPCODE_0x0_ILL_MASK	0x00000040 @@ -111,107 +111,115 @@ struct pvr_s {  /* Target family PVR mask */  #define PVR10_TARGET_FAMILY_MASK	0xFF000000 -/* MMU descrtiption */ +/* MMU description */  #define PVR11_USE_MMU			0xC0000000  #define PVR11_MMU_ITLB_SIZE		0x38000000  #define PVR11_MMU_DTLB_SIZE		0x07000000  #define PVR11_MMU_TLB_ACCESS		0x00C00000  #define PVR11_MMU_ZONES			0x003C0000 +#define PVR11_MMU_PRIVINS		0x00010000  /* MSR Reset value PVR mask */  #define PVR11_MSR_RESET_VALUE_MASK	0x000007FF -  /* PVR access macros */ -#define PVR_IS_FULL(pvr)		(pvr.pvr[0] & PVR0_PVR_FULL_MASK) -#define PVR_USE_BARREL(pvr)		(pvr.pvr[0] & PVR0_USE_BARREL_MASK) -#define PVR_USE_DIV(pvr)		(pvr.pvr[0] & PVR0_USE_DIV_MASK) -#define PVR_USE_HW_MUL(pvr)		(pvr.pvr[0] & PVR0_USE_HW_MUL_MASK) -#define PVR_USE_FPU(pvr)		(pvr.pvr[0] & PVR0_USE_FPU_MASK) -#define PVR_USE_FPU2(pvr)		(pvr.pvr[2] & PVR2_USE_FPU2_MASK) -#define PVR_USE_ICACHE(pvr)		(pvr.pvr[0] & PVR0_USE_ICACHE_MASK) -#define PVR_USE_DCACHE(pvr)		(pvr.pvr[0] & PVR0_USE_DCACHE_MASK) -#define PVR_VERSION(pvr)	((pvr.pvr[0] & PVR0_VERSION_MASK) >> 8) -#define PVR_USER1(pvr)			(pvr.pvr[0] & PVR0_USER1_MASK) -#define PVR_USER2(pvr)			(pvr.pvr[1] & PVR1_USER2_MASK) - -#define PVR_D_OPB(pvr)			(pvr.pvr[2] & PVR2_D_OPB_MASK) -#define PVR_D_LMB(pvr)			(pvr.pvr[2] & PVR2_D_LMB_MASK) -#define PVR_I_OPB(pvr)			(pvr.pvr[2] & PVR2_I_OPB_MASK) -#define PVR_I_LMB(pvr)			(pvr.pvr[2] & PVR2_I_LMB_MASK) -#define PVR_INTERRUPT_IS_EDGE(pvr) \ -			(pvr.pvr[2] & PVR2_INTERRUPT_IS_EDGE_MASK) -#define PVR_EDGE_IS_POSITIVE(pvr) \ -			(pvr.pvr[2] & PVR2_EDGE_IS_POSITIVE_MASK) -#define PVR_USE_MSR_INSTR(pvr)		(pvr.pvr[2] & PVR2_USE_MSR_INSTR) -#define PVR_USE_PCMP_INSTR(pvr)		(pvr.pvr[2] & PVR2_USE_PCMP_INSTR) -#define PVR_AREA_OPTIMISED(pvr)		(pvr.pvr[2] & PVR2_AREA_OPTIMISED) -#define PVR_USE_MUL64(pvr)		(pvr.pvr[2] & PVR2_USE_MUL64_MASK) -#define PVR_OPCODE_0x0_ILLEGAL(pvr) \ -			(pvr.pvr[2] & PVR2_OPCODE_0x0_ILL_MASK) -#define PVR_UNALIGNED_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_UNALIGNED_EXC_MASK) -#define PVR_ILL_OPCODE_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_ILL_OPCODE_EXC_MASK) -#define PVR_IOPB_BUS_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_IOPB_BUS_EXC_MASK) -#define PVR_DOPB_BUS_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_DOPB_BUS_EXC_MASK) -#define PVR_DIV_ZERO_EXCEPTION(pvr) \ -			(pvr.pvr[2] & PVR2_DIV_ZERO_EXC_MASK) -#define PVR_FPU_EXCEPTION(pvr)		(pvr.pvr[2] & PVR2_FPU_EXC_MASK) -#define PVR_FSL_EXCEPTION(pvr)		(pvr.pvr[2] & PVR2_USE_EXTEND_FSL) - -#define PVR_DEBUG_ENABLED(pvr)		(pvr.pvr[3] & PVR3_DEBUG_ENABLED_MASK) -#define PVR_NUMBER_OF_PC_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_PC_BRK_MASK) >> 25) -#define PVR_NUMBER_OF_RD_ADDR_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_RD_ADDR_BRK_MASK) >> 19) -#define PVR_NUMBER_OF_WR_ADDR_BRK(pvr) \ -			((pvr.pvr[3] & PVR3_NUMBER_OF_WR_ADDR_BRK_MASK) >> 13) -#define PVR_FSL_LINKS(pvr)	((pvr.pvr[3] & PVR3_FSL_LINKS_MASK) >> 7) - -#define PVR_ICACHE_ADDR_TAG_BITS(pvr) \ -			((pvr.pvr[4] & PVR4_ICACHE_ADDR_TAG_BITS_MASK) >> 26) -#define PVR_ICACHE_USE_FSL(pvr)		(pvr.pvr[4] & PVR4_ICACHE_USE_FSL_MASK) -#define PVR_ICACHE_ALLOW_WR(pvr)	(pvr.pvr[4] & PVR4_ICACHE_ALLOW_WR_MASK) -#define PVR_ICACHE_LINE_LEN(pvr) \ -			(1 << ((pvr.pvr[4] & PVR4_ICACHE_LINE_LEN_MASK) >> 21)) -#define PVR_ICACHE_BYTE_SIZE(pvr) \ -			(1 << ((pvr.pvr[4] & PVR4_ICACHE_BYTE_SIZE_MASK) >> 16)) - -#define PVR_DCACHE_ADDR_TAG_BITS(pvr) \ -			((pvr.pvr[5] & PVR5_DCACHE_ADDR_TAG_BITS_MASK) >> 26) -#define PVR_DCACHE_USE_FSL(pvr)		(pvr.pvr[5] & PVR5_DCACHE_USE_FSL_MASK) -#define PVR_DCACHE_ALLOW_WR(pvr)	(pvr.pvr[5] & PVR5_DCACHE_ALLOW_WR_MASK) +#define PVR_IS_FULL(_pvr)	(_pvr.pvr[0] & PVR0_PVR_FULL_MASK) +#define PVR_USE_BARREL(_pvr)	(_pvr.pvr[0] & PVR0_USE_BARREL_MASK) +#define PVR_USE_DIV(_pvr)	(_pvr.pvr[0] & PVR0_USE_DIV_MASK) +#define PVR_USE_HW_MUL(_pvr)	(_pvr.pvr[0] & PVR0_USE_HW_MUL_MASK) +#define PVR_USE_FPU(_pvr)	(_pvr.pvr[0] & PVR0_USE_FPU_MASK) +#define PVR_USE_FPU2(_pvr)	(_pvr.pvr[2] & PVR2_USE_FPU2_MASK) +#define PVR_USE_ICACHE(_pvr)	(_pvr.pvr[0] & PVR0_USE_ICACHE_MASK) +#define PVR_USE_DCACHE(_pvr)	(_pvr.pvr[0] & PVR0_USE_DCACHE_MASK) +#define PVR_VERSION(_pvr)	((_pvr.pvr[0] & PVR0_VERSION_MASK) >> 8) +#define PVR_USER1(_pvr)		(_pvr.pvr[0] & PVR0_USER1_MASK) +#define PVR_USER2(_pvr)		(_pvr.pvr[1] & PVR1_USER2_MASK) + +#define PVR_D_OPB(_pvr)		(_pvr.pvr[2] & PVR2_D_OPB_MASK) +#define PVR_D_LMB(_pvr)		(_pvr.pvr[2] & PVR2_D_LMB_MASK) +#define PVR_I_OPB(_pvr)		(_pvr.pvr[2] & PVR2_I_OPB_MASK) +#define PVR_I_LMB(_pvr)		(_pvr.pvr[2] & PVR2_I_LMB_MASK) +#define PVR_INTERRUPT_IS_EDGE(_pvr) \ +			(_pvr.pvr[2] & PVR2_INTERRUPT_IS_EDGE_MASK) +#define PVR_EDGE_IS_POSITIVE(_pvr) \ +			(_pvr.pvr[2] & PVR2_EDGE_IS_POSITIVE_MASK) +#define PVR_USE_MSR_INSTR(_pvr)		(_pvr.pvr[2] & PVR2_USE_MSR_INSTR) +#define PVR_USE_PCMP_INSTR(_pvr)	(_pvr.pvr[2] & PVR2_USE_PCMP_INSTR) +#define PVR_AREA_OPTIMISED(_pvr)	(_pvr.pvr[2] & PVR2_AREA_OPTIMISED) +#define PVR_USE_MUL64(_pvr)		(_pvr.pvr[2] & PVR2_USE_MUL64_MASK) +#define PVR_OPCODE_0x0_ILLEGAL(_pvr) \ +			(_pvr.pvr[2] & PVR2_OPCODE_0x0_ILL_MASK) +#define PVR_UNALIGNED_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_UNALIGNED_EXC_MASK) +#define PVR_ILL_OPCODE_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_ILL_OPCODE_EXC_MASK) +#define PVR_IOPB_BUS_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_IOPB_BUS_EXC_MASK) +#define PVR_DOPB_BUS_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_DOPB_BUS_EXC_MASK) +#define PVR_DIV_ZERO_EXCEPTION(_pvr) \ +			(_pvr.pvr[2] & PVR2_DIV_ZERO_EXC_MASK) +#define PVR_FPU_EXCEPTION(_pvr)		(_pvr.pvr[2] & PVR2_FPU_EXC_MASK) +#define PVR_FSL_EXCEPTION(_pvr)		(_pvr.pvr[2] & PVR2_USE_EXTEND_FSL) + +#define PVR_DEBUG_ENABLED(_pvr)		(_pvr.pvr[3] & PVR3_DEBUG_ENABLED_MASK) +#define PVR_NUMBER_OF_PC_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_PC_BRK_MASK) >> 25) +#define PVR_NUMBER_OF_RD_ADDR_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_RD_ADDR_BRK_MASK) >> 19) +#define PVR_NUMBER_OF_WR_ADDR_BRK(_pvr) \ +			((_pvr.pvr[3] & PVR3_NUMBER_OF_WR_ADDR_BRK_MASK) >> 13) +#define PVR_FSL_LINKS(_pvr)	((_pvr.pvr[3] & PVR3_FSL_LINKS_MASK) >> 7) + +#define PVR_ICACHE_ADDR_TAG_BITS(_pvr) \ +		((_pvr.pvr[4] & PVR4_ICACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_ICACHE_USE_FSL(_pvr) \ +		(_pvr.pvr[4] & PVR4_ICACHE_USE_FSL_MASK) +#define PVR_ICACHE_ALLOW_WR(_pvr) \ +		(_pvr.pvr[4] & PVR4_ICACHE_ALLOW_WR_MASK) +#define PVR_ICACHE_LINE_LEN(_pvr) \ +		(1 << ((_pvr.pvr[4] & PVR4_ICACHE_LINE_LEN_MASK) >> 21)) +#define PVR_ICACHE_BYTE_SIZE(_pvr) \ +		(1 << ((_pvr.pvr[4] & PVR4_ICACHE_BYTE_SIZE_MASK) >> 16)) + +#define PVR_DCACHE_ADDR_TAG_BITS(_pvr) \ +			((_pvr.pvr[5] & PVR5_DCACHE_ADDR_TAG_BITS_MASK) >> 26) +#define PVR_DCACHE_USE_FSL(_pvr)	(_pvr.pvr[5] & PVR5_DCACHE_USE_FSL_MASK) +#define PVR_DCACHE_ALLOW_WR(_pvr) \ +			(_pvr.pvr[5] & PVR5_DCACHE_ALLOW_WR_MASK)  /* FIXME two shifts on one line needs any comment */ -#define PVR_DCACHE_LINE_LEN(pvr) \ -			(1 << ((pvr.pvr[5] & PVR5_DCACHE_LINE_LEN_MASK) >> 21)) -#define PVR_DCACHE_BYTE_SIZE(pvr) \ -			(1 << ((pvr.pvr[5] & PVR5_DCACHE_BYTE_SIZE_MASK) >> 16)) - -#define PVR_DCACHE_USE_WRITEBACK(pvr) \ -			((pvr.pvr[5] & PVR5_DCACHE_USE_WRITEBACK) >> 14) +#define PVR_DCACHE_LINE_LEN(_pvr) \ +		(1 << ((_pvr.pvr[5] & PVR5_DCACHE_LINE_LEN_MASK) >> 21)) +#define PVR_DCACHE_BYTE_SIZE(_pvr) \ +		(1 << ((_pvr.pvr[5] & PVR5_DCACHE_BYTE_SIZE_MASK) >> 16)) -#define PVR_ICACHE_BASEADDR(pvr)	(pvr.pvr[6] & PVR6_ICACHE_BASEADDR_MASK) -#define PVR_ICACHE_HIGHADDR(pvr)	(pvr.pvr[7] & PVR7_ICACHE_HIGHADDR_MASK) +#define PVR_DCACHE_USE_WRITEBACK(_pvr) \ +			((_pvr.pvr[5] & PVR5_DCACHE_USE_WRITEBACK) >> 14) -#define PVR_DCACHE_BASEADDR(pvr)	(pvr.pvr[8] & PVR8_DCACHE_BASEADDR_MASK) -#define PVR_DCACHE_HIGHADDR(pvr)	(pvr.pvr[9] & PVR9_DCACHE_HIGHADDR_MASK) +#define PVR_ICACHE_BASEADDR(_pvr) \ +			(_pvr.pvr[6] & PVR6_ICACHE_BASEADDR_MASK) +#define PVR_ICACHE_HIGHADDR(_pvr) \ +			(_pvr.pvr[7] & PVR7_ICACHE_HIGHADDR_MASK) +#define PVR_DCACHE_BASEADDR(_pvr) \ +			(_pvr.pvr[8] & PVR8_DCACHE_BASEADDR_MASK) +#define PVR_DCACHE_HIGHADDR(_pvr) \ +			(_pvr.pvr[9] & PVR9_DCACHE_HIGHADDR_MASK) -#define PVR_TARGET_FAMILY(pvr)	((pvr.pvr[10] & PVR10_TARGET_FAMILY_MASK) >> 24) +#define PVR_TARGET_FAMILY(_pvr) \ +			((_pvr.pvr[10] & PVR10_TARGET_FAMILY_MASK) >> 24) -#define PVR_MSR_RESET_VALUE(pvr) \ -				(pvr.pvr[11] & PVR11_MSR_RESET_VALUE_MASK) +#define PVR_MSR_RESET_VALUE(_pvr) \ +			(_pvr.pvr[11] & PVR11_MSR_RESET_VALUE_MASK)  /* mmu */ -#define PVR_USE_MMU(pvr)	((pvr.pvr[11] & PVR11_USE_MMU) >> 30) -#define PVR_MMU_ITLB_SIZE(pvr)	(pvr.pvr[11] & PVR11_MMU_ITLB_SIZE) -#define PVR_MMU_DTLB_SIZE(pvr)	(pvr.pvr[11] & PVR11_MMU_DTLB_SIZE) -#define PVR_MMU_TLB_ACCESS(pvr)	(pvr.pvr[11] & PVR11_MMU_TLB_ACCESS) -#define PVR_MMU_ZONES(pvr)	(pvr.pvr[11] & PVR11_MMU_ZONES) +#define PVR_USE_MMU(_pvr)		((_pvr.pvr[11] & PVR11_USE_MMU) >> 30) +#define PVR_MMU_ITLB_SIZE(_pvr)		(_pvr.pvr[11] & PVR11_MMU_ITLB_SIZE) +#define PVR_MMU_DTLB_SIZE(_pvr)		(_pvr.pvr[11] & PVR11_MMU_DTLB_SIZE) +#define PVR_MMU_TLB_ACCESS(_pvr)	(_pvr.pvr[11] & PVR11_MMU_TLB_ACCESS) +#define PVR_MMU_ZONES(_pvr)		(_pvr.pvr[11] & PVR11_MMU_ZONES) +#define PVR_MMU_PRIVINS(pvr)		(pvr.pvr[11] & PVR11_MMU_PRIVINS)  /* endian */ -#define PVR_ENDIAN(pvr)	(pvr.pvr[0] & PVR0_ENDI) +#define PVR_ENDIAN(_pvr)	(_pvr.pvr[0] & PVR0_ENDI)  int cpu_has_pvr(void);  void get_pvr(struct pvr_s *pvr); diff --git a/arch/microblaze/include/asm/resource.h b/arch/microblaze/include/asm/resource.h deleted file mode 100644 index 04bc4db8921..00000000000 --- a/arch/microblaze/include/asm/resource.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/resource.h> diff --git a/arch/microblaze/include/asm/sections.h b/arch/microblaze/include/asm/sections.h index 4487e150b45..1b281d3ea73 100644 --- a/arch/microblaze/include/asm/sections.h +++ b/arch/microblaze/include/asm/sections.h @@ -16,11 +16,6 @@  # ifndef __ASSEMBLY__  extern char _ssbss[], _esbss[];  extern unsigned long __ivt_start[], __ivt_end[]; -extern char _etext[], _stext[]; - -#  ifdef CONFIG_MTD_UCLINUX -extern char *_ebss; -#  endif  extern u32 _fdt_start[], _fdt_end[]; diff --git a/arch/microblaze/include/asm/selfmod.h b/arch/microblaze/include/asm/selfmod.h deleted file mode 100644 index c42aff2e6cd..00000000000 --- a/arch/microblaze/include/asm/selfmod.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu> - * - * 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 _ASM_MICROBLAZE_SELFMOD_H -#define _ASM_MICROBLAZE_SELFMOD_H - -/* - * BARRIER_BASE_ADDR is constant address for selfmod function. - * do not change this value - selfmod function is in - * arch/microblaze/kernel/selfmod.c: selfmod_function() - * - * last 16 bits is used for storing register offset - */ - -#define BARRIER_BASE_ADDR	0x1234ff00 - -void selfmod_function(const int *arr_fce, const unsigned int base); - -#endif /* _ASM_MICROBLAZE_SELFMOD_H */ diff --git a/arch/microblaze/include/asm/sembuf.h b/arch/microblaze/include/asm/sembuf.h deleted file mode 100644 index 7673b83cfef..00000000000 --- a/arch/microblaze/include/asm/sembuf.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/sembuf.h> diff --git a/arch/microblaze/include/asm/setup.h b/arch/microblaze/include/asm/setup.h index 8f3968971e4..be84a4d3917 100644 --- a/arch/microblaze/include/asm/setup.h +++ b/arch/microblaze/include/asm/setup.h @@ -7,32 +7,24 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_SETUP_H  #define _ASM_MICROBLAZE_SETUP_H -#define COMMAND_LINE_SIZE	256 +#include <uapi/asm/setup.h>  # ifndef __ASSEMBLY__ - -#  ifdef __KERNEL__  extern unsigned int boot_cpuid; /* move to smp.h */  extern char cmd_line[COMMAND_LINE_SIZE]; -void early_printk(const char *fmt, ...); +extern char *klimit;  int setup_early_printk(char *opt); +void remap_early_printk(void);  void disable_early_printk(void); -#if defined(CONFIG_EARLY_PRINTK) -#define eprintk early_printk -#else -#define eprintk printk -#endif - -void heartbeat(void); -void setup_heartbeat(void); +void microblaze_heartbeat(void); +void microblaze_setup_heartbeat(void);  #   ifdef CONFIG_MMU  extern void mmu_reset(void); @@ -44,13 +36,16 @@ extern void of_platform_reset_gpio_probe(void);  void time_init(void);  void init_IRQ(void);  void machine_early_init(const char *cmdline, unsigned int ram, -			unsigned int fdt, unsigned int msr); +		unsigned int fdt, unsigned int msr, unsigned int tlb0, +		unsigned int tlb1);  void machine_restart(char *cmd);  void machine_shutdown(void);  void machine_halt(void);  void machine_power_off(void); -#  endif/* __KERNEL__ */ +extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); +extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); +  # endif /* __ASSEMBLY__ */  #endif /* _ASM_MICROBLAZE_SETUP_H */ diff --git a/arch/microblaze/include/asm/shmbuf.h b/arch/microblaze/include/asm/shmbuf.h deleted file mode 100644 index 83c05fc2de3..00000000000 --- a/arch/microblaze/include/asm/shmbuf.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/shmbuf.h> diff --git a/arch/microblaze/include/asm/sigcontext.h b/arch/microblaze/include/asm/sigcontext.h deleted file mode 100644 index 55873c80c91..00000000000 --- a/arch/microblaze/include/asm/sigcontext.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * 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 _ASM_MICROBLAZE_SIGCONTEXT_H -#define _ASM_MICROBLAZE_SIGCONTEXT_H - -/* FIXME should be linux/ptrace.h */ -#include <asm/ptrace.h> - -struct sigcontext { -	struct pt_regs regs; -	unsigned long oldmask; -}; - -#endif /* _ASM_MICROBLAZE_SIGCONTEXT_H */ diff --git a/arch/microblaze/include/asm/siginfo.h b/arch/microblaze/include/asm/siginfo.h deleted file mode 100644 index 0815d29d82e..00000000000 --- a/arch/microblaze/include/asm/siginfo.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/siginfo.h> diff --git a/arch/microblaze/include/asm/signal.h b/arch/microblaze/include/asm/signal.h deleted file mode 100644 index 7b1573ce19d..00000000000 --- a/arch/microblaze/include/asm/signal.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/signal.h> diff --git a/arch/microblaze/include/asm/socket.h b/arch/microblaze/include/asm/socket.h deleted file mode 100644 index 6b71384b9d8..00000000000 --- a/arch/microblaze/include/asm/socket.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/socket.h> diff --git a/arch/microblaze/include/asm/sockios.h b/arch/microblaze/include/asm/sockios.h deleted file mode 100644 index def6d4746ee..00000000000 --- a/arch/microblaze/include/asm/sockios.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/sockios.h> diff --git a/arch/microblaze/include/asm/stat.h b/arch/microblaze/include/asm/stat.h deleted file mode 100644 index 3dc90fa92c7..00000000000 --- a/arch/microblaze/include/asm/stat.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/stat.h> diff --git a/arch/microblaze/include/asm/statfs.h b/arch/microblaze/include/asm/statfs.h deleted file mode 100644 index 0b91fe198c2..00000000000 --- a/arch/microblaze/include/asm/statfs.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/statfs.h> diff --git a/arch/microblaze/include/asm/swab.h b/arch/microblaze/include/asm/swab.h deleted file mode 100644 index 7847e563ab6..00000000000 --- a/arch/microblaze/include/asm/swab.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/swab.h> diff --git a/arch/microblaze/include/asm/switch_to.h b/arch/microblaze/include/asm/switch_to.h new file mode 100644 index 00000000000..f45baa2c5e0 --- /dev/null +++ b/arch/microblaze/include/asm/switch_to.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2006 Atmark Techno, Inc. + * + * 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 _ASM_MICROBLAZE_SWITCH_TO_H +#define _ASM_MICROBLAZE_SWITCH_TO_H + +struct task_struct; +struct thread_info; + +extern struct task_struct *_switch_to(struct thread_info *prev, +					struct thread_info *next); + +#define switch_to(prev, next, last)					\ +	do {								\ +		(last) = _switch_to(task_thread_info(prev),		\ +					task_thread_info(next));	\ +	} while (0) + +#endif /* _ASM_MICROBLAZE_SWITCH_TO_H */ diff --git a/arch/microblaze/include/asm/syscall.h b/arch/microblaze/include/asm/syscall.h index 048dfcd8d89..9bc43178310 100644 --- a/arch/microblaze/include/asm/syscall.h +++ b/arch/microblaze/include/asm/syscall.h @@ -96,4 +96,7 @@ static inline void syscall_set_arguments(struct task_struct *task,  		microblaze_set_syscall_arg(regs, i++, *args++);  } +asmlinkage long do_syscall_trace_enter(struct pt_regs *regs); +asmlinkage void do_syscall_trace_leave(struct pt_regs *regs); +  #endif /* __ASM_MICROBLAZE_SYSCALL_H */ diff --git a/arch/microblaze/include/asm/syscalls.h b/arch/microblaze/include/asm/syscalls.h deleted file mode 100644 index 720761cc741..00000000000 --- a/arch/microblaze/include/asm/syscalls.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __ASM_MICROBLAZE_SYSCALLS_H - -asmlinkage long sys_clone(int flags, unsigned long stack, struct pt_regs *regs); -#define sys_clone sys_clone - -#include <asm-generic/syscalls.h> - -#endif /* __ASM_MICROBLAZE_SYSCALLS_H */ diff --git a/arch/microblaze/include/asm/system.h b/arch/microblaze/include/asm/system.h deleted file mode 100644 index e6a2284571d..00000000000 --- a/arch/microblaze/include/asm/system.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2006 Atmark Techno, Inc. - * - * 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 _ASM_MICROBLAZE_SYSTEM_H -#define _ASM_MICROBLAZE_SYSTEM_H - -#include <asm/registers.h> -#include <asm/setup.h> -#include <asm/irqflags.h> -#include <asm/cache.h> - -#include <asm-generic/cmpxchg.h> -#include <asm-generic/cmpxchg-local.h> - -#define __ARCH_WANT_INTERRUPTS_ON_CTXSW - -struct task_struct; -struct thread_info; - -extern struct task_struct *_switch_to(struct thread_info *prev, -					struct thread_info *next); - -#define switch_to(prev, next, last)					\ -	do {								\ -		(last) = _switch_to(task_thread_info(prev),		\ -					task_thread_info(next));	\ -	} while (0) - -#define smp_read_barrier_depends()	do {} while (0) -#define read_barrier_depends()		do {} while (0) - -#define nop()			asm volatile ("nop") -#define mb()			barrier() -#define rmb()			mb() -#define wmb()			mb() -#define set_mb(var, value)	do { var = value; mb(); } while (0) -#define set_wmb(var, value)	do { var = value; wmb(); } while (0) - -#define smp_mb()		mb() -#define smp_rmb()		rmb() -#define smp_wmb()		wmb() - -void __bad_xchg(volatile void *ptr, int size); - -static inline unsigned long __xchg(unsigned long x, volatile void *ptr, -								int size) -{ -	unsigned long ret; -	unsigned long flags; - -	switch (size) { -	case 1: -		local_irq_save(flags); -		ret = *(volatile unsigned char *)ptr; -		*(volatile unsigned char *)ptr = x; -		local_irq_restore(flags); -		break; - -	case 4: -		local_irq_save(flags); -		ret = *(volatile unsigned long *)ptr; -		*(volatile unsigned long *)ptr = x; -		local_irq_restore(flags); -		break; -	default: -		__bad_xchg(ptr, size), ret = 0; -		break; -	} - -	return ret; -} - -void disable_hlt(void); -void enable_hlt(void); -void default_idle(void); - -#define xchg(ptr, x) \ -	((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) - -void free_init_pages(char *what, unsigned long begin, unsigned long end); -void free_initmem(void); -extern char *klimit; -extern void ret_from_fork(void); - -extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); -extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); - -#ifdef CONFIG_DEBUG_FS -extern struct dentry *of_debugfs_root; -#endif - -#define arch_align_stack(x) (x) - -/* - * MicroBlaze doesn't handle unaligned accesses in hardware. - * - * Based on this we force the IP header alignment in network drivers. - */ -#define NET_IP_ALIGN	2 - -#endif /* _ASM_MICROBLAZE_SYSTEM_H */ diff --git a/arch/microblaze/include/asm/termbits.h b/arch/microblaze/include/asm/termbits.h deleted file mode 100644 index 3935b106de7..00000000000 --- a/arch/microblaze/include/asm/termbits.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/termbits.h> diff --git a/arch/microblaze/include/asm/termios.h b/arch/microblaze/include/asm/termios.h deleted file mode 100644 index 280d78a9d96..00000000000 --- a/arch/microblaze/include/asm/termios.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/termios.h> diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h index b73da2ac21b..8c9d36591a0 100644 --- a/arch/microblaze/include/asm/thread_info.h +++ b/arch/microblaze/include/asm/thread_info.h @@ -106,8 +106,6 @@ static inline struct thread_info *current_thread_info(void)  /* thread information allocation */  #endif /* __ASSEMBLY__ */ -#define PREEMPT_ACTIVE		0x10000000 -  /*   * thread information flags   * - these are process state flags that various assembly files may @@ -121,11 +119,9 @@ static inline struct thread_info *current_thread_info(void)  #define TIF_NEED_RESCHED	3 /* rescheduling necessary */  /* restore singlestep on return to user mode */  #define TIF_SINGLESTEP		4 -#define TIF_IRET		5 /* return with iret */  #define TIF_MEMDIE		6	/* is terminating due to OOM killer */  #define TIF_SYSCALL_AUDIT	9       /* syscall auditing active */  #define TIF_SECCOMP		10      /* secure computing */ -#define TIF_FREEZE		14	/* Freezing for suspend */  /* true if poll_idle() is polling TIF_NEED_RESCHED */  #define TIF_POLLING_NRFLAG	16 @@ -135,9 +131,7 @@ static inline struct thread_info *current_thread_info(void)  #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_FREEZE		(1 << TIF_FREEZE)  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)  #define _TIF_SECCOMP		(1 << TIF_SECCOMP) @@ -168,7 +162,23 @@ static inline void set_restore_sigmask(void)  {  	struct thread_info *ti = current_thread_info();  	ti->status |= TS_RESTORE_SIGMASK; -	set_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags); +	WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags)); +} +static inline void clear_restore_sigmask(void) +{ +	current_thread_info()->status &= ~TS_RESTORE_SIGMASK; +} +static inline bool test_restore_sigmask(void) +{ +	return current_thread_info()->status & TS_RESTORE_SIGMASK; +} +static inline bool test_and_clear_restore_sigmask(void) +{ +	struct thread_info *ti = current_thread_info(); +	if (!(ti->status & TS_RESTORE_SIGMASK)) +		return false; +	ti->status &= ~TS_RESTORE_SIGMASK; +	return true;  }  #endif diff --git a/arch/microblaze/include/asm/tlb.h b/arch/microblaze/include/asm/tlb.h index e8abd4a0349..8aa97817cc8 100644 --- a/arch/microblaze/include/asm/tlb.h +++ b/arch/microblaze/include/asm/tlb.h @@ -13,6 +13,7 @@  #define tlb_flush(tlb)	flush_tlb_mm((tlb)->mm) +#include <linux/pagemap.h>  #include <asm-generic/tlb.h>  #ifdef CONFIG_MMU diff --git a/arch/microblaze/include/asm/types.h b/arch/microblaze/include/asm/types.h deleted file mode 100644 index b9e79bc580d..00000000000 --- a/arch/microblaze/include/asm/types.h +++ /dev/null @@ -1 +0,0 @@ -#include <asm-generic/types.h> diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index d840f4a2d3c..0aa005703a0 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h @@ -80,7 +80,7 @@ extern unsigned long search_exception_table(unsigned long);  static inline int ___range_ok(unsigned long addr, unsigned long size)  {  	return ((addr < memory_start) || -		((addr + size) > memory_end)); +		((addr + size - 1) > (memory_start + memory_size - 1)));  }  #define __range_ok(addr, size) \ @@ -90,17 +90,25 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)  #else -/* - * Address is valid if: - *  - "addr", "addr + size" and "size" are all below the limit - */ -#define access_ok(type, addr, size) \ -	(get_fs().seg > (((unsigned long)(addr)) | \ -		(size) | ((unsigned long)(addr) + (size)))) - -/* || printk("access_ok failed for %s at 0x%08lx (size %d), seg 0x%08x\n", - type?"WRITE":"READ",addr,size,get_fs().seg)) */ - +static inline int access_ok(int type, const void __user *addr, +							unsigned long size) +{ +	if (!size) +		goto ok; + +	if ((get_fs().seg < ((unsigned long)addr)) || +			(get_fs().seg < ((unsigned long)addr + size - 1))) { +		pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, +			(u32)get_fs().seg); +		return 0; +	} +ok: +	pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, +			(u32)get_fs().seg); +	return 1; +}  #endif  #ifdef CONFIG_MMU @@ -108,7 +116,7 @@ static inline int ___range_ok(unsigned long addr, unsigned long size)  # define __EX_TABLE_SECTION	".section __ex_table,\"a\"\n"  #else  # define __FIXUP_SECTION	".section .discard,\"ax\"\n" -# define __EX_TABLE_SECTION	".section .discard,\"a\"\n" +# define __EX_TABLE_SECTION	".section .discard,\"ax\"\n"  #endif  extern unsigned long __copy_tofrom_user(void __user *to, @@ -120,16 +128,16 @@ static inline unsigned long __must_check __clear_user(void __user *to,  {  	/* normal memset with two words to __ex_table */  	__asm__ __volatile__ (				\ -			"1:	sb	r0, %2, r0;"	\ +			"1:	sb	r0, %1, r0;"	\  			"	addik	%0, %0, -1;"	\  			"	bneid	%0, 1b;"	\ -			"	addik	%2, %2, 1;"	\ +			"	addik	%1, %1, 1;"	\  			"2:			"	\  			__EX_TABLE_SECTION		\  			".word	1b,2b;"			\  			".previous;"			\ -		: "=r"(n)				\ -		: "0"(n), "r"(to) +		: "=r"(n), "=r"(to)			\ +		: "0"(n), "1"(to)  	);  	return n;  } @@ -137,7 +145,7 @@ static inline unsigned long __must_check __clear_user(void __user *to,  static inline unsigned long __must_check clear_user(void __user *to,  							unsigned long n)  { -	might_sleep(); +	might_fault();  	if (unlikely(!access_ok(VERIFY_WRITE, to, n)))  		return n; @@ -298,11 +306,10 @@ extern long __user_bad(void);  #define __put_user_check(x, ptr, size)					\  ({									\ -	typeof(*(ptr)) __pu_val;					\ +	typeof(*(ptr)) volatile __pu_val = x;					\  	typeof(*(ptr)) __user *__pu_addr = (ptr);			\  	int __pu_err = 0;						\  									\ -	__pu_val = (x);							\  	if (access_ok(VERIFY_WRITE, __pu_addr, size)) {			\  		switch (size) {						\  		case 1:							\ @@ -364,7 +371,7 @@ extern long __user_bad(void);  static inline long copy_from_user(void *to,  		const void __user *from, unsigned long n)  { -	might_sleep(); +	might_fault();  	if (access_ok(VERIFY_READ, from, n))  		return __copy_from_user(to, from, n);  	return n; @@ -378,7 +385,7 @@ static inline long copy_from_user(void *to,  static inline long copy_to_user(void __user *to,  		const void *from, unsigned long n)  { -	might_sleep(); +	might_fault();  	if (access_ok(VERIFY_WRITE, to, n))  		return __copy_to_user(to, from, n);  	return n; diff --git a/arch/microblaze/include/asm/unaligned.h b/arch/microblaze/include/asm/unaligned.h index 2b97cbe500e..b162ed88049 100644 --- a/arch/microblaze/include/asm/unaligned.h +++ b/arch/microblaze/include/asm/unaligned.h @@ -12,18 +12,19 @@  # ifdef __KERNEL__ -# include <linux/unaligned/be_byteshift.h> -# include <linux/unaligned/le_byteshift.h> -# include <linux/unaligned/generic.h> - -  #  ifdef __MICROBLAZEEL__ +#   include <linux/unaligned/le_struct.h> +#   include <linux/unaligned/be_byteshift.h>  #   define get_unaligned	__get_unaligned_le  #   define put_unaligned	__put_unaligned_le  #  else +#   include <linux/unaligned/be_struct.h> +#   include <linux/unaligned/le_byteshift.h>  #   define get_unaligned	__get_unaligned_be  #   define put_unaligned	__put_unaligned_be  #  endif +# include <linux/unaligned/generic.h> +  # endif	/* __KERNEL__ */  #endif /* _ASM_MICROBLAZE_UNALIGNED_H */ diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index d770b00ec6b..fd56a8f6648 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h @@ -6,400 +6,19 @@   * License. See the file "COPYING" in the main directory of this archive   * for more details.   */ -  #ifndef _ASM_MICROBLAZE_UNISTD_H  #define _ASM_MICROBLAZE_UNISTD_H -#define __NR_restart_syscall	0 /* ok */ -#define __NR_exit		1 /* ok */ -#define __NR_fork		2 /* not for no MMU - weird */ -#define __NR_read		3 /* ok */ -#define __NR_write		4 /* ok */ -#define __NR_open		5 /* openat */ -#define __NR_close		6 /* ok */ -#define __NR_waitpid		7 /* waitid */ -#define __NR_creat		8 /* openat */ -#define __NR_link		9 /* linkat */ -#define __NR_unlink		10 /* unlinkat */ -#define __NR_execve		11 /* ok */ -#define __NR_chdir		12 /* ok */ -#define __NR_time		13 /* obsolete -> sys_gettimeofday */ -#define __NR_mknod		14 /* mknodat */ -#define __NR_chmod		15 /* fchmodat */ -#define __NR_lchown		16 /* ok */ -#define __NR_break		17 /* don't know */ -#define __NR_oldstat		18 /* remove */ -#define __NR_lseek		19 /* ok */ -#define __NR_getpid		20 /* ok */ -#define __NR_mount		21 /* ok */ -#define __NR_umount		22 /* ok */  /* use only umount2 */ -#define __NR_setuid		23 /* ok */ -#define __NR_getuid		24 /* ok */ -#define __NR_stime		25 /* obsolete -> sys_settimeofday */ -#define __NR_ptrace		26 /* ok */ -#define __NR_alarm		27 /* obsolete -> sys_setitimer */ -#define __NR_oldfstat		28 /* remove */ -#define __NR_pause		29 /* obsolete -> sys_rt_sigtimedwait */ -#define __NR_utime		30 /* obsolete -> sys_utimesat */ -#define __NR_stty		31 /* remove */ -#define __NR_gtty		32 /* remove */ -#define __NR_access		33 /* faccessat */ -/* can be implemented by sys_setpriority */ -#define __NR_nice		34 -#define __NR_ftime		35 /* remove */ -#define __NR_sync		36 /* ok */ -#define __NR_kill		37 /* ok */ -#define __NR_rename		38 /* renameat */ -#define __NR_mkdir		39 /* mkdirat */ -#define __NR_rmdir		40 /* unlinkat */ -#define __NR_dup		41 /* ok */ -#define __NR_pipe		42 /* ok */ -#define __NR_times		43 /* ok */ -#define __NR_prof		44 /* remove */ -#define __NR_brk		45 /* ok -mmu, nommu specific */ -#define __NR_setgid		46 /* ok */ -#define __NR_getgid		47 /* ok */ -#define __NR_signal		48 /* obsolete -> sys_rt_sigaction */ -#define __NR_geteuid		49 /* ok */ -#define __NR_getegid		50 /* ok */ -#define __NR_acct		51 /* add it and then I can disable it */ -#define __NR_umount2		52 /* remove */ -#define __NR_lock		53 /* remove */ -#define __NR_ioctl		54 /* ok */ -#define __NR_fcntl		55 /* ok -> 64bit version*/ -#define __NR_mpx		56 /* remove */ -#define __NR_setpgid		57 /* ok */ -#define __NR_ulimit		58 /* remove */ -#define __NR_oldolduname	59 /* remove */ -#define __NR_umask		60 /* ok */ -#define __NR_chroot		61 /* ok */ -#define __NR_ustat		62 /* obsolete -> statfs64 */ -#define __NR_dup2		63 /* ok */ -#define __NR_getppid		64 /* ok */ -#define __NR_getpgrp		65 /* obsolete -> sys_getpgid */ -#define __NR_setsid		66 /* ok */ -#define __NR_sigaction		67 /* obsolete -> rt_sigaction */ -#define __NR_sgetmask		68 /* obsolete -> sys_rt_sigprocmask */ -#define __NR_ssetmask		69 /* obsolete ->sys_rt_sigprocmask */ -#define __NR_setreuid		70 /* ok */ -#define __NR_setregid		71 /* ok */ -#define __NR_sigsuspend		72 /* obsolete -> rt_sigsuspend */ -#define __NR_sigpending		73 /* obsolete -> sys_rt_sigpending */ -#define __NR_sethostname	74 /* ok */ -#define __NR_setrlimit		75 /* ok */ -#define __NR_getrlimit		76 /* ok Back compatible 2G limited rlimit */ -#define __NR_getrusage		77 /* ok */ -#define __NR_gettimeofday	78 /* ok */ -#define __NR_settimeofday	79 /* ok */ -#define __NR_getgroups		80 /* ok */ -#define __NR_setgroups		81 /* ok */ -#define __NR_select		82 /* obsolete -> sys_pselect7 */ -#define __NR_symlink		83 /* symlinkat */ -#define __NR_oldlstat		84 /* remove */ -#define __NR_readlink		85 /* obsolete -> sys_readlinkat */ -#define __NR_uselib		86 /* remove */ -#define __NR_swapon		87 /* ok */ -#define __NR_reboot		88 /* ok */ -#define __NR_readdir		89 /* remove ? */ -#define __NR_mmap		90 /* obsolete -> sys_mmap2 */ -#define __NR_munmap		91 /* ok - mmu and nommu */ -#define __NR_truncate		92 /* ok or truncate64 */ -#define __NR_ftruncate		93 /* ok or ftruncate64 */ -#define __NR_fchmod		94 /* ok */ -#define __NR_fchown		95 /* ok */ -#define __NR_getpriority	96 /* ok */ -#define __NR_setpriority	97 /* ok */ -#define __NR_profil		98 /* remove */ -#define __NR_statfs		99 /* ok or statfs64 */ -#define __NR_fstatfs		100  /* ok or fstatfs64 */ -#define __NR_ioperm		101 /* remove */ -#define __NR_socketcall		102 /* remove */ -#define __NR_syslog		103 /* ok */ -#define __NR_setitimer		104 /* ok */ -#define __NR_getitimer		105 /* ok */ -#define __NR_stat		106 /* remove */ -#define __NR_lstat		107 /* remove */ -#define __NR_fstat		108 /* remove */ -#define __NR_olduname		109 /* remove */ -#define __NR_iopl		110 /* remove */ -#define __NR_vhangup		111 /* ok */ -#define __NR_idle		112 /* remove */ -#define __NR_vm86old		113 /* remove */ -#define __NR_wait4		114 /* obsolete -> waitid */ -#define __NR_swapoff		115 /* ok */ -#define __NR_sysinfo		116 /* ok */ -#define __NR_ipc		117 /* remove - direct call */ -#define __NR_fsync		118 /* ok */ -#define __NR_sigreturn		119 /* obsolete -> sys_rt_sigreturn */ -#define __NR_clone		120 /* ok */ -#define __NR_setdomainname	121 /* ok */ -#define __NR_uname		122 /* remove */ -#define __NR_modify_ldt		123 /* remove */ -#define __NR_adjtimex		124 /* ok */ -#define __NR_mprotect		125 /* remove */ -#define __NR_sigprocmask	126 /* obsolete -> sys_rt_sigprocmask */ -#define __NR_create_module	127 /* remove */ -#define __NR_init_module	128 /* ok */ -#define __NR_delete_module	129 /* ok */ -#define __NR_get_kernel_syms	130 /* remove */ -#define __NR_quotactl		131 /* ok */ -#define __NR_getpgid		132 /* ok */ -#define __NR_fchdir		133 /* ok */ -#define __NR_bdflush		134 /* remove */ -#define __NR_sysfs		135 /* needed for busybox */ -#define __NR_personality	136 /* ok */ -#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ -#define __NR_setfsuid		138 /* ok */ -#define __NR_setfsgid		139 /* ok */ -#define __NR__llseek		140 /* remove only lseek */ -#define __NR_getdents		141 /* ok or getdents64 */ -#define __NR__newselect		142 /* remove */ -#define __NR_flock		143 /* ok */ -#define __NR_msync		144 /* remove */ -#define __NR_readv		145 /* ok */ -#define __NR_writev		146 /* ok */ -#define __NR_getsid		147 /* ok */ -#define __NR_fdatasync		148 /* ok */ -#define __NR__sysctl		149 /* remove */ -#define __NR_mlock		150 /* ok - nommu or mmu */ -#define __NR_munlock		151 /* ok - nommu or mmu */ -#define __NR_mlockall		152 /* ok - nommu or mmu */ -#define __NR_munlockall		153 /* ok - nommu or mmu */ -#define __NR_sched_setparam		154 /* ok */ -#define __NR_sched_getparam		155 /* ok */ -#define __NR_sched_setscheduler		156 /* ok */ -#define __NR_sched_getscheduler		157 /* ok */ -#define __NR_sched_yield		158 /* ok */ -#define __NR_sched_get_priority_max	159 /* ok */ -#define __NR_sched_get_priority_min	160 /* ok */ -#define __NR_sched_rr_get_interval	161 /* ok */ -#define __NR_nanosleep		162 /* ok */ -#define __NR_mremap		163 /* ok - nommu or mmu */ -#define __NR_setresuid		164 /* ok */ -#define __NR_getresuid		165 /* ok */ -#define __NR_vm86		166 /* remove */ -#define __NR_query_module	167 /* ok */ -#define __NR_poll		168 /* obsolete -> sys_ppoll */ -#define __NR_nfsservctl		169 /* ok */ -#define __NR_setresgid		170 /* ok */ -#define __NR_getresgid		171 /* ok */ -#define __NR_prctl		172 /* ok */ -#define __NR_rt_sigreturn	173 /* ok */ -#define __NR_rt_sigaction	174 /* ok */ -#define __NR_rt_sigprocmask	175 /* ok */ -#define __NR_rt_sigpending	176 /* ok */ -#define __NR_rt_sigtimedwait	177 /* ok */ -#define __NR_rt_sigqueueinfo	178 /* ok */ -#define __NR_rt_sigsuspend	179 /* ok */ -#define __NR_pread64		180 /* ok */ -#define __NR_pwrite64		181 /* ok */ -#define __NR_chown		182 /* obsolete -> fchownat */ -#define __NR_getcwd		183 /* ok */ -#define __NR_capget		184 /* ok */ -#define __NR_capset		185 /* ok */ -#define __NR_sigaltstack	186 /* remove */ -#define __NR_sendfile		187 /* ok -> exist 64bit version*/ -#define __NR_getpmsg		188 /* remove */ -/* remove - some people actually want streams */ -#define __NR_putpmsg		189 -/* for noMMU - group with clone -> maybe remove */ -#define __NR_vfork		190 -#define __NR_ugetrlimit		191 /* remove - SuS compliant getrlimit */ -#define __NR_mmap2		192 /* ok */ -#define __NR_truncate64		193 /* ok */ -#define __NR_ftruncate64	194 /* ok */ -#define __NR_stat64		195 /* remove _ARCH_WANT_STAT64 */ -#define __NR_lstat64		196 /* remove _ARCH_WANT_STAT64 */ -#define __NR_fstat64		197 /* remove _ARCH_WANT_STAT64 */ -#define __NR_lchown32		198 /* ok - without 32 */ -#define __NR_getuid32		199 /* ok - without 32 */ -#define __NR_getgid32		200 /* ok - without 32 */ -#define __NR_geteuid32		201 /* ok - without 32 */ -#define __NR_getegid32		202 /* ok - without 32 */ -#define __NR_setreuid32		203 /* ok - without 32 */ -#define __NR_setregid32		204 /* ok - without 32 */ -#define __NR_getgroups32	205 /* ok - without 32 */ -#define __NR_setgroups32	206 /* ok - without 32 */ -#define __NR_fchown32		207 /* ok - without 32 */ -#define __NR_setresuid32	208 /* ok - without 32 */ -#define __NR_getresuid32	209 /* ok - without 32 */ -#define __NR_setresgid32	210 /* ok - without 32 */ -#define __NR_getresgid32	211 /* ok - without 32 */ -#define __NR_chown32		212 /* ok - without 32 -obsolete -> fchownat */ -#define __NR_setuid32		213 /* ok - without 32 */ -#define __NR_setgid32		214 /* ok - without 32 */ -#define __NR_setfsuid32		215 /* ok - without 32 */ -#define __NR_setfsgid32		216 /* ok - without 32 */ -#define __NR_pivot_root		217 /* ok */ -#define __NR_mincore		218 /* ok */ -#define __NR_madvise		219 /* ok */ -#define __NR_getdents64		220 /* ok */ -#define __NR_fcntl64		221 /* ok */ -/* 223 is unused */ -#define __NR_gettid		224 /* ok */ -#define __NR_readahead		225 /* ok */ -#define __NR_setxattr		226 /* ok */ -#define __NR_lsetxattr		227 /* ok */ -#define __NR_fsetxattr		228 /* ok */ -#define __NR_getxattr		229 /* ok */ -#define __NR_lgetxattr		230 /* ok */ -#define __NR_fgetxattr		231 /* ok */ -#define __NR_listxattr		232 /* ok */ -#define __NR_llistxattr		233 /* ok */ -#define __NR_flistxattr		234 /* ok */ -#define __NR_removexattr	235 /* ok */ -#define __NR_lremovexattr	236 /* ok */ -#define __NR_fremovexattr	237 /* ok */ -#define __NR_tkill		238 /* ok */ -#define __NR_sendfile64		239 /* ok */ -#define __NR_futex		240 /* ok */ -#define __NR_sched_setaffinity	241 /* ok */ -#define __NR_sched_getaffinity	242 /* ok */ -#define __NR_set_thread_area	243 /* remove */ -#define __NR_get_thread_area	244 /* remove */ -#define __NR_io_setup		245 /* ok */ -#define __NR_io_destroy		246 /* ok */ -#define __NR_io_getevents	247 /* ok */ -#define __NR_io_submit		248 /* ok */ -#define __NR_io_cancel		249 /* ok */ -#define __NR_fadvise64		250 /* remove -> sys_fadvise64_64 */ -/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ -#define __NR_exit_group		252 /* ok */ -#define __NR_lookup_dcookie	253 /* ok */ -#define __NR_epoll_create	254 /* ok */ -#define __NR_epoll_ctl		255 /* ok */ -#define __NR_epoll_wait		256 /* obsolete -> sys_epoll_pwait */ -#define __NR_remap_file_pages	257 /* only for mmu */ -#define __NR_set_tid_address	258 /* ok */ -#define __NR_timer_create	259 /* ok */ -#define __NR_timer_settime	(__NR_timer_create+1) /* 260 */ /* ok */ -#define __NR_timer_gettime	(__NR_timer_create+2) /* 261 */ /* ok */ -#define __NR_timer_getoverrun	(__NR_timer_create+3) /* 262 */ /* ok */ -#define __NR_timer_delete	(__NR_timer_create+4) /* 263 */ /* ok */ -#define __NR_clock_settime	(__NR_timer_create+5) /* 264 */ /* ok */ -#define __NR_clock_gettime	(__NR_timer_create+6) /* 265 */ /* ok */ -#define __NR_clock_getres	(__NR_timer_create+7) /* 266 */ /* ok */ -#define __NR_clock_nanosleep	(__NR_timer_create+8) /* 267 */ /* ok */ -#define __NR_statfs64		268 /* ok */ -#define __NR_fstatfs64		269 /* ok */ -#define __NR_tgkill		270 /* ok */ -#define __NR_utimes		271 /* obsolete -> sys_futimesat */ -#define __NR_fadvise64_64	272 /* ok */ -#define __NR_vserver		273 /* ok */ -#define __NR_mbind		274 /* only for mmu */ -#define __NR_get_mempolicy	275 /* only for mmu */ -#define __NR_set_mempolicy	276 /* only for mmu */ -#define __NR_mq_open		277 /* ok */ -#define __NR_mq_unlink		(__NR_mq_open+1) /* 278 */ /* ok */ -#define __NR_mq_timedsend	(__NR_mq_open+2) /* 279 */ /* ok */ -#define __NR_mq_timedreceive	(__NR_mq_open+3) /* 280 */ /* ok */ -#define __NR_mq_notify		(__NR_mq_open+4) /* 281 */ /* ok */ -#define __NR_mq_getsetattr	(__NR_mq_open+5) /* 282 */ /* ok */ -#define __NR_kexec_load		283 /* ok */ -#define __NR_waitid		284 /* ok */ -/* #define __NR_sys_setaltroot	285 */ -#define __NR_add_key		286 /* ok */ -#define __NR_request_key	287 /* ok */ -#define __NR_keyctl		288 /* ok */ -#define __NR_ioprio_set		289 /* ok */ -#define __NR_ioprio_get		290 /* ok */ -#define __NR_inotify_init	291 /* ok */ -#define __NR_inotify_add_watch	292 /* ok */ -#define __NR_inotify_rm_watch	293 /* ok */ -#define __NR_migrate_pages	294 /* mmu */ -#define __NR_openat		295 /* ok */ -#define __NR_mkdirat		296 /* ok */ -#define __NR_mknodat		297 /* ok */ -#define __NR_fchownat		298 /* ok */ -#define __NR_futimesat		299 /* obsolete -> sys_utimesat */ -#define __NR_fstatat64		300 /* stat64 */ -#define __NR_unlinkat		301 /* ok */ -#define __NR_renameat		302 /* ok */ -#define __NR_linkat		303 /* ok */ -#define __NR_symlinkat		304 /* ok */ -#define __NR_readlinkat		305 /* ok */ -#define __NR_fchmodat		306 /* ok */ -#define __NR_faccessat		307 /* ok */ -#define __NR_pselect6		308 /* obsolete -> sys_pselect7 */ -#define __NR_ppoll		309 /* ok */ -#define __NR_unshare		310 /* ok */ -#define __NR_set_robust_list	311 /* ok */ -#define __NR_get_robust_list	312 /* ok */ -#define __NR_splice		313 /* ok */ -#define __NR_sync_file_range	314 /* ok */ -#define __NR_tee		315 /* ok */ -#define __NR_vmsplice		316 /* ok */ -#define __NR_move_pages		317 /* mmu */ -#define __NR_getcpu		318 /* ok */ -#define __NR_epoll_pwait	319 /* ok */ -#define __NR_utimensat		320 /* ok */ -#define __NR_signalfd		321 /* ok */ -#define __NR_timerfd_create	322 /* ok */ -#define __NR_eventfd		323 /* ok */ -#define __NR_fallocate		324 /* ok */ -#define __NR_semtimedop		325 /* ok - semaphore group */ -#define __NR_timerfd_settime	326 /* ok */ -#define __NR_timerfd_gettime	327 /* ok */ -/* sysv ipc syscalls */ -#define __NR_semctl		328 /* ok */ -#define __NR_semget		329 /* ok */ -#define __NR_semop		330 /* ok */ -#define __NR_msgctl		331 /* ok */ -#define __NR_msgget		332 /* ok */ -#define __NR_msgrcv		333 /* ok */ -#define __NR_msgsnd		334 /* ok */ -#define __NR_shmat		335 /* ok */ -#define __NR_shmctl		336 /* ok */ -#define __NR_shmdt		337 /* ok */ -#define __NR_shmget		338 /* ok */ - - -#define __NR_signalfd4		339 /* new */ -#define __NR_eventfd2		340 /* new */ -#define __NR_epoll_create1	341 /* new */ -#define __NR_dup3		342 /* new */ -#define __NR_pipe2		343 /* new */ -#define __NR_inotify_init1	344 /* new */ -#define __NR_socket		345 /* new */ -#define __NR_socketpair		346 /* new */ -#define __NR_bind		347 /* new */ -#define __NR_listen		348 /* new */ -#define __NR_accept		349 /* new */ -#define __NR_connect		350 /* new */ -#define __NR_getsockname	351 /* new */ -#define __NR_getpeername	352 /* new */ -#define __NR_sendto		353 /* new */ -#define __NR_send		354 /* new */ -#define __NR_recvfrom		355 /* new */ -#define __NR_recv		356 /* new */ -#define __NR_setsockopt		357 /* new */ -#define __NR_getsockopt		358 /* new */ -#define __NR_shutdown		359 /* new */ -#define __NR_sendmsg		360 /* new */ -#define __NR_recvmsg		361 /* new */ -#define __NR_accept4		362 /* new */ -#define __NR_preadv		363 /* new */ -#define __NR_pwritev		364 /* new */ -#define __NR_rt_tgsigqueueinfo	365 /* new */ -#define __NR_perf_event_open	366 /* new */ -#define __NR_recvmmsg		367 /* new */ -#define __NR_fanotify_init	368 -#define __NR_fanotify_mark	369 -#define __NR_prlimit64		370 +#include <uapi/asm/unistd.h> -#define __NR_syscalls		371 - -#ifdef __KERNEL__  #ifndef __ASSEMBLY__ -#define __ARCH_WANT_IPC_PARSE_VERSION  /* #define __ARCH_WANT_OLD_READDIR */  /* #define __ARCH_WANT_OLD_STAT */  #define __ARCH_WANT_STAT64  #define __ARCH_WANT_SYS_ALARM  #define __ARCH_WANT_SYS_GETHOSTNAME  #define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK  #define __ARCH_WANT_SYS_SIGNAL  #define __ARCH_WANT_SYS_TIME  #define __ARCH_WANT_SYS_UTIME @@ -413,17 +32,12 @@  #define __ARCH_WANT_SYS_OLDUMOUNT  #define __ARCH_WANT_SYS_SIGPENDING  #define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND - -/* - * "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 +#define __ARCH_WANT_SYS_VFORK +#define __ARCH_WANT_SYS_FORK  #endif /* __ASSEMBLY__ */ -#endif /* __KERNEL__ */ + +#define __NR_syscalls         381 +  #endif /* _ASM_MICROBLAZE_UNISTD_H */  | 
