diff options
Diffstat (limited to 'include')
38 files changed, 423 insertions, 541 deletions
diff --git a/include/asm-arm/arch-sa1100/cerf.h b/include/asm-arm/arch-sa1100/cerf.h index 7bdc6a296f18..356d5ba88991 100644 --- a/include/asm-arm/arch-sa1100/cerf.h +++ b/include/asm-arm/arch-sa1100/cerf.h @@ -1,110 +1,29 @@ +/* + * include/asm-arm/arch-sa1100/cerf.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Apr-2003 : Removed some old PDA crud [FB] + */ #ifndef _INCLUDE_CERF_H_ #define _INCLUDE_CERF_H_ #include <linux/config.h> -#ifdef CONFIG_SA1100_CERF_CPLD +#define CERF_ETH_IO 0xf0000000 +#define CERF_ETH_IRQ IRQ_GPIO26 +#define CERF_GPIO_CF_BVD2 GPIO_GPIO (19) +#define CERF_GPIO_CF_BVD1 GPIO_GPIO (20) +#define CERF_GPIO_CF_RESET GPIO_GPIO (21) +#define CERF_GPIO_CF_IRQ GPIO_GPIO (22) +#define CERF_GPIO_CF_CD GPIO_GPIO (23) -// Map sa1100fb.c to sa1100_frontlight.c - Not pretty, but necessary. -#define CERF_BACKLIGHT_ENABLE sa1100_fl_enable -#define CERF_BACKLIGHT_DISABLE sa1100_fl_disable - -// -// IO Pins for devices -// - -#define CERF_PDA_CPLD 0xf1000000 -#define CERF_PDA_CPLD_WRCLRINT (0x0) -#define CERF_PDA_CPLD_BACKLIGHT (0x2) -#define CERF_PDA_CPLD_SOUND_FREQ (0x4) -#define CERF_PDA_CPLD_KEYPAD_A (0x6) -#define CERF_PDA_CPLD_BATTFAULT (0x8) -#define CERF_PDA_CPLD_KEYPAD_B (0xa) -#define CERF_PDA_CPLD_SOUND_ENA (0xc) -#define CERF_PDA_CPLD_SOUND_RESET (0xe) - -#define GPIO_CF_BVD2 GPIO_GPIO (5) -#define GPIO_CF_BVD1 GPIO_GPIO (6) -#define GPIO_CF_RESET GPIO_GPIO (7) -#define GPIO_CF_IRQ GPIO_GPIO (8) -#define GPIO_CF_CD GPIO_GPIO (9) - -#define GPIO_PWR_SHUTDOWN GPIO_GPIO (25) - -#define UCB1200_GPIO_CONT_CS 0x0001 -#define UCB1200_GPIO_CONT_DOWN 0x0002 -#define UCB1200_GPIO_CONT_INC 0x0004 -#define UCB1200_GPIO_CONT_ENA 0x0008 -#define UCB1200_GPIO_LCD_RESET 0x0010 -#define UCB1200_GPIO_IRDA_ENABLE 0x0020 -#define UCB1200_GPIO_BT_ENABLE 0x0040 -#define UCB1200_GPIO_L3_DATA 0x0080 -#define UCB1200_GPIO_L3_CLOCK 0x0100 -#define UCB1200_GPIO_L3_MODE 0x0200 - -// -// IRQ for devices -// - -#define IRQ_UCB1200_CONT_CS IRQ_UCB1200_IO0 -#define IRQ_UCB1200_CONT_DOWN IRQ_UCB1200_IO1 -#define IRQ_UCB1200_CONT_INC IRQ_UCB1200_IO2 -#define IRQ_UCB1200_CONT_ENA IRQ_UCB1200_IO3 -#define IRQ_UCB1200_LCD_RESET IRQ_UCB1200_IO4 -#define IRQ_UCB1200_IRDA_ENABLE IRQ_UCB1200_IO5 -#define IRQ_UCB1200_BT_ENABLE IRQ_UCB1200_IO6 -#define IRQ_UCB1200_L3_DATA IRQ_UCB1200_IO7 -#define IRQ_UCB1200_L3_CLOCK IRQ_UCB1200_IO8 -#define IRQ_UCB1200_L3_MODE IRQ_UCB1200_IO9 - -#define IRQ_GPIO_CF_BVD2 IRQ_GPIO5 -#define IRQ_GPIO_CF_BVD1 IRQ_GPIO6 -#define IRQ_GPIO_CF_IRQ IRQ_GPIO8 -#define IRQ_GPIO_CF_CD IRQ_GPIO9 - -// -// Device parameters -// - -#define CERF_PDA_CPLD_SOUND_FREQ_8000 (0x01) -#define CERF_PDA_CPLD_SOUND_FREQ_11025 (0x05) -#define CERF_PDA_CPLD_SOUND_FREQ_16000 (0x02) -#define CERF_PDA_CPLD_SOUND_FREQ_22050 (0x06) -#define CERF_PDA_CPLD_SOUND_FREQ_32000 (0x03) -#define CERF_PDA_CPLD_SOUND_FREQ_44100 (0x07) -#define CERF_PDA_CPLD_SOUND_FREQ_48000 (0x0b) - -// -// General Functions -// - -#define CERF_PDA_CPLD_Get(x, y) (*((char*)(CERF_PDA_CPLD + (x))) & (y)) -#define CERF_PDA_CPLD_Set(x, y, z) (*((char*)(CERF_PDA_CPLD + (x))) = (*((char*)(CERF_PDA_CPLD + (x))) & ~(z)) | (y)) -#define CERF_PDA_CPLD_UnSet(x, y, z) (*((char*)(CERF_PDA_CPLD + (x))) = (*((char*)(CERF_PDA_CPLD + (x))) & ~(z)) & ~(y)) - - -#else // CONFIG_SA1100_CERF_CPLD - - -#define GPIO_CF_BVD2 GPIO_GPIO (19) -#define GPIO_CF_BVD1 GPIO_GPIO (20) -#define GPIO_CF_RESET 0 -#define GPIO_CF_IRQ GPIO_GPIO (22) -#define GPIO_CF_CD GPIO_GPIO (23) - -#define GPIO_LCD_RESET GPIO_GPIO (15) - -#define IRQ_GPIO_CF_BVD2 IRQ_GPIO19 -#define IRQ_GPIO_CF_BVD1 IRQ_GPIO20 -#define IRQ_GPIO_CF_IRQ IRQ_GPIO22 -#define IRQ_GPIO_CF_CD IRQ_GPIO23 - - -#endif // CONFIG_SA1100_CERF_CPLD - - -#define GPIO_UCB1200_IRQ GPIO_GPIO (18) -#define IRQ_GPIO_UCB1200_IRQ IRQ_GPIO18 +#define CERF_IRQ_GPIO_CF_BVD2 IRQ_GPIO19 +#define CERF_IRQ_GPIO_CF_BVD1 IRQ_GPIO20 +#define CERF_IRQ_GPIO_CF_IRQ IRQ_GPIO22 +#define CERF_IRQ_GPIO_CF_CD IRQ_GPIO23 #endif // _INCLUDE_CERF_H_ diff --git a/include/asm-arm/assembler.h b/include/asm-arm/assembler.h index 84ab93eb4643..69a28f96bee2 100644 --- a/include/asm-arm/assembler.h +++ b/include/asm-arm/assembler.h @@ -25,11 +25,25 @@ #ifndef __ARMEB__ #define pull lsr #define push lsl -#define byte(x) (x*8) +#define get_byte_0 lsl #0 +#define get_byte_1 lsr #8 +#define get_byte_2 lsr #16 +#define get_byte_3 lsr #24 +#define put_byte_0 lsl #0 +#define put_byte_1 lsl #8 +#define put_byte_2 lsl #16 +#define put_byte_3 lsl #24 #else #define pull lsl #define push lsr -#define byte(x) ((3-x)*8) +#define get_byte_0 lsr #24 +#define get_byte_1 lsr #16 +#define get_byte_2 lsr #8 +#define get_byte_3 lsl #0 +#define put_byte_0 lsl #24 +#define put_byte_1 lsl #16 +#define put_byte_2 lsl #8 +#define put_byte_3 lsl #0 #endif /* diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index 917adde845ba..8ae0be984492 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h @@ -29,7 +29,7 @@ * * First, the atomic bitops. These use native endian. */ -static inline void ____atomic_set_bit(unsigned int bit, unsigned long *p) +static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned long mask = 1UL << (bit & 31); @@ -41,7 +41,7 @@ static inline void ____atomic_set_bit(unsigned int bit, unsigned long *p) local_irq_restore(flags); } -static inline void ____atomic_clear_bit(unsigned int bit, unsigned long *p) +static inline void ____atomic_clear_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned long mask = 1UL << (bit & 31); @@ -53,7 +53,7 @@ static inline void ____atomic_clear_bit(unsigned int bit, unsigned long *p) local_irq_restore(flags); } -static inline void ____atomic_change_bit(unsigned int bit, unsigned long *p) +static inline void ____atomic_change_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned long mask = 1UL << (bit & 31); @@ -66,7 +66,7 @@ static inline void ____atomic_change_bit(unsigned int bit, unsigned long *p) } static inline int -____atomic_test_and_set_bit(unsigned int bit, unsigned long *p) +____atomic_test_and_set_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned int res; @@ -83,7 +83,7 @@ ____atomic_test_and_set_bit(unsigned int bit, unsigned long *p) } static inline int -____atomic_test_and_clear_bit(unsigned int bit, unsigned long *p) +____atomic_test_and_clear_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned int res; @@ -100,7 +100,7 @@ ____atomic_test_and_clear_bit(unsigned int bit, unsigned long *p) } static inline int -____atomic_test_and_change_bit(unsigned int bit, unsigned long *p) +____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) { unsigned long flags; unsigned int res; @@ -171,7 +171,7 @@ static inline int __test_and_change_bit(int nr, volatile unsigned long *p) /* * This routine doesn't need to be atomic. */ -static inline int __test_bit(int nr, const unsigned long * p) +static inline int __test_bit(int nr, const volatile unsigned long * p) { return (p[nr >> 5] >> (nr & 31)) & 1UL; } @@ -204,24 +204,24 @@ static inline int __test_bit(int nr, const unsigned long * p) /* * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. */ -extern void _set_bit_le(int nr, unsigned long * p); -extern void _clear_bit_le(int nr, unsigned long * p); -extern void _change_bit_le(int nr, unsigned long * p); -extern int _test_and_set_bit_le(int nr, unsigned long * p); -extern int _test_and_clear_bit_le(int nr, unsigned long * p); -extern int _test_and_change_bit_le(int nr, unsigned long * p); +extern void _set_bit_le(int nr, volatile unsigned long * p); +extern void _clear_bit_le(int nr, volatile unsigned long * p); +extern void _change_bit_le(int nr, volatile unsigned long * p); +extern int _test_and_set_bit_le(int nr, volatile unsigned long * p); +extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p); +extern int _test_and_change_bit_le(int nr, volatile unsigned long * p); extern int _find_first_zero_bit_le(void * p, unsigned size); extern int _find_next_zero_bit_le(void * p, int size, int offset); /* * Big endian assembly bitops. nr = 0 -> byte 3 bit 0. */ -extern void _set_bit_be(int nr, unsigned long * p); -extern void _clear_bit_be(int nr, unsigned long * p); -extern void _change_bit_be(int nr, unsigned long * p); -extern int _test_and_set_bit_be(int nr, unsigned long * p); -extern int _test_and_clear_bit_be(int nr, unsigned long * p); -extern int _test_and_change_bit_be(int nr, unsigned long * p); +extern void _set_bit_be(int nr, volatile unsigned long * p); +extern void _clear_bit_be(int nr, volatile unsigned long * p); +extern void _change_bit_be(int nr, volatile unsigned long * p); +extern int _test_and_set_bit_be(int nr, volatile unsigned long * p); +extern int _test_and_clear_bit_be(int nr, volatile unsigned long * p); +extern int _test_and_change_bit_be(int nr, volatile unsigned long * p); extern int _find_first_zero_bit_be(void * p, unsigned size); extern int _find_next_zero_bit_be(void * p, int size, int offset); diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index a88a0d97e62c..ba660c9524c1 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h @@ -209,8 +209,21 @@ extern void dmac_flush_range(unsigned long, unsigned long); #endif +/* + * flush_cache_vmap() is used when creating mappings (eg, via vmap, + * vmalloc, ioremap etc) in kernel space for pages. Since the + * direct-mappings of these pages may contain cached data, we need + * to do a full cache flush to ensure that writebacks don't corrupt + * data placed into these pages via the new mappings. + */ #define flush_cache_vmap(start, end) flush_cache_all() #define flush_cache_vunmap(start, end) flush_cache_all() + +/* + * Copy user data from/to a page which is mapped into a different + * processes address space. Really, we want to allow our "user + * space" model to handle this. + */ #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ do { memcpy(dst, src, len); \ flush_icache_user_range(vma, page, vaddr, len); \ diff --git a/include/asm-arm/thread_info.h b/include/asm-arm/thread_info.h index 642810a9ed84..16a541206166 100644 --- a/include/asm-arm/thread_info.h +++ b/include/asm-arm/thread_info.h @@ -51,8 +51,9 @@ struct thread_info { __u32 cpu; /* cpu */ __u32 cpu_domain; /* cpu domain */ struct cpu_context_save cpu_context; /* cpu context */ - struct restart_block restart_block; + __u8 used_cp[16]; /* thread used copro */ union fp_state fpstate; + struct restart_block restart_block; }; #define INIT_THREAD_INFO(tsk) \ @@ -107,7 +108,8 @@ extern void free_thread_info(struct thread_info *); #define TI_CPU 20 #define TI_CPU_DOMAIN 24 #define TI_CPU_SAVE 28 -#define TI_FPSTATE 76 +#define TI_USED_MATH 76 +#define TI_FPSTATE (TI_USED_MATH+16) #endif diff --git a/include/asm-ppc/todc.h b/include/asm-ppc/todc.h index 0419f2803ecd..5a9e53c21eba 100644 --- a/include/asm-ppc/todc.h +++ b/include/asm-ppc/todc.h @@ -290,8 +290,8 @@ typedef struct { #define TODC_TYPE_MC146818_SECONDS 0x00 #define TODC_TYPE_MC146818_CNTL_B 0x0a #define TODC_TYPE_MC146818_CNTL_A 0x0b /* control_a R/W regs */ -#define TODC_TYPE_MC146818_WATCHDOG 0x0c -#define TODC_TYPE_MC146818_INTERRUPTS 0x0d +#define TODC_TYPE_MC146818_WATCHDOG 0 +#define TODC_TYPE_MC146818_INTERRUPTS 0x0c #define TODC_TYPE_MC146818_ALARM_DATE 0xff #define TODC_TYPE_MC146818_ALARM_HOUR 0x05 #define TODC_TYPE_MC146818_ALARM_MINUTES 0x03 diff --git a/include/asm-ppc64/bugs.h b/include/asm-ppc64/bugs.h index 3b95d97ab75d..861074b3cf71 100644 --- a/include/asm-ppc64/bugs.h +++ b/include/asm-ppc64/bugs.h @@ -3,6 +3,10 @@ * bugs. * */ +#ifndef _ASM_PPC64_BUGS_H +#define _ASM_PPC64_BUGS_H static void check_bugs(void) { } + +#endif /* _ASM_PPC64_BUGS_H */ diff --git a/include/asm-ppc64/cputable.h b/include/asm-ppc64/cputable.h index 15206be6a46e..99c3abfba704 100644 --- a/include/asm-ppc64/cputable.h +++ b/include/asm-ppc64/cputable.h @@ -15,6 +15,8 @@ #ifndef __ASM_PPC_CPUTABLE_H #define __ASM_PPC_CPUTABLE_H +#include <linux/config.h> + /* Exposed to userland CPU features - Must match ppc32 definitions */ #define PPC_FEATURE_32 0x80000000 #define PPC_FEATURE_64 0x40000000 @@ -133,10 +135,17 @@ extern firmware_feature_t firmware_features_table[]; #define COMMON_USER_PPC64 (PPC_FEATURE_32 | PPC_FEATURE_64 | \ PPC_FEATURE_HAS_FPU | PPC_FEATURE_HAS_MMU) -#define CPU_FTR_PPCAS_ARCH_V2 (CPU_FTR_SLB | CPU_FTR_16M_PAGE | \ +#define CPU_FTR_PPCAS_ARCH_V2_BASE (CPU_FTR_SLB | \ CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | \ CPU_FTR_NODSISRALIGN) +/* iSeries doesn't support large pages */ +#ifdef CONFIG_PPC_ISERIES +#define CPU_FTR_PPCAS_ARCH_V2 (CPU_FTR_PPCAS_ARCH_V2_BASE) +#else +#define CPU_FTR_PPCAS_ARCH_V2 (CPU_FTR_PPCAS_ARCH_V2_BASE | CPU_FTR_16M_PAGE) +#endif + #define COMMON_PPC64_FW (0) #endif diff --git a/include/asm-ppc64/hvcall.h b/include/asm-ppc64/hvcall.h index d963feaa077c..5ddaf5474166 100644 --- a/include/asm-ppc64/hvcall.h +++ b/include/asm-ppc64/hvcall.h @@ -1,6 +1,9 @@ +#ifndef _PPC64_HVCALL_H +#define _PPC64_HVCALL_H #define H_Success 0 #define H_Busy 1 /* Hardware busy -- retry later */ +#define H_Constrained 4 /* Resource request constrained to max allowed */ #define H_Hardware -1 /* Hardware error */ #define H_Function -2 /* Function not supported */ #define H_Privilege -3 /* Caller not privileged */ @@ -138,3 +141,4 @@ long plpar_hcall_4out(unsigned long opcode, unsigned long *out3, unsigned long *out4); +#endif /* _PPC64_HVCALL_H */ diff --git a/include/asm-ppc64/mmu.h b/include/asm-ppc64/mmu.h index 8ae3a400e131..3ecacc7de85f 100644 --- a/include/asm-ppc64/mmu.h +++ b/include/asm-ppc64/mmu.h @@ -13,6 +13,7 @@ #ifndef _PPC64_MMU_H_ #define _PPC64_MMU_H_ +#include <linux/config.h> #include <asm/page.h> #ifndef __ASSEMBLY__ @@ -27,14 +28,6 @@ typedef unsigned long mm_context_t; #endif /* - * Define the size of the cache used for segment table entries. The first - * entry is used as a cache pointer, therefore the actual number of entries - * stored is one less than defined here. Do not change this value without - * considering the impact it will have on the layout of the paca in paca.h. - */ -#define STAB_CACHE_SIZE 16 - -/* * Hardware Segment Lookaside Buffer Entry * This structure has been padded out to two 64b doublewords (actual SLBE's are * 94 bits). This padding facilites use by the segment management diff --git a/include/asm-ppc64/mmu_context.h b/include/asm-ppc64/mmu_context.h index 11a399c33086..cdaf8abac564 100644 --- a/include/asm-ppc64/mmu_context.h +++ b/include/asm-ppc64/mmu_context.h @@ -1,6 +1,7 @@ #ifndef __PPC64_MMU_CONTEXT_H #define __PPC64_MMU_CONTEXT_H +#include <linux/config.h> #include <linux/spinlock.h> #include <linux/kernel.h> #include <linux/mm.h> @@ -138,6 +139,7 @@ destroy_context(struct mm_struct *mm) } extern void flush_stab(struct task_struct *tsk, struct mm_struct *mm); +extern void flush_slb(struct task_struct *tsk, struct mm_struct *mm); /* * switch_mm is the entry point called from the architecture independent @@ -153,7 +155,15 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) : : ); #endif /* CONFIG_ALTIVEC */ - flush_stab(tsk, next); + + /* No need to flush userspace segments if the mm doesnt change */ + if (prev == next) + return; + + if (cur_cpu_spec->cpu_features & CPU_FTR_SLB) + flush_slb(tsk, next); + else + flush_stab(tsk, next); cpu_set(smp_processor_id(), next->cpu_vm_mask); } diff --git a/include/asm-ppc64/paca.h b/include/asm-ppc64/paca.h index d41818ab9a83..1babe35028d5 100644 --- a/include/asm-ppc64/paca.h +++ b/include/asm-ppc64/paca.h @@ -63,20 +63,15 @@ struct paca_struct { u16 xPacaIndex; /* Logical processor number 0x18 */ u16 xHwProcNum; /* Physical processor number 0x1A */ u32 default_decr; /* Default decrementer value 0x1c */ - u64 unused1; - u64 xKsave; /* Saved Kernel stack addr or zero 0x28 */ - u64 pvr; /* Processor version register 0x30 */ - u8 *exception_sp; /* 0x38 */ - - struct ItLpQueue *lpQueuePtr; /* LpQueue handled by this processor 0x40 */ - u64 xTOC; /* Kernel TOC address 0x48 */ - STAB xStab_data; /* Segment table information 0x50,0x58,0x60 */ - u8 xSegments[STAB_CACHE_SIZE]; /* Cache of used stab entries 0x68,0x70 */ - u8 xProcEnabled; /* 1=soft enabled 0x78 */ - u8 unused2; - u8 prof_enabled; /* 1=iSeries profiling enabled 0x7A */ - u8 stab_cache_pointer; - u8 resv1[4]; /* 0x7B-0x7F */ + u64 xKsave; /* Saved Kernel stack addr or zero 0x20 */ + u64 pvr; /* Processor version register 0x28 */ + struct ItLpQueue *lpQueuePtr; /* LpQueue handled by this processor 0x30 */ + u64 xTOC; /* Kernel TOC address 0x38 */ + STAB xStab_data; /* Segment table information 0x40,0x48,0x50 */ + u8 *exception_sp; /* 0x58 */ + u8 xProcEnabled; /* 0x59 */ + u8 prof_enabled; /* 1=iSeries profiling enabled 0x60 */ + u8 resv1[30]; /* 0x61-0x7F */ /*===================================================================================== * CACHE_LINE_2 0x0080 - 0x00FF diff --git a/include/asm-ppc64/percpu.h b/include/asm-ppc64/percpu.h index 5764afa4b6a4..60a659a4ce1f 100644 --- a/include/asm-ppc64/percpu.h +++ b/include/asm-ppc64/percpu.h @@ -1,6 +1,6 @@ -#ifndef __ARCH_I386_PERCPU__ -#define __ARCH_I386_PERCPU__ +#ifndef __ARCH_PPC64_PERCPU__ +#define __ARCH_PPC64_PERCPU__ #include <asm-generic/percpu.h> -#endif /* __ARCH_I386_PERCPU__ */ +#endif /* __ARCH_PPC64_PERCPU__ */ diff --git a/include/asm-ppc64/pgtable.h b/include/asm-ppc64/pgtable.h index 5cefc49da027..061505d38a73 100644 --- a/include/asm-ppc64/pgtable.h +++ b/include/asm-ppc64/pgtable.h @@ -7,6 +7,7 @@ */ #ifndef __ASSEMBLY__ +#include <linux/config.h> #include <linux/stddef.h> #include <asm/processor.h> /* For TASK_SIZE */ #include <asm/mmu.h> diff --git a/include/asm-ppc64/ppc_asm.h b/include/asm-ppc64/ppc_asm.h index a33d6347bd63..6ac08bb267e0 100644 --- a/include/asm-ppc64/ppc_asm.h +++ b/include/asm-ppc64/ppc_asm.h @@ -11,6 +11,8 @@ * 2 of the License, or (at your option) any later version. */ +#ifndef _PPC64_PPC_ASM_H +#define _PPC64_PPC_ASM_H /* * Macros for storing registers into and loading registers from * exception frames. @@ -238,3 +240,5 @@ #define vr29 29 #define vr30 30 #define vr31 31 + +#endif /* _PPC64_PPC_ASM_H */ diff --git a/include/asm-ppc64/processor.h b/include/asm-ppc64/processor.h index 9ec883bf1c7c..ffb684f7ab71 100644 --- a/include/asm-ppc64/processor.h +++ b/include/asm-ppc64/processor.h @@ -12,6 +12,7 @@ #include <linux/stringify.h> #ifndef __ASSEMBLY__ +#include <linux/config.h> #include <asm/atomic.h> #include <asm/ppcdebug.h> #include <asm/a.out.h> diff --git a/include/asm-ppc64/ptrace-common.h b/include/asm-ppc64/ptrace-common.h index b3295b1bf992..3dbd3e5847b3 100644 --- a/include/asm-ppc64/ptrace-common.h +++ b/include/asm-ppc64/ptrace-common.h @@ -9,6 +9,8 @@ * this archive for more details. */ +#ifndef _PPC64_PTRACE_COMMON_H +#define _PPC64_PTRACE_COMMON_H /* * Set of msr bits that gdb can change on behalf of a process. */ @@ -64,3 +66,5 @@ static inline void clear_single_step(struct task_struct *task) if (regs != NULL) regs->msr &= ~MSR_SE; } + +#endif /* _PPC64_PTRACE_COMMON_H */ diff --git a/include/asm-ppc64/serial.h b/include/asm-ppc64/serial.h index 64c4e0eef700..edf5886c24c3 100644 --- a/include/asm-ppc64/serial.h +++ b/include/asm-ppc64/serial.h @@ -1,6 +1,8 @@ /* - * include/asm-ppc/serial.h + * include/asm-ppc64/serial.h */ +#ifndef _PPC64_SERIAL_H +#define _PPC64_SERIAL_H #include <linux/config.h> @@ -124,3 +126,5 @@ EXTRA_SERIAL_PORT_DEFNS \ HUB6_SERIAL_PORT_DFNS \ MCA_SERIAL_PORT_DFNS + +#endif /* _PPC64_SERIAL_H */ diff --git a/include/asm-s390/atomic.h b/include/asm-s390/atomic.h index 069d34122c9a..1544a74f1609 100644 --- a/include/asm-s390/atomic.h +++ b/include/asm-s390/atomic.h @@ -1,7 +1,6 @@ #ifndef __ARCH_S390_ATOMIC__ #define __ARCH_S390_ATOMIC__ -#ifdef __KERNEL__ /* * include/asm-s390/atomic.h * @@ -27,6 +26,8 @@ typedef struct { } __attribute__ ((aligned (4))) atomic_t; #define ATOMIC_INIT(i) { (i) } +#ifdef __KERNEL__ + #define __CS_LOOP(ptr, op_val, op_string) ({ \ typeof(ptr->counter) old_val, new_val; \ __asm__ __volatile__(" l %0,0(%3)\n" \ @@ -35,8 +36,10 @@ typedef struct { " cs %0,%1,0(%3)\n" \ " jl 0b" \ : "=&d" (old_val), "=&d" (new_val), \ - "+m" (((atomic_t *)(ptr))->counter) \ - : "a" (ptr), "d" (op_val) : "cc" ); \ + "=m" (((atomic_t *)(ptr))->counter) \ + : "a" (ptr), "d" (op_val), \ + "m" (((atomic_t *)(ptr))->counter) \ + : "cc", "memory" ); \ new_val; \ }) #define atomic_read(v) ((v)->counter) @@ -106,8 +109,10 @@ typedef struct { " csg %0,%1,0(%3)\n" \ " jl 0b" \ : "=&d" (old_val), "=&d" (new_val), \ - "+m" (((atomic_t *)(ptr))->counter) \ - : "a" (ptr), "d" (op_val) : "cc" ); \ + "=m" (((atomic_t *)(ptr))->counter) \ + : "a" (ptr), "d" (op_val), \ + "m" (((atomic_t *)(ptr))->counter) \ + : "cc", "memory" ); \ new_val; \ }) #define atomic64_read(v) ((v)->counter) @@ -182,9 +187,9 @@ atomic_compare_and_swap(int expected_oldval,int new_val,atomic_t *v) " ipm %0\n" " srl %0,28\n" "0:" - : "=&d" (retval), "+m" (v->counter) - : "a" (v), "d" (expected_oldval) , "d" (new_val) - : "cc" ); + : "=&d" (retval), "=m" (v->counter) + : "a" (v), "d" (expected_oldval) , "d" (new_val), + "m" (v->counter) : "cc", "memory" ); return retval; } diff --git a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h index 8de69aa8ec35..2e1129ae7d22 100644 --- a/include/asm-s390/bitops.h +++ b/include/asm-s390/bitops.h @@ -13,6 +13,7 @@ * */ #include <linux/config.h> +#include <linux/compiler.h> /* * 32 bit bitops format: @@ -109,6 +110,8 @@ extern const char _sb_findmap[]; #endif /* __s390x__ */ +#define __BITOPS_BARRIER() __asm__ __volatile__ ( "" : : : "memory" ) + #ifdef CONFIG_SMP /* * SMP safe set_bit routine based on compare and swap (CS) @@ -189,6 +192,7 @@ test_and_set_bit_cs(unsigned long nr, volatile unsigned long *ptr) mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1)); /* Do the atomic update. */ __BITOPS_LOOP(old, new, addr, mask, __BITOPS_OR); + __BITOPS_BARRIER(); return (old & mask) != 0; } @@ -211,6 +215,7 @@ test_and_clear_bit_cs(unsigned long nr, volatile unsigned long *ptr) mask = ~(1UL << (nr & (__BITOPS_WORDSIZE - 1))); /* Do the atomic update. */ __BITOPS_LOOP(old, new, addr, mask, __BITOPS_AND); + __BITOPS_BARRIER(); return (old ^ new) != 0; } @@ -233,6 +238,7 @@ test_and_change_bit_cs(unsigned long nr, volatile unsigned long *ptr) mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1)); /* Do the atomic update. */ __BITOPS_LOOP(old, new, addr, mask, __BITOPS_XOR); + __BITOPS_BARRIER(); return (old & mask) != 0; } #endif /* CONFIG_SMP */ @@ -435,7 +441,7 @@ test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr) asm volatile("oc 0(1,%1),0(%2)" : "=m" (*(char *) addr) : "a" (addr), "a" (_oi_bitmap + (nr & 7)), - "m" (*(char *) addr) : "cc" ); + "m" (*(char *) addr) : "cc", "memory" ); return (ch >> (nr & 7)) & 1; } #define __test_and_set_bit(X,Y) test_and_set_bit_simple(X,Y) @@ -454,7 +460,7 @@ test_and_clear_bit_simple(unsigned long nr, volatile unsigned long *ptr) asm volatile("nc 0(1,%1),0(%2)" : "=m" (*(char *) addr) : "a" (addr), "a" (_ni_bitmap + (nr & 7)), - "m" (*(char *) addr) : "cc" ); + "m" (*(char *) addr) : "cc", "memory" ); return (ch >> (nr & 7)) & 1; } #define __test_and_clear_bit(X,Y) test_and_clear_bit_simple(X,Y) @@ -473,7 +479,7 @@ test_and_change_bit_simple(unsigned long nr, volatile unsigned long *ptr) asm volatile("xc 0(1,%1),0(%2)" : "=m" (*(char *) addr) : "a" (addr), "a" (_oi_bitmap + (nr & 7)), - "m" (*(char *) addr) : "cc" ); + "m" (*(char *) addr) : "cc", "memory" ); return (ch >> (nr & 7)) & 1; } #define __test_and_change_bit(X,Y) test_and_change_bit_simple(X,Y) @@ -681,59 +687,6 @@ find_next_bit (unsigned long * addr, int size, int offset) return (offset + res); } -/* - * ffz = Find First Zero in word. Undefined if no zero exists, - * so code should check against ~0UL first.. - */ -static inline unsigned long ffz(unsigned long word) -{ - unsigned long reg; - int result; - - __asm__(" slr %0,%0\n" - " lhi %2,0xff\n" - " tml %1,0xffff\n" - " jno 0f\n" - " ahi %0,16\n" - " srl %1,16\n" - "0: tml %1,0x00ff\n" - " jno 1f\n" - " ahi %0,8\n" - " srl %1,8\n" - "1: nr %1,%2\n" - " ic %1,0(%1,%3)\n" - " alr %0,%1" - : "=&d" (result), "+a" (word), "=&d" (reg) - : "a" (&_zb_findmap) : "cc" ); - return result; -} - -/* - * __ffs = find first bit in word. Undefined if no bit exists, - * so code should check against 0UL first.. - */ -static inline unsigned long __ffs (unsigned long word) -{ - unsigned long reg, result; - - __asm__(" slr %0,%0\n" - " lhi %2,0xff\n" - " tml %1,0xffff\n" - " jnz 0f\n" - " ahi %0,16\n" - " srl %1,16\n" - "0: tml %1,0x00ff\n" - " jnz 1f\n" - " ahi %0,8\n" - " srl %1,8\n" - "1: nr %1,%2\n" - " ic %1,0(%1,%3)\n" - " alr %0,%1" - : "=&d" (result), "+a" (word), "=&d" (reg) - : "a" (&_sb_findmap) : "cc" ); - return result; -} - #else /* __s390x__ */ /* @@ -910,35 +863,31 @@ find_next_bit (unsigned long * addr, unsigned long size, unsigned long offset) return (offset + res); } +#endif /* __s390x__ */ + /* * ffz = Find First Zero in word. Undefined if no zero exists, * so code should check against ~0UL first.. */ static inline unsigned long ffz(unsigned long word) { - unsigned long reg, result; - - __asm__(" lhi %2,-1\n" - " slgr %0,%0\n" - " clr %1,%2\n" - " jne 0f\n" - " aghi %0,32\n" - " srlg %1,%1,32\n" - "0: lghi %2,0xff\n" - " tmll %1,0xffff\n" - " jno 1f\n" - " aghi %0,16\n" - " srlg %1,%1,16\n" - "1: tmll %1,0x00ff\n" - " jno 2f\n" - " aghi %0,8\n" - " srlg %1,%1,8\n" - "2: ngr %1,%2\n" - " ic %1,0(%1,%3)\n" - " algr %0,%1" - : "=&d" (result), "+a" (word), "=&d" (reg) - : "a" (&_zb_findmap) : "cc" ); - return result; + unsigned long bit = 0; + +#ifdef __s390x__ + if (likely((word & 0xffffffff) == 0xffffffff)) { + word >>= 32; + bit += 32; + } +#endif + if (likely((word & 0xffff) == 0xffff)) { + word >>= 16; + bit += 16; + } + if (likely((word & 0xff) == 0xff)) { + word >>= 8; + bit += 8; + } + return bit + _zb_findmap[word & 0xff]; } /* @@ -947,31 +896,24 @@ static inline unsigned long ffz(unsigned long word) */ static inline unsigned long __ffs (unsigned long word) { - unsigned long reg, result; - - __asm__(" slgr %0,%0\n" - " ltr %1,%1\n" - " jnz 0f\n" - " aghi %0,32\n" - " srlg %1,%1,32\n" - "0: lghi %2,0xff\n" - " tmll %1,0xffff\n" - " jnz 1f\n" - " aghi %0,16\n" - " srlg %1,%1,16\n" - "1: tmll %1,0x00ff\n" - " jnz 2f\n" - " aghi %0,8\n" - " srlg %1,%1,8\n" - "2: ngr %1,%2\n" - " ic %1,0(%1,%3)\n" - " algr %0,%1" - : "=&d" (result), "+a" (word), "=&d" (reg) - : "a" (&_sb_findmap) : "cc" ); - return result; -} + unsigned long bit = 0; -#endif /* __s390x__ */ +#ifdef __s390x__ + if (likely((word & 0xffffffff) == 0)) { + word >>= 32; + bit += 32; + } +#endif + if (likely((word & 0xffff) == 0)) { + word >>= 16; + bit += 16; + } + if (likely((word & 0xff) == 0)) { + word >>= 8; + bit += 8; + } + return bit + _sb_findmap[word & 0xff]; +} /* * Every architecture must define this function. It's the fastest @@ -989,68 +931,12 @@ static inline int sched_find_first_bit(unsigned long *b) * the libc and compiler builtin ffs routines, therefore * differs in spirit from the above ffz (man ffs). */ -extern inline int ffs (int x) -{ - int r = 1; - - if (x == 0) - return 0; - __asm__(" tml %1,0xffff\n" - " jnz 0f\n" - " srl %1,16\n" - " ahi %0,16\n" - "0: tml %1,0x00ff\n" - " jnz 1f\n" - " srl %1,8\n" - " ahi %0,8\n" - "1: tml %1,0x000f\n" - " jnz 2f\n" - " srl %1,4\n" - " ahi %0,4\n" - "2: tml %1,0x0003\n" - " jnz 3f\n" - " srl %1,2\n" - " ahi %0,2\n" - "3: tml %1,0x0001\n" - " jnz 4f\n" - " ahi %0,1\n" - "4:" - : "=&d" (r), "+d" (x) : : "cc" ); - return r; -} +#define ffs(x) generic_ffs(x) /* * fls: find last bit set. */ -static __inline__ int fls(int x) -{ - int r = 32; - - if (x == 0) - return 0; - __asm__(" tmh %1,0xffff\n" - " jz 0f\n" - " sll %1,16\n" - " ahi %0,-16\n" - "0: tmh %1,0xff00\n" - " jz 1f\n" - " sll %1,8\n" - " ahi %0,-8\n" - "1: tmh %1,0xf000\n" - " jz 2f\n" - " sll %1,4\n" - " ahi %0,-4\n" - "2: tmh %1,0xc000\n" - " jz 3f\n" - " sll %1,2\n" - " ahi %0,-2\n" - "3: tmh %1,0x8000\n" - " jz 4f\n" - " ahi %0,-1\n" - "4:" - : "+d" (r), "+d" (x) : : "cc" ); - return r; -} +#define fls(x) generic_fls(x) /* * hweightN: returns the hamming weight (i.e. the number @@ -1273,11 +1159,16 @@ ext2_find_next_zero_bit(void *vaddr, unsigned long size, unsigned long offset) /* Bitmap functions for the minix filesystem. */ /* FIXME !!! */ -#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) -#define minix_set_bit(nr,addr) set_bit(nr,addr) -#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) -#define minix_test_bit(nr,addr) test_bit(nr,addr) -#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) +#define minix_test_and_set_bit(nr,addr) \ + test_and_set_bit(nr,(unsigned long *)addr) +#define minix_set_bit(nr,addr) \ + set_bit(nr,(unsigned long *)addr) +#define minix_test_and_clear_bit(nr,addr) \ + test_and_clear_bit(nr,(unsigned long *)addr) +#define minix_test_bit(nr,addr) \ + test_bit(nr,(unsigned long *)addr) +#define minix_find_first_zero_bit(addr,size) \ + find_first_zero_bit(addr,size) #endif /* __KERNEL__ */ diff --git a/include/asm-s390/byteorder.h b/include/asm-s390/byteorder.h index afa7332e6d30..43b0645bacd8 100644 --- a/include/asm-s390/byteorder.h +++ b/include/asm-s390/byteorder.h @@ -50,7 +50,7 @@ static __inline__ __u32 ___arch__swab32p(__u32 *x) " icm %0,4,2(%1)\n" " icm %0,2,1(%1)\n" " ic %0,0(%1)" - : "=&d" (result) : "a" (x) : "cc" ); + : "=&d" (result) : "a" (x), "m" (*x) : "cc" ); #else /* __s390x__ */ " lrv %0,%1" : "=d" (result) : "m" (*x) ); @@ -67,7 +67,7 @@ static __inline__ __u32 ___arch__swab32(__u32 x) __asm__ __volatile__ ( " lrvr %0,%1" - : "=d" (result) : "d" (x) ); + : "=d" (result) : "d" (x), "m" (x) ); return result; #endif /* __s390x__ */ } @@ -85,7 +85,7 @@ static __inline__ __u16 ___arch__swab16p(__u16 *x) #ifndef __s390x__ " icm %0,2,1(%1)\n" " ic %0,0(%1)\n" - : "=&d" (result) : "a" (x) : "cc" ); + : "=&d" (result) : "a" (x), "m" (*x) : "cc" ); #else /* __s390x__ */ " lrvh %0,%1" : "=d" (result) : "m" (*x) ); diff --git a/include/asm-s390/checksum.h b/include/asm-s390/checksum.h index fc5c512aed04..468da9644700 100644 --- a/include/asm-s390/checksum.h +++ b/include/asm-s390/checksum.h @@ -42,7 +42,7 @@ csum_partial(const unsigned char * buff, int len, unsigned int sum) __asm__ __volatile__ ( "0: cksm %0,%1\n" /* do checksum on longs */ " jo 0b\n" - : "+&d" (sum), "+&a" (rp) : : "cc" ); + : "+&d" (sum), "+&a" (rp) : : "cc", "memory" ); #else /* __s390x__ */ __asm__ __volatile__ ( " lgr 2,%1\n" /* address in gpr 2 */ @@ -51,7 +51,7 @@ csum_partial(const unsigned char * buff, int len, unsigned int sum) " jo 0b\n" : "+&d" (sum) : "d" (buff), "d" (len) - : "cc", "2", "3" ); + : "cc", "memory", "2", "3" ); #endif /* __s390x__ */ return sum; } diff --git a/include/asm-s390/div64.h b/include/asm-s390/div64.h index 0c5f739832f1..af098dc3cf59 100644 --- a/include/asm-s390/div64.h +++ b/include/asm-s390/div64.h @@ -36,8 +36,8 @@ " ahi 1,1\n" \ "1: st 1,4+%1\n" \ " lr %0,0" \ - : "=d" (__r), "+m" (__n) \ - : "d" (base) : "0", "1", "2", "cc" ); \ + : "=d" (__r), "=m" (__n) \ + : "d" (base), "m" (__n) : "0", "1", "2", "cc" ); \ (n) = (__n); \ __r; \ }) diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index 1c032e955535..06a30c75548e 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h @@ -553,11 +553,15 @@ ptep_clear_flush(struct vm_area_struct *vma, if (!(pte_val(pte) & _PAGE_INVALID)) { /* S390 has 1mb segments, we are emulating 4MB segments */ pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00); - __asm__ __volatile__ ("ipte %0,%1" : : "a" (pto), "a" (address)); + __asm__ __volatile__ ("ipte %2,%3" + : "=m" (*ptep) : "m" (*ptep), + "a" (pto), "a" (address) ); } #else /* __s390x__ */ if (!(pte_val(pte) & _PAGE_INVALID)) - __asm__ __volatile__ ("ipte %0,%1" : : "a" (ptep), "a" (address)); + __asm__ __volatile__ ("ipte %2,%3" + : "=m" (*ptep) : "m" (*ptep), + "a" (ptep), "a" (address) ); #endif /* __s390x__ */ pte_clear(ptep); return pte; diff --git a/include/asm-s390/processor.h b/include/asm-s390/processor.h index d1f0be745c46..e904644c3ace 100644 --- a/include/asm-s390/processor.h +++ b/include/asm-s390/processor.h @@ -66,7 +66,7 @@ extern struct task_struct *last_task_used_math; #else /* __s390x__ */ -# define TASK_SIZE (0x20000000000UL) +# define TASK_SIZE (0x40000000000UL) # define TASK31_SIZE (0x80000000UL) # define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \ (TASK31_SIZE / 2) : (TASK_SIZE / 2)) @@ -200,14 +200,14 @@ static inline void __load_psw_mask (unsigned long mask) " st %0,4(%1)\n" " lpsw 0(%1)\n" "1:" - : "=&d" (addr) : "a" (&psw) : "memory", "cc" ); + : "=&d" (addr) : "a" (&psw), "m" (psw) : "memory", "cc" ); #else /* __s390x__ */ asm volatile ( " larl %0,1f\n" " stg %0,8(%1)\n" " lpswe 0(%1)\n" "1:" - : "=&d" (addr) : "a" (&psw) : "memory", "cc" ); + : "=&d" (addr) : "a" (&psw), "m" (psw) : "memory", "cc" ); #endif /* __s390x__ */ } @@ -229,14 +229,16 @@ static inline void enabled_wait(void) " oi 4(%1),0x80\n" " lpsw 0(%1)\n" "1:" - : "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" ); + : "=&a" (reg) : "a" (&wait_psw), "m" (wait_psw) + : "memory", "cc" ); #else /* __s390x__ */ asm volatile ( " larl %0,0f\n" " stg %0,8(%1)\n" " lpswe 0(%1)\n" "0:" - : "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" ); + : "=&a" (reg) : "a" (&wait_psw), "m" (wait_psw) + : "memory", "cc" ); #endif /* __s390x__ */ } @@ -247,7 +249,7 @@ static inline void enabled_wait(void) static inline void disabled_wait(unsigned long code) { char psw_buffer[2*sizeof(psw_t)]; - char ctl_buf[4]; + unsigned long ctl_buf; psw_t *dw_psw = (psw_t *)(((unsigned long) &psw_buffer+sizeof(psw_t)-1) & -sizeof(psw_t)); @@ -258,9 +260,9 @@ static inline void disabled_wait(unsigned long code) * the processor is dead afterwards */ #ifndef __s390x__ - asm volatile (" stctl 0,0,0(%1)\n" - " ni 0(%1),0xef\n" /* switch off protection */ - " lctl 0,0,0(%1)\n" + asm volatile (" stctl 0,0,0(%2)\n" + " ni 0(%2),0xef\n" /* switch off protection */ + " lctl 0,0,0(%2)\n" " stpt 0xd8\n" /* store timer */ " stckc 0xe0\n" /* store clock comparator */ " stpx 0x108\n" /* store prefix register */ @@ -271,13 +273,14 @@ static inline void disabled_wait(unsigned long code) " std 6,0x178\n" /* store f6 */ " stm 0,15,0x180\n" /* store general registers */ " stctl 0,15,0x1c0\n" /* store control registers */ - " oi 0(%1),0x10\n" /* fake protection bit */ - " lpsw 0(%0)" - : : "a" (dw_psw), "a" (&ctl_buf) : "cc" ); + " oi 0x1c0,0x10\n" /* fake protection bit */ + " lpsw 0(%1)" + : "=m" (ctl_buf) + : "a" (dw_psw), "a" (&ctl_buf), "m" (dw_psw) : "cc" ); #else /* __s390x__ */ - asm volatile (" stctg 0,0,0(%1)\n" - " ni 4(%1),0xef\n" /* switch off protection */ - " lctlg 0,0,0(%1)\n" + asm volatile (" stctg 0,0,0(%2)\n" + " ni 4(%2),0xef\n" /* switch off protection */ + " lctlg 0,0,0(%2)\n" " lghi 1,0x1000\n" " stpt 0x328(1)\n" /* store timer */ " stckc 0x330(1)\n" /* store clock comparator */ @@ -303,8 +306,10 @@ static inline void disabled_wait(unsigned long code) " stmg 0,15,0x280(1)\n" /* store general registers */ " stctg 0,15,0x380(1)\n" /* store control registers */ " oi 0x384(1),0x10\n" /* fake protection bit */ - " lpswe 0(%0)" - : : "a" (dw_psw), "a" (&ctl_buf) : "cc", "0", "1"); + " lpswe 0(%1)" + : "=m" (ctl_buf) + : "a" (dw_psw), "a" (&ctl_buf), + "m" (dw_psw) : "cc", "0", "1"); #endif /* __s390x__ */ } diff --git a/include/asm-s390/rwsem.h b/include/asm-s390/rwsem.h index ef612dd92ca5..8c0cebbfc034 100644 --- a/include/asm-s390/rwsem.h +++ b/include/asm-s390/rwsem.h @@ -102,21 +102,21 @@ static inline void __down_read(struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " ahi %1,%3\n" - " cs %0,%1,0(%2)\n" + " ahi %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " aghi %1,%3\n" - " csg %0,%1,0(%2)\n" + " aghi %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS) - : "cc", "memory" ); + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), + "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); if (old < 0) rwsem_down_read_failed(sem); } @@ -130,25 +130,25 @@ static inline int __down_read_trylock(struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: ltr %1,%0\n" " jm 1f\n" - " ahi %1,%3\n" - " cs %0,%1,0(%2)\n" + " ahi %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b\n" "1:" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: ltgr %1,%0\n" " jm 1f\n" - " aghi %1,%3\n" - " csg %0,%1,0(%2)\n" + " aghi %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b\n" "1:" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS) - : "cc", "memory" ); + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), + "i" (RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); return old >= 0 ? 1 : 0; } @@ -162,20 +162,20 @@ static inline void __down_write(struct rw_semaphore *sem) tmp = RWSEM_ACTIVE_WRITE_BIAS; __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " a %1,%3\n" - " cs %0,%1,0(%2)\n" + " a %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " ag %1,%3\n" - " csg %0,%1,0(%2)\n" + " ag %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "m" (tmp) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), "m" (tmp) : "cc", "memory" ); if (old != 0) rwsem_down_write_failed(sem); @@ -190,22 +190,22 @@ static inline int __down_write_trylock(struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%1)\n" + " l %0,0(%2)\n" "0: ltr %0,%0\n" " jnz 1f\n" - " cs %0,%2,0(%1)\n" + " cs %0,%4,0(%2)\n" " jl 0b\n" #else /* __s390x__ */ - " lg %0,0(%1)\n" + " lg %0,0(%2)\n" "0: ltgr %0,%0\n" " jnz 1f\n" - " csg %0,%2,0(%1)\n" + " csg %0,%4,0(%2)\n" " jl 0b\n" #endif /* __s390x__ */ "1:" - : "=&d" (old) - : "a" (&sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS) - : "cc", "memory" ); + : "=&d" (old), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), + "d" (RWSEM_ACTIVE_WRITE_BIAS) : "cc", "memory" ); return (old == RWSEM_UNLOCKED_VALUE) ? 1 : 0; } @@ -218,20 +218,21 @@ static inline void __up_read(struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " ahi %1,%3\n" - " cs %0,%1,0(%2)\n" + " ahi %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " aghi %1,%3\n" - " csg %0,%1,0(%2)\n" + " aghi %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), + "i" (-RWSEM_ACTIVE_READ_BIAS) : "cc", "memory" ); if (new < 0) if ((new & RWSEM_ACTIVE_MASK) == 0) @@ -248,20 +249,20 @@ static inline void __up_write(struct rw_semaphore *sem) tmp = -RWSEM_ACTIVE_WRITE_BIAS; __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " a %1,%3\n" - " cs %0,%1,0(%2)\n" + " a %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " ag %1,%3\n" - " csg %0,%1,0(%2)\n" + " ag %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "m" (tmp) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), "m" (tmp) : "cc", "memory" ); if (new < 0) if ((new & RWSEM_ACTIVE_MASK) == 0) @@ -278,20 +279,20 @@ static inline void __downgrade_write(struct rw_semaphore *sem) tmp = -RWSEM_WAITING_BIAS; __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " a %1,%3\n" - " cs %0,%1,0(%2)\n" + " a %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " ag %1,%3\n" - " csg %0,%1,0(%2)\n" + " ag %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "m" (tmp) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), "m" (tmp) : "cc", "memory" ); if (new > 1) rwsem_downgrade_wake(sem); @@ -306,20 +307,20 @@ static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " ar %1,%3\n" - " cs %0,%1,0(%2)\n" + " ar %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " agr %1,%3\n" - " csg %0,%1,0(%2)\n" + " agr %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "d" (delta) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), "d" (delta) : "cc", "memory" ); } @@ -332,20 +333,20 @@ static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem) __asm__ __volatile__( #ifndef __s390x__ - " l %0,0(%2)\n" + " l %0,0(%3)\n" "0: lr %1,%0\n" - " ar %1,%3\n" - " cs %0,%1,0(%2)\n" + " ar %1,%5\n" + " cs %0,%1,0(%3)\n" " jl 0b" #else /* __s390x__ */ - " lg %0,0(%2)\n" + " lg %0,0(%3)\n" "0: lgr %1,%0\n" - " agr %1,%3\n" - " csg %0,%1,0(%2)\n" + " agr %1,%5\n" + " csg %0,%1,0(%3)\n" " jl 0b" #endif /* __s390x__ */ - : "=&d" (old), "=&d" (new) - : "a" (&sem->count), "d" (delta) + : "=&d" (old), "=&d" (new), "=m" (sem->count) + : "a" (&sem->count), "m" (sem->count), "d" (delta) : "cc", "memory" ); return new; } diff --git a/include/asm-s390/semaphore.h b/include/asm-s390/semaphore.h index 5720dea2459f..873def6f363a 100644 --- a/include/asm-s390/semaphore.h +++ b/include/asm-s390/semaphore.h @@ -95,9 +95,9 @@ static inline int down_trylock(struct semaphore * sem) " cs %0,%1,0(%3)\n" " jl 0b\n" "1:" - : "=&d" (old_val), "=&d" (new_val), - "+m" (sem->count.counter) - : "a" (&sem->count.counter) : "cc" ); + : "=&d" (old_val), "=&d" (new_val), "=m" (sem->count.counter) + : "a" (&sem->count.counter), "m" (sem->count.counter) + : "cc", "memory" ); return old_val <= 0; } diff --git a/include/asm-s390/spinlock.h b/include/asm-s390/spinlock.h index 2d4d6e75469e..00981f815f30 100644 --- a/include/asm-s390/spinlock.h +++ b/include/asm-s390/spinlock.h @@ -57,8 +57,9 @@ extern inline void _raw_spin_lock(spinlock_t *lp) "1: slr %1,%1\n" " cs %1,%0,0(%3)\n" " jl 0b\n" - : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock) - : "a" (&lp->lock) : "cc" ); + : "=&d" (reg1), "=&d" (reg2), "=m" (lp->lock) + : "a" (&lp->lock), "m" (lp->lock) + : "cc", "memory" ); #else /* __s390x__ */ unsigned long reg1, reg2; __asm__ __volatile(" bras %1,1f\n" @@ -66,9 +67,9 @@ extern inline void _raw_spin_lock(spinlock_t *lp) "1: slr %0,%0\n" " cs %0,%1,0(%3)\n" " jl 0b\n" - : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock) - : "a" (&lp->lock), "i" (__DIAG44_OPERAND) - : "cc" ); + : "=&d" (reg1), "=&d" (reg2), "=m" (lp->lock) + : "a" (&lp->lock), "i" (__DIAG44_OPERAND), + "m" (lp->lock) : "cc", "memory" ); #endif /* __s390x__ */ } @@ -82,8 +83,9 @@ extern inline int _raw_spin_trylock(spinlock_t *lp) __asm__ __volatile(" slr %0,%0\n" " basr %1,0\n" "0: cs %0,%1,0(%3)" - : "=&d" (result), "=&d" (reg), "+m" (lp->lock) - : "a" (&lp->lock) : "cc" ); + : "=&d" (result), "=&d" (reg), "=m" (lp->lock) + : "a" (&lp->lock), "m" (lp->lock) + : "cc", "memory" ); return !result; } @@ -93,7 +95,8 @@ extern inline void _raw_spin_unlock(spinlock_t *lp) __asm__ __volatile("cs %0,%3,0(%4)" : "=d" (old), "=m" (lp->lock) - : "0" (lp->lock), "d" (0), "a" (lp) : "cc" ); + : "0" (lp->lock), "d" (0), "a" (lp) + : "cc", "memory" ); } /* @@ -126,8 +129,8 @@ typedef struct { " la 3,1(2)\n" /* one more reader */ \ " cs 2,3,0(%1)\n" /* try to write new value */ \ " jl 0b" \ - : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) : "a" (&(rw)->lock), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #else /* __s390x__ */ #define _raw_read_lock(rw) \ asm volatile(" lg 2,0(%1)\n" \ @@ -137,9 +140,9 @@ typedef struct { " la 3,1(2)\n" /* one more reader */ \ " csg 2,3,0(%1)\n" /* try to write new value */ \ " jl 0b" \ - : "+m" ((rw)->lock) \ - : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #endif /* __s390x__ */ #ifndef __s390x__ @@ -151,8 +154,8 @@ typedef struct { " ahi 3,-1\n" /* one less reader */ \ " cs 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) : "a" (&(rw)->lock), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #else /* __s390x__ */ #define _raw_read_unlock(rw) \ asm volatile(" lg 2,0(%1)\n" \ @@ -162,9 +165,9 @@ typedef struct { " bctgr 3,0\n" /* one less reader */ \ " csg 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) \ - : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #endif /* __s390x__ */ #ifndef __s390x__ @@ -176,8 +179,8 @@ typedef struct { "1: slr 2,2\n" /* old lock value must be 0 */ \ " cs 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) : "a" (&(rw)->lock), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #else /* __s390x__ */ #define _raw_write_lock(rw) \ asm volatile(" llihh 3,0x8000\n" /* new lock value = 0x80...0 */ \ @@ -186,9 +189,9 @@ typedef struct { "1: slgr 2,2\n" /* old lock value must be 0 */ \ " csg 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) \ - : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #endif /* __s390x__ */ #ifndef __s390x__ @@ -200,8 +203,8 @@ typedef struct { " sll 2,31\n" /* old lock value must be 0x80000000 */ \ " cs 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) : "a" (&(rw)->lock) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) : "a" (&(rw)->lock), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #else /* __s390x__ */ #define _raw_write_unlock(rw) \ asm volatile(" slgr 3,3\n" /* new lock value = 0 */ \ @@ -210,9 +213,9 @@ typedef struct { "1: llihh 2,0x8000\n" /* old lock value must be 0x8..0 */\ " csg 2,3,0(%1)\n" \ " jl 0b" \ - : "+m" ((rw)->lock) \ - : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \ - : "2", "3", "cc" ) + : "=m" ((rw)->lock) \ + : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND), \ + "m" ((rw)->lock) : "2", "3", "cc", "memory" ) #endif /* __s390x__ */ extern inline int _raw_write_trylock(rwlock_t *rw) @@ -230,8 +233,9 @@ extern inline int _raw_write_trylock(rwlock_t *rw) " llihh %1,0x8000\n" "0: csg %0,%1,0(%3)\n" #endif /* __s390x__ */ - : "=&d" (result), "=&d" (reg), "+m" (rw->lock) - : "a" (&rw->lock) : "cc" ); + : "=&d" (result), "=&d" (reg), "=m" (rw->lock) + : "a" (&rw->lock), "m" (rw->lock) + : "cc", "memory" ); return result == 0; } diff --git a/include/asm-s390/system.h b/include/asm-s390/system.h index 6fa181437837..7050547bc622 100644 --- a/include/asm-s390/system.h +++ b/include/asm-s390/system.h @@ -32,28 +32,28 @@ extern struct task_struct *__switch_to(void *, void *); static inline void save_fp_regs(s390_fp_regs *fpregs) { asm volatile ( - " std 0,8(%0)\n" - " std 2,24(%0)\n" - " std 4,40(%0)\n" - " std 6,56(%0)" - : : "a" (fpregs) : "memory" ); + " std 0,8(%1)\n" + " std 2,24(%1)\n" + " std 4,40(%1)\n" + " std 6,56(%1)" + : "=m" (*fpregs) : "a" (fpregs), "m" (*fpregs) : "memory" ); if (!MACHINE_HAS_IEEE) return; asm volatile( - " stfpc 0(%0)\n" - " std 1,16(%0)\n" - " std 3,32(%0)\n" - " std 5,48(%0)\n" - " std 7,64(%0)\n" - " std 8,72(%0)\n" - " std 9,80(%0)\n" - " std 10,88(%0)\n" - " std 11,96(%0)\n" - " std 12,104(%0)\n" - " std 13,112(%0)\n" - " std 14,120(%0)\n" - " std 15,128(%0)\n" - : : "a" (fpregs) : "memory" ); + " stfpc 0(%1)\n" + " std 1,16(%1)\n" + " std 3,32(%1)\n" + " std 5,48(%1)\n" + " std 7,64(%1)\n" + " std 8,72(%1)\n" + " std 9,80(%1)\n" + " std 10,88(%1)\n" + " std 11,96(%1)\n" + " std 12,104(%1)\n" + " std 13,112(%1)\n" + " std 14,120(%1)\n" + " std 15,128(%1)\n" + : "=m" (*fpregs) : "a" (fpregs), "m" (*fpregs) : "memory" ); } static inline void restore_fp_regs(s390_fp_regs *fpregs) @@ -63,7 +63,7 @@ static inline void restore_fp_regs(s390_fp_regs *fpregs) " ld 2,24(%0)\n" " ld 4,40(%0)\n" " ld 6,56(%0)" - : : "a" (fpregs)); + : : "a" (fpregs), "m" (*fpregs) ); if (!MACHINE_HAS_IEEE) return; asm volatile( @@ -80,7 +80,7 @@ static inline void restore_fp_regs(s390_fp_regs *fpregs) " ld 13,112(%0)\n" " ld 14,120(%0)\n" " ld 15,128(%0)\n" - : : "a" (fpregs)); + : : "a" (fpregs), "m" (*fpregs) ); } #define switch_to(prev,next,last) do { \ @@ -107,15 +107,15 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size) shift = (3 ^ (addr & 3)) << 3; addr ^= addr & 3; asm volatile( - " l %0,0(%3)\n" + " l %0,0(%4)\n" "0: lr 0,%0\n" - " nr 0,%2\n" - " or 0,%1\n" - " cs %0,0,0(%3)\n" + " nr 0,%3\n" + " or 0,%2\n" + " cs %0,0,0(%4)\n" " jl 0b\n" - : "=&d" (old) - : "d" (x << shift), "d" (~(255 << shift)), "a" (addr) - : "memory", "cc", "0" ); + : "=&d" (old), "=m" (*(int *) addr) + : "d" (x << shift), "d" (~(255 << shift)), "a" (addr), + "m" (*(int *) addr) : "memory", "cc", "0" ); x = old >> shift; break; case 2: @@ -123,34 +123,36 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size) shift = (2 ^ (addr & 2)) << 3; addr ^= addr & 2; asm volatile( - " l %0,0(%3)\n" + " l %0,0(%4)\n" "0: lr 0,%0\n" - " nr 0,%2\n" - " or 0,%1\n" - " cs %0,0,0(%3)\n" + " nr 0,%3\n" + " or 0,%2\n" + " cs %0,0,0(%4)\n" " jl 0b\n" - : "=&d" (old) - : "d" (x << shift), "d" (~(65535 << shift)), "a" (addr) - : "memory", "cc", "0" ); + : "=&d" (old), "=m" (*(int *) addr) + : "d" (x << shift), "d" (~(65535 << shift)), "a" (addr), + "m" (*(int *) addr) : "memory", "cc", "0" ); x = old >> shift; break; case 4: asm volatile ( - " l %0,0(%2)\n" - "0: cs %0,%1,0(%2)\n" + " l %0,0(%3)\n" + "0: cs %0,%2,0(%3)\n" " jl 0b\n" - : "=&d" (old) : "d" (x), "a" (ptr) - : "memory", "cc", "0" ); + : "=&d" (old), "=m" (*(int *) ptr) + : "d" (x), "a" (ptr), "m" (*(int *) ptr) + : "memory", "cc" ); x = old; break; #ifdef __s390x__ case 8: asm volatile ( - " lg %0,0(%2)\n" - "0: csg %0,%1,0(%2)\n" + " lg %0,0(%3)\n" + "0: csg %0,%2,0(%3)\n" " jl 0b\n" - : "=&d" (old) : "d" (x), "a" (ptr) - : "memory", "cc", "0" ); + : "=&d" (old), "=m" (*(long *) ptr) + : "d" (x), "a" (ptr), "m" (*(long *) ptr) + : "memory", "cc" ); x = old; break; #endif /* __s390x__ */ @@ -268,7 +270,8 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) #define local_irq_enable() ({ \ unsigned long __dummy; \ __asm__ __volatile__ ( \ - "stosm 0(%1),0x03" : "=m" (__dummy) : "a" (&__dummy) ); \ + "stosm 0(%1),0x03" \ + : "=m" (__dummy) : "a" (&__dummy) : "memory" ); \ }) #define local_irq_disable() ({ \ @@ -279,10 +282,10 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) }) #define local_save_flags(x) \ - __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x) ) + __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x), "m" (x) ) #define local_irq_restore(x) \ - __asm__ __volatile__("ssm 0(%0)" : : "a" (&x) : "memory") + __asm__ __volatile__("ssm 0(%0)" : : "a" (&x), "m" (x) : "memory") #define irqs_disabled() \ ({ \ @@ -294,7 +297,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) #ifdef __s390x__ #define __load_psw(psw) \ - __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw) : "cc" ); + __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw), "m" (psw) : "cc" ); #define __ctl_load(array, low, high) ({ \ __asm__ __volatile__ ( \ diff --git a/include/asm-s390/timex.h b/include/asm-s390/timex.h index faf919e03b97..226acd000639 100644 --- a/include/asm-s390/timex.h +++ b/include/asm-s390/timex.h @@ -25,7 +25,7 @@ static inline cycles_t get_cycles(void) { cycles_t cycles; - __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + __asm__("stck 0(%1)" : "=m" (cycles) : "a" (&cycles) : "cc"); return cycles >> 2; } @@ -33,7 +33,7 @@ static inline unsigned long long get_clock (void) { unsigned long long clk; - __asm__("stck 0(%0)" : : "a" (&(clk)) : "memory", "cc"); + __asm__("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); return clk; } diff --git a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h index 2b76fa728abb..1bb73b0e61fa 100644 --- a/include/asm-s390/tlbflush.h +++ b/include/asm-s390/tlbflush.h @@ -85,7 +85,7 @@ static inline void global_flush_tlb(void) " slr 2,2\n" " slr 3,3\n" " csp 2,%0" - : : "a" (addr) : "cc", "2", "3" ); + : : "a" (addr), "m" (dummy) : "cc", "2", "3" ); } } diff --git a/include/asm-s390/uaccess.h b/include/asm-s390/uaccess.h index e6a325948da5..845211fca609 100644 --- a/include/asm-s390/uaccess.h +++ b/include/asm-s390/uaccess.h @@ -124,8 +124,8 @@ struct exception_table_entry "1:\n" \ __uaccess_fixup \ : "=&d" (err) \ - : "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0) \ - : "cc" ); \ + : "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0),\ + "m" (x) : "cc" ); \ }) #else /* __s390x__ */ diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h index 4cf6e15170f0..0745a2349ace 100644 --- a/include/asm-sparc64/io.h +++ b/include/asm-sparc64/io.h @@ -19,7 +19,7 @@ extern unsigned long bus_to_virt_not_defined_use_pci_map(volatile void *addr); #define bus_to_virt bus_to_virt_not_defined_use_pci_map /* BIO layer definitions. */ -extern unsigned long phys_base; +extern unsigned long phys_base, kern_base, kern_size; #define page_to_phys(page) ((((page) - mem_map) << PAGE_SHIFT)+phys_base) #define BIO_VMERGE_BOUNDARY 8192 diff --git a/include/asm-sparc64/sections.h b/include/asm-sparc64/sections.h index e6dcceabffb2..1e74d704d433 100644 --- a/include/asm-sparc64/sections.h +++ b/include/asm-sparc64/sections.h @@ -4,4 +4,6 @@ /* nothing to see, move along */ #include <asm-generic/sections.h> +extern char _end[], _start[]; + #endif diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index 553442de3ecf..3c2fb5fae259 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h @@ -192,7 +192,6 @@ COMPATIBLE_IOCTL(SCSI_IOCTL_GET_PCI) /* Big T */ COMPATIBLE_IOCTL(TUNSETNOCSUM) COMPATIBLE_IOCTL(TUNSETDEBUG) -COMPATIBLE_IOCTL(TUNSETIFF) COMPATIBLE_IOCTL(TUNSETPERSIST) COMPATIBLE_IOCTL(TUNSETOWNER) /* Big V */ diff --git a/include/linux/ide.h b/include/linux/ide.h index a9c107b8716d..ef73baf33fc8 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -279,7 +279,7 @@ typedef enum { ide_unknown, ide_generic, ide_pci, ide_pdc4030, ide_rz1000, ide_trm290, ide_cmd646, ide_cy82c693, ide_4drives, ide_pmac, ide_etrax100, ide_acorn, - ide_pc9800 + ide_pc9800, ide_forced } hwif_chipset_t; /* @@ -1231,7 +1231,6 @@ typedef struct ide_devices_s { */ #ifndef _IDE_C extern ide_hwif_t ide_hwifs[]; /* master data repository */ -extern int (*ide_probe)(void); extern ide_devices_t *idedisk; extern ide_devices_t *idecd; diff --git a/include/linux/pci.h b/include/linux/pci.h index b88b9d3f5bfc..bc51ca9edef1 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -425,8 +425,8 @@ struct pci_dev { unsigned int transparent:1; /* Transparent PCI bridge */ unsigned int multifunction:1;/* Part of multi-function device */ #ifdef CONFIG_PCI_NAMES -#define PCI_NAME_SIZE 50 -#define PCI_NAME_HALF __stringify(20) /* less than half to handle slop */ +#define PCI_NAME_SIZE 96 +#define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */ char pretty_name[PCI_NAME_SIZE]; /* pretty name for users to see */ #endif }; @@ -473,10 +473,12 @@ struct pci_bus { char name[48]; - struct device * dev; + struct device *bridge; + struct class_device class_dev; }; -#define pci_bus_b(n) list_entry(n, struct pci_bus, node) +#define pci_bus_b(n) list_entry(n, struct pci_bus, node) +#define to_pci_bus(n) container_of(n, struct pci_bus, class_dev) /* * Error values that may be returned by PCI functions. @@ -585,6 +587,7 @@ static inline struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *s return pci_scan_bus_parented(NULL, bus, ops, sysdata); } int pci_scan_slot(struct pci_bus *bus, int devfn); +struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn); void pci_bus_add_devices(struct pci_bus *bus); void pci_name_device(struct pci_dev *dev); char *pci_class_name(u32 class); @@ -612,6 +615,8 @@ struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from); +struct pci_dev *pci_get_slot (struct pci_bus *bus, unsigned int devfn); + int pci_bus_read_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 *val); int pci_bus_read_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 *val); int pci_bus_read_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 *val); @@ -785,26 +790,7 @@ static inline int pci_module_init(struct pci_driver *drv) { int rc = pci_register_driver (drv); - if (rc > 0) - return 0; - - /* iff CONFIG_HOTPLUG and built into kernel, we should - * leave the driver around for future hotplug events. - * For the module case, a hotplug daemon of some sort - * should load a module in response to an insert event. */ -#if defined(CONFIG_HOTPLUG) && !defined(MODULE) - if (rc == 0) - return 0; -#else - if (rc == 0) - rc = -ENODEV; -#endif - - /* if we get here, we need to clean up pci driver instance - * and return some sort of error */ - pci_unregister_driver (drv); - - return rc; + return rc < 0 ? rc : 0; } /* diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 2b3c8dadb1fb..8b8a6c0b37f3 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -133,8 +133,14 @@ extern void proc_tty_unregister_driver(struct tty_driver *driver); */ struct device_node; extern void proc_device_tree_init(void); +#ifdef CONFIG_PROC_DEVICETREE extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *); - +#else /* !CONFIG_PROC_DEVICETREE */ +static inline void proc_device_tree_add_node(struct device_node *np, struct proc_dir_entry *pde) +{ + return; +} +#endif /* CONFIG_PROC_DEVICETREE */ /* * proc_rtas.c */ |
