summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/asm-arm/arch-sa1100/cerf.h121
-rw-r--r--include/asm-arm/assembler.h18
-rw-r--r--include/asm-arm/bitops.h38
-rw-r--r--include/asm-arm/cacheflush.h13
-rw-r--r--include/asm-arm/thread_info.h6
-rw-r--r--include/asm-ppc/todc.h4
-rw-r--r--include/asm-ppc64/bugs.h4
-rw-r--r--include/asm-ppc64/cputable.h11
-rw-r--r--include/asm-ppc64/hvcall.h4
-rw-r--r--include/asm-ppc64/mmu.h9
-rw-r--r--include/asm-ppc64/mmu_context.h12
-rw-r--r--include/asm-ppc64/paca.h23
-rw-r--r--include/asm-ppc64/percpu.h6
-rw-r--r--include/asm-ppc64/pgtable.h1
-rw-r--r--include/asm-ppc64/ppc_asm.h4
-rw-r--r--include/asm-ppc64/processor.h1
-rw-r--r--include/asm-ppc64/ptrace-common.h4
-rw-r--r--include/asm-ppc64/serial.h6
-rw-r--r--include/asm-s390/atomic.h21
-rw-r--r--include/asm-s390/bitops.h223
-rw-r--r--include/asm-s390/byteorder.h6
-rw-r--r--include/asm-s390/checksum.h4
-rw-r--r--include/asm-s390/div64.h4
-rw-r--r--include/asm-s390/pgtable.h8
-rw-r--r--include/asm-s390/processor.h39
-rw-r--r--include/asm-s390/rwsem.h147
-rw-r--r--include/asm-s390/semaphore.h6
-rw-r--r--include/asm-s390/spinlock.h64
-rw-r--r--include/asm-s390/system.h97
-rw-r--r--include/asm-s390/timex.h4
-rw-r--r--include/asm-s390/tlbflush.h2
-rw-r--r--include/asm-s390/uaccess.h4
-rw-r--r--include/asm-sparc64/io.h2
-rw-r--r--include/asm-sparc64/sections.h2
-rw-r--r--include/linux/compat_ioctl.h1
-rw-r--r--include/linux/ide.h3
-rw-r--r--include/linux/pci.h34
-rw-r--r--include/linux/proc_fs.h8
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
*/