aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/include/asm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/include/asm')
-rw-r--r--arch/s390/include/asm/ccwdev.h3
-rw-r--r--arch/s390/include/asm/compat.h13
-rw-r--r--arch/s390/include/asm/ipl.h1
-rw-r--r--arch/s390/include/asm/irq.h6
-rw-r--r--arch/s390/include/asm/kexec.h6
-rw-r--r--arch/s390/include/asm/kvm_host.h1
-rw-r--r--arch/s390/include/asm/lowcore.h10
-rw-r--r--arch/s390/include/asm/page.h1
-rw-r--r--arch/s390/include/asm/pgtable.h2
-rw-r--r--arch/s390/include/asm/processor.h48
-rw-r--r--arch/s390/include/asm/ptrace.h29
-rw-r--r--arch/s390/include/asm/reset.h2
-rw-r--r--arch/s390/include/asm/setup.h13
-rw-r--r--arch/s390/include/asm/sfp-util.h2
-rw-r--r--arch/s390/include/asm/smp.h5
-rw-r--r--arch/s390/include/asm/spinlock.h2
-rw-r--r--arch/s390/include/asm/syscall.h6
-rw-r--r--arch/s390/include/asm/system.h10
-rw-r--r--arch/s390/include/asm/thread_info.h7
-rw-r--r--arch/s390/include/asm/timex.h11
-rw-r--r--arch/s390/include/asm/tlbflush.h1
21 files changed, 120 insertions, 59 deletions
diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h
index 623f2fb71774..9381c92cc779 100644
--- a/arch/s390/include/asm/ccwdev.h
+++ b/arch/s390/include/asm/ccwdev.h
@@ -11,6 +11,7 @@
11#include <linux/device.h> 11#include <linux/device.h>
12#include <linux/mod_devicetable.h> 12#include <linux/mod_devicetable.h>
13#include <asm/fcx.h> 13#include <asm/fcx.h>
14#include <asm/irq.h>
14 15
15/* structs from asm/cio.h */ 16/* structs from asm/cio.h */
16struct irb; 17struct irb;
@@ -127,6 +128,7 @@ enum uc_todo {
127 * @restore: callback for restoring after hibernation 128 * @restore: callback for restoring after hibernation
128 * @uc_handler: callback for unit check handler 129 * @uc_handler: callback for unit check handler
129 * @driver: embedded device driver structure 130 * @driver: embedded device driver structure
131 * @int_class: interruption class to use for accounting interrupts
130 */ 132 */
131struct ccw_driver { 133struct ccw_driver {
132 struct ccw_device_id *ids; 134 struct ccw_device_id *ids;
@@ -144,6 +146,7 @@ struct ccw_driver {
144 int (*restore)(struct ccw_device *); 146 int (*restore)(struct ccw_device *);
145 enum uc_todo (*uc_handler) (struct ccw_device *, struct irb *); 147 enum uc_todo (*uc_handler) (struct ccw_device *, struct irb *);
146 struct device_driver driver; 148 struct device_driver driver;
149 enum interruption_class int_class;
147}; 150};
148 151
149extern struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv, 152extern struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv,
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h
index cdb9b78f6c08..2e49748b27da 100644
--- a/arch/s390/include/asm/compat.h
+++ b/arch/s390/include/asm/compat.h
@@ -12,6 +12,7 @@
12#define PSW32_MASK_IO 0x02000000UL 12#define PSW32_MASK_IO 0x02000000UL
13#define PSW32_MASK_EXT 0x01000000UL 13#define PSW32_MASK_EXT 0x01000000UL
14#define PSW32_MASK_KEY 0x00F00000UL 14#define PSW32_MASK_KEY 0x00F00000UL
15#define PSW32_MASK_BASE 0x00080000UL /* Always one */
15#define PSW32_MASK_MCHECK 0x00040000UL 16#define PSW32_MASK_MCHECK 0x00040000UL
16#define PSW32_MASK_WAIT 0x00020000UL 17#define PSW32_MASK_WAIT 0x00020000UL
17#define PSW32_MASK_PSTATE 0x00010000UL 18#define PSW32_MASK_PSTATE 0x00010000UL
@@ -19,21 +20,19 @@
19#define PSW32_MASK_CC 0x00003000UL 20#define PSW32_MASK_CC 0x00003000UL
20#define PSW32_MASK_PM 0x00000f00UL 21#define PSW32_MASK_PM 0x00000f00UL
21 22
22#define PSW32_ADDR_AMODE31 0x80000000UL 23#define PSW32_MASK_USER 0x00003F00UL
24
25#define PSW32_ADDR_AMODE 0x80000000UL
23#define PSW32_ADDR_INSN 0x7FFFFFFFUL 26#define PSW32_ADDR_INSN 0x7FFFFFFFUL
24 27
25#define PSW32_BASE_BITS 0x00080000UL 28#define PSW32_DEFAULT_KEY (((u32) PAGE_DEFAULT_ACC) << 20)
26 29
27#define PSW32_ASC_PRIMARY 0x00000000UL 30#define PSW32_ASC_PRIMARY 0x00000000UL
28#define PSW32_ASC_ACCREG 0x00004000UL 31#define PSW32_ASC_ACCREG 0x00004000UL
29#define PSW32_ASC_SECONDARY 0x00008000UL 32#define PSW32_ASC_SECONDARY 0x00008000UL
30#define PSW32_ASC_HOME 0x0000C000UL 33#define PSW32_ASC_HOME 0x0000C000UL
31 34
32#define PSW32_MASK_MERGE(CURRENT,NEW) \ 35extern u32 psw32_user_bits;
33 (((CURRENT) & ~(PSW32_MASK_CC|PSW32_MASK_PM)) | \
34 ((NEW) & (PSW32_MASK_CC|PSW32_MASK_PM)))
35
36extern long psw32_user_bits;
37 36
38#define COMPAT_USER_HZ 100 37#define COMPAT_USER_HZ 100
39#define COMPAT_UTS_MACHINE "s390\0\0\0\0" 38#define COMPAT_UTS_MACHINE "s390\0\0\0\0"
diff --git a/arch/s390/include/asm/ipl.h b/arch/s390/include/asm/ipl.h
index 97cc4403fabf..6940abfbe1d9 100644
--- a/arch/s390/include/asm/ipl.h
+++ b/arch/s390/include/asm/ipl.h
@@ -168,5 +168,6 @@ enum diag308_rc {
168 168
169extern int diag308(unsigned long subcode, void *addr); 169extern int diag308(unsigned long subcode, void *addr);
170extern void diag308_reset(void); 170extern void diag308_reset(void);
171extern void store_status(void);
171 172
172#endif /* _ASM_S390_IPL_H */ 173#endif /* _ASM_S390_IPL_H */
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h
index ba7b01c726a3..ba6d85f88d50 100644
--- a/arch/s390/include/asm/irq.h
+++ b/arch/s390/include/asm/irq.h
@@ -8,7 +8,8 @@ enum interruption_class {
8 EXTERNAL_INTERRUPT, 8 EXTERNAL_INTERRUPT,
9 IO_INTERRUPT, 9 IO_INTERRUPT,
10 EXTINT_CLK, 10 EXTINT_CLK,
11 EXTINT_IPI, 11 EXTINT_EXC,
12 EXTINT_EMS,
12 EXTINT_TMR, 13 EXTINT_TMR,
13 EXTINT_TLA, 14 EXTINT_TLA,
14 EXTINT_PFL, 15 EXTINT_PFL,
@@ -17,8 +18,8 @@ enum interruption_class {
17 EXTINT_SCP, 18 EXTINT_SCP,
18 EXTINT_IUC, 19 EXTINT_IUC,
19 EXTINT_CPM, 20 EXTINT_CPM,
21 IOINT_CIO,
20 IOINT_QAI, 22 IOINT_QAI,
21 IOINT_QDI,
22 IOINT_DAS, 23 IOINT_DAS,
23 IOINT_C15, 24 IOINT_C15,
24 IOINT_C70, 25 IOINT_C70,
@@ -28,6 +29,7 @@ enum interruption_class {
28 IOINT_CLW, 29 IOINT_CLW,
29 IOINT_CTC, 30 IOINT_CTC,
30 IOINT_APB, 31 IOINT_APB,
32 IOINT_CSC,
31 NMI_NMI, 33 NMI_NMI,
32 NR_IRQS, 34 NR_IRQS,
33}; 35};
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h
index bb729b84a21e..cf4e47b0948c 100644
--- a/arch/s390/include/asm/kexec.h
+++ b/arch/s390/include/asm/kexec.h
@@ -30,9 +30,15 @@
30/* Not more than 2GB */ 30/* Not more than 2GB */
31#define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) 31#define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)
32 32
33/* Maximum address we can use for the crash control pages */
34#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT (-1UL)
35
33/* Allocate one page for the pdp and the second for the code */ 36/* Allocate one page for the pdp and the second for the code */
34#define KEXEC_CONTROL_PAGE_SIZE 4096 37#define KEXEC_CONTROL_PAGE_SIZE 4096
35 38
39/* Alignment of crashkernel memory */
40#define KEXEC_CRASH_MEM_ALIGN HPAGE_SIZE
41
36/* The native architecture */ 42/* The native architecture */
37#define KEXEC_ARCH KEXEC_ARCH_S390 43#define KEXEC_ARCH KEXEC_ARCH_S390
38 44
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 1ca5de07ac36..24e18473d926 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -145,6 +145,7 @@ struct kvm_vcpu_stat {
145 u32 instruction_sigp_arch; 145 u32 instruction_sigp_arch;
146 u32 instruction_sigp_prefix; 146 u32 instruction_sigp_prefix;
147 u32 instruction_sigp_restart; 147 u32 instruction_sigp_restart;
148 u32 diagnose_10;
148 u32 diagnose_44; 149 u32 diagnose_44;
149}; 150};
150 151
diff --git a/arch/s390/include/asm/lowcore.h b/arch/s390/include/asm/lowcore.h
index e85c911aabf0..9e13c7d56cc1 100644
--- a/arch/s390/include/asm/lowcore.h
+++ b/arch/s390/include/asm/lowcore.h
@@ -151,10 +151,8 @@ struct _lowcore {
151 */ 151 */
152 __u32 ipib; /* 0x0e00 */ 152 __u32 ipib; /* 0x0e00 */
153 __u32 ipib_checksum; /* 0x0e04 */ 153 __u32 ipib_checksum; /* 0x0e04 */
154 154 __u32 vmcore_info; /* 0x0e08 */
155 /* 64 bit save area */ 155 __u8 pad_0x0e0c[0x0f00-0x0e0c]; /* 0x0e0c */
156 __u64 save_area_64; /* 0x0e08 */
157 __u8 pad_0x0e10[0x0f00-0x0e10]; /* 0x0e10 */
158 156
159 /* Extended facility list */ 157 /* Extended facility list */
160 __u64 stfle_fac_list[32]; /* 0x0f00 */ 158 __u64 stfle_fac_list[32]; /* 0x0f00 */
@@ -290,9 +288,7 @@ struct _lowcore {
290 */ 288 */
291 __u64 ipib; /* 0x0e00 */ 289 __u64 ipib; /* 0x0e00 */
292 __u32 ipib_checksum; /* 0x0e08 */ 290 __u32 ipib_checksum; /* 0x0e08 */
293 291 __u64 vmcore_info; /* 0x0e0c */
294 /* 64 bit save area */
295 __u64 save_area_64; /* 0x0e0c */
296 __u8 pad_0x0e14[0x0f00-0x0e14]; /* 0x0e14 */ 292 __u8 pad_0x0e14[0x0f00-0x0e14]; /* 0x0e14 */
297 293
298 /* Extended facility list */ 294 /* Extended facility list */
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h
index accb372ddc7e..f7ec548c2b9d 100644
--- a/arch/s390/include/asm/page.h
+++ b/arch/s390/include/asm/page.h
@@ -177,6 +177,7 @@ static inline int page_test_and_clear_young(unsigned long pfn)
177struct page; 177struct page;
178void arch_free_page(struct page *page, int order); 178void arch_free_page(struct page *page, int order);
179void arch_alloc_page(struct page *page, int order); 179void arch_alloc_page(struct page *page, int order);
180void arch_set_page_states(int make_stable);
180 181
181static inline int devmem_is_allowed(unsigned long pfn) 182static inline int devmem_is_allowed(unsigned long pfn)
182{ 183{
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index c0cb794bb365..34ede0ea85a9 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -696,7 +696,9 @@ void gmap_disable(struct gmap *gmap);
696int gmap_map_segment(struct gmap *gmap, unsigned long from, 696int gmap_map_segment(struct gmap *gmap, unsigned long from,
697 unsigned long to, unsigned long length); 697 unsigned long to, unsigned long length);
698int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len); 698int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len);
699unsigned long __gmap_fault(unsigned long address, struct gmap *);
699unsigned long gmap_fault(unsigned long address, struct gmap *); 700unsigned long gmap_fault(unsigned long address, struct gmap *);
701void gmap_discard(unsigned long from, unsigned long to, struct gmap *);
700 702
701/* 703/*
702 * Certain architectures need to do special things when PTEs 704 * Certain architectures need to do special things when PTEs
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index a4b6229e5d4b..5f33d37d032c 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -33,6 +33,8 @@ static inline void get_cpu_id(struct cpuid *ptr)
33 33
34extern void s390_adjust_jiffies(void); 34extern void s390_adjust_jiffies(void);
35extern int get_cpu_capability(unsigned int *); 35extern int get_cpu_capability(unsigned int *);
36extern const struct seq_operations cpuinfo_op;
37extern int sysctl_ieee_emulation_warnings;
36 38
37/* 39/*
38 * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit. 40 * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
@@ -118,17 +120,17 @@ struct stack_frame {
118/* 120/*
119 * Do necessary setup to start up a new thread. 121 * Do necessary setup to start up a new thread.
120 */ 122 */
121#define start_thread(regs, new_psw, new_stackp) do { \ 123#define start_thread(regs, new_psw, new_stackp) do { \
122 regs->psw.mask = psw_user_bits; \ 124 regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \
123 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ 125 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \
124 regs->gprs[15] = new_stackp; \ 126 regs->gprs[15] = new_stackp; \
125} while (0) 127} while (0)
126 128
127#define start_thread31(regs, new_psw, new_stackp) do { \ 129#define start_thread31(regs, new_psw, new_stackp) do { \
128 regs->psw.mask = psw_user32_bits; \ 130 regs->psw.mask = psw_user_bits | PSW_MASK_BA; \
129 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ 131 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \
130 regs->gprs[15] = new_stackp; \ 132 regs->gprs[15] = new_stackp; \
131 crst_table_downgrade(current->mm, 1UL << 31); \ 133 crst_table_downgrade(current->mm, 1UL << 31); \
132} while (0) 134} while (0)
133 135
134/* Forward declaration, a strange C thing */ 136/* Forward declaration, a strange C thing */
@@ -187,7 +189,6 @@ static inline void __load_psw(psw_t psw)
187 * Set PSW mask to specified value, while leaving the 189 * Set PSW mask to specified value, while leaving the
188 * PSW addr pointing to the next instruction. 190 * PSW addr pointing to the next instruction.
189 */ 191 */
190
191static inline void __load_psw_mask (unsigned long mask) 192static inline void __load_psw_mask (unsigned long mask)
192{ 193{
193 unsigned long addr; 194 unsigned long addr;
@@ -212,26 +213,37 @@ static inline void __load_psw_mask (unsigned long mask)
212 : "=&d" (addr), "=Q" (psw) : "Q" (psw) : "memory", "cc"); 213 : "=&d" (addr), "=Q" (psw) : "Q" (psw) : "memory", "cc");
213#endif /* __s390x__ */ 214#endif /* __s390x__ */
214} 215}
215 216
216/* 217/*
217 * Function to stop a processor until an interruption occurred 218 * Rewind PSW instruction address by specified number of bytes.
218 */ 219 */
219static inline void enabled_wait(void) 220static inline unsigned long __rewind_psw(psw_t psw, unsigned long ilc)
220{ 221{
221 __load_psw_mask(PSW_BASE_BITS | PSW_MASK_IO | PSW_MASK_EXT | 222#ifndef __s390x__
222 PSW_MASK_MCHECK | PSW_MASK_WAIT | PSW_DEFAULT_KEY); 223 if (psw.addr & PSW_ADDR_AMODE)
223} 224 /* 31 bit mode */
225 return (psw.addr - ilc) | PSW_ADDR_AMODE;
226 /* 24 bit mode */
227 return (psw.addr - ilc) & ((1UL << 24) - 1);
228#else
229 unsigned long mask;
224 230
231 mask = (psw.mask & PSW_MASK_EA) ? -1UL :
232 (psw.mask & PSW_MASK_BA) ? (1UL << 31) - 1 :
233 (1UL << 24) - 1;
234 return (psw.addr - ilc) & mask;
235#endif
236}
237
225/* 238/*
226 * Function to drop a processor into disabled wait state 239 * Function to drop a processor into disabled wait state
227 */ 240 */
228
229static inline void ATTRIB_NORET disabled_wait(unsigned long code) 241static inline void ATTRIB_NORET disabled_wait(unsigned long code)
230{ 242{
231 unsigned long ctl_buf; 243 unsigned long ctl_buf;
232 psw_t dw_psw; 244 psw_t dw_psw;
233 245
234 dw_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT; 246 dw_psw.mask = PSW_MASK_BASE | PSW_MASK_WAIT | PSW_MASK_BA | PSW_MASK_EA;
235 dw_psw.addr = code; 247 dw_psw.addr = code;
236 /* 248 /*
237 * Store status and then load disabled wait psw, 249 * Store status and then load disabled wait psw,
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h
index 62fd80c9e98c..a65846340d51 100644
--- a/arch/s390/include/asm/ptrace.h
+++ b/arch/s390/include/asm/ptrace.h
@@ -230,17 +230,21 @@ typedef struct
230#define PSW_MASK_IO 0x02000000UL 230#define PSW_MASK_IO 0x02000000UL
231#define PSW_MASK_EXT 0x01000000UL 231#define PSW_MASK_EXT 0x01000000UL
232#define PSW_MASK_KEY 0x00F00000UL 232#define PSW_MASK_KEY 0x00F00000UL
233#define PSW_MASK_BASE 0x00080000UL /* always one */
233#define PSW_MASK_MCHECK 0x00040000UL 234#define PSW_MASK_MCHECK 0x00040000UL
234#define PSW_MASK_WAIT 0x00020000UL 235#define PSW_MASK_WAIT 0x00020000UL
235#define PSW_MASK_PSTATE 0x00010000UL 236#define PSW_MASK_PSTATE 0x00010000UL
236#define PSW_MASK_ASC 0x0000C000UL 237#define PSW_MASK_ASC 0x0000C000UL
237#define PSW_MASK_CC 0x00003000UL 238#define PSW_MASK_CC 0x00003000UL
238#define PSW_MASK_PM 0x00000F00UL 239#define PSW_MASK_PM 0x00000F00UL
240#define PSW_MASK_EA 0x00000000UL
241#define PSW_MASK_BA 0x00000000UL
242
243#define PSW_MASK_USER 0x00003F00UL
239 244
240#define PSW_ADDR_AMODE 0x80000000UL 245#define PSW_ADDR_AMODE 0x80000000UL
241#define PSW_ADDR_INSN 0x7FFFFFFFUL 246#define PSW_ADDR_INSN 0x7FFFFFFFUL
242 247
243#define PSW_BASE_BITS 0x00080000UL
244#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 20) 248#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 20)
245 249
246#define PSW_ASC_PRIMARY 0x00000000UL 250#define PSW_ASC_PRIMARY 0x00000000UL
@@ -254,6 +258,7 @@ typedef struct
254#define PSW_MASK_DAT 0x0400000000000000UL 258#define PSW_MASK_DAT 0x0400000000000000UL
255#define PSW_MASK_IO 0x0200000000000000UL 259#define PSW_MASK_IO 0x0200000000000000UL
256#define PSW_MASK_EXT 0x0100000000000000UL 260#define PSW_MASK_EXT 0x0100000000000000UL
261#define PSW_MASK_BASE 0x0000000000000000UL
257#define PSW_MASK_KEY 0x00F0000000000000UL 262#define PSW_MASK_KEY 0x00F0000000000000UL
258#define PSW_MASK_MCHECK 0x0004000000000000UL 263#define PSW_MASK_MCHECK 0x0004000000000000UL
259#define PSW_MASK_WAIT 0x0002000000000000UL 264#define PSW_MASK_WAIT 0x0002000000000000UL
@@ -261,12 +266,14 @@ typedef struct
261#define PSW_MASK_ASC 0x0000C00000000000UL 266#define PSW_MASK_ASC 0x0000C00000000000UL
262#define PSW_MASK_CC 0x0000300000000000UL 267#define PSW_MASK_CC 0x0000300000000000UL
263#define PSW_MASK_PM 0x00000F0000000000UL 268#define PSW_MASK_PM 0x00000F0000000000UL
269#define PSW_MASK_EA 0x0000000100000000UL
270#define PSW_MASK_BA 0x0000000080000000UL
271
272#define PSW_MASK_USER 0x00003F0180000000UL
264 273
265#define PSW_ADDR_AMODE 0x0000000000000000UL 274#define PSW_ADDR_AMODE 0x0000000000000000UL
266#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL 275#define PSW_ADDR_INSN 0xFFFFFFFFFFFFFFFFUL
267 276
268#define PSW_BASE_BITS 0x0000000180000000UL
269#define PSW_BASE32_BITS 0x0000000080000000UL
270#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 52) 277#define PSW_DEFAULT_KEY (((unsigned long) PAGE_DEFAULT_ACC) << 52)
271 278
272#define PSW_ASC_PRIMARY 0x0000000000000000UL 279#define PSW_ASC_PRIMARY 0x0000000000000000UL
@@ -279,18 +286,7 @@ typedef struct
279#ifdef __KERNEL__ 286#ifdef __KERNEL__
280extern long psw_kernel_bits; 287extern long psw_kernel_bits;
281extern long psw_user_bits; 288extern long psw_user_bits;
282#ifdef CONFIG_64BIT
283extern long psw_user32_bits;
284#endif 289#endif
285#endif
286
287/* This macro merges a NEW PSW mask specified by the user into
288 the currently active PSW mask CURRENT, modifying only those
289 bits in CURRENT that the user may be allowed to change: this
290 is the condition code and the program mask bits. */
291#define PSW_MASK_MERGE(CURRENT,NEW) \
292 (((CURRENT) & ~(PSW_MASK_CC|PSW_MASK_PM)) | \
293 ((NEW) & (PSW_MASK_CC|PSW_MASK_PM)))
294 290
295/* 291/*
296 * The s390_regs structure is used to define the elf_gregset_t. 292 * The s390_regs structure is used to define the elf_gregset_t.
@@ -328,8 +324,7 @@ struct pt_regs
328 psw_t psw; 324 psw_t psw;
329 unsigned long gprs[NUM_GPRS]; 325 unsigned long gprs[NUM_GPRS];
330 unsigned long orig_gpr2; 326 unsigned long orig_gpr2;
331 unsigned short ilc; 327 unsigned int svc_code;
332 unsigned short svcnr;
333}; 328};
334 329
335/* 330/*
@@ -487,6 +482,8 @@ typedef struct
487#define PTRACE_POKETEXT_AREA 0x5004 482#define PTRACE_POKETEXT_AREA 0x5004
488#define PTRACE_POKEDATA_AREA 0x5005 483#define PTRACE_POKEDATA_AREA 0x5005
489#define PTRACE_GET_LAST_BREAK 0x5006 484#define PTRACE_GET_LAST_BREAK 0x5006
485#define PTRACE_PEEK_SYSTEM_CALL 0x5007
486#define PTRACE_POKE_SYSTEM_CALL 0x5008
490 487
491/* 488/*
492 * PT_PROT definition is loosely based on hppa bsd definition in 489 * PT_PROT definition is loosely based on hppa bsd definition in
diff --git a/arch/s390/include/asm/reset.h b/arch/s390/include/asm/reset.h
index f584f4a52581..3d6ad4ad2a3f 100644
--- a/arch/s390/include/asm/reset.h
+++ b/arch/s390/include/asm/reset.h
@@ -17,5 +17,5 @@ struct reset_call {
17 17
18extern void register_reset_call(struct reset_call *reset); 18extern void register_reset_call(struct reset_call *reset);
19extern void unregister_reset_call(struct reset_call *reset); 19extern void unregister_reset_call(struct reset_call *reset);
20extern void s390_reset_system(void); 20extern void s390_reset_system(void (*func)(void *), void *data);
21#endif /* _ASM_S390_RESET_H */ 21#endif /* _ASM_S390_RESET_H */
diff --git a/arch/s390/include/asm/setup.h b/arch/s390/include/asm/setup.h
index d5e2ef10537d..5a099714df04 100644
--- a/arch/s390/include/asm/setup.h
+++ b/arch/s390/include/asm/setup.h
@@ -26,15 +26,21 @@
26#define IPL_DEVICE (*(unsigned long *) (0x10404)) 26#define IPL_DEVICE (*(unsigned long *) (0x10404))
27#define INITRD_START (*(unsigned long *) (0x1040C)) 27#define INITRD_START (*(unsigned long *) (0x1040C))
28#define INITRD_SIZE (*(unsigned long *) (0x10414)) 28#define INITRD_SIZE (*(unsigned long *) (0x10414))
29#define OLDMEM_BASE (*(unsigned long *) (0x1041C))
30#define OLDMEM_SIZE (*(unsigned long *) (0x10424))
29#else /* __s390x__ */ 31#else /* __s390x__ */
30#define IPL_DEVICE (*(unsigned long *) (0x10400)) 32#define IPL_DEVICE (*(unsigned long *) (0x10400))
31#define INITRD_START (*(unsigned long *) (0x10408)) 33#define INITRD_START (*(unsigned long *) (0x10408))
32#define INITRD_SIZE (*(unsigned long *) (0x10410)) 34#define INITRD_SIZE (*(unsigned long *) (0x10410))
35#define OLDMEM_BASE (*(unsigned long *) (0x10418))
36#define OLDMEM_SIZE (*(unsigned long *) (0x10420))
33#endif /* __s390x__ */ 37#endif /* __s390x__ */
34#define COMMAND_LINE ((char *) (0x10480)) 38#define COMMAND_LINE ((char *) (0x10480))
35 39
36#define CHUNK_READ_WRITE 0 40#define CHUNK_READ_WRITE 0
37#define CHUNK_READ_ONLY 1 41#define CHUNK_READ_ONLY 1
42#define CHUNK_OLDMEM 4
43#define CHUNK_CRASHK 5
38 44
39struct mem_chunk { 45struct mem_chunk {
40 unsigned long addr; 46 unsigned long addr;
@@ -48,6 +54,8 @@ extern int memory_end_set;
48extern unsigned long memory_end; 54extern unsigned long memory_end;
49 55
50void detect_memory_layout(struct mem_chunk chunk[]); 56void detect_memory_layout(struct mem_chunk chunk[]);
57void create_mem_hole(struct mem_chunk memory_chunk[], unsigned long addr,
58 unsigned long size, int type);
51 59
52#define PRIMARY_SPACE_MODE 0 60#define PRIMARY_SPACE_MODE 0
53#define ACCESS_REGISTER_MODE 1 61#define ACCESS_REGISTER_MODE 1
@@ -106,6 +114,7 @@ extern unsigned int user_mode;
106#endif /* __s390x__ */ 114#endif /* __s390x__ */
107 115
108#define ZFCPDUMP_HSA_SIZE (32UL<<20) 116#define ZFCPDUMP_HSA_SIZE (32UL<<20)
117#define ZFCPDUMP_HSA_SIZE_MAX (64UL<<20)
109 118
110/* 119/*
111 * Console mode. Override with conmode= 120 * Console mode. Override with conmode=
@@ -134,10 +143,14 @@ extern char kernel_nss_name[];
134#define IPL_DEVICE 0x10404 143#define IPL_DEVICE 0x10404
135#define INITRD_START 0x1040C 144#define INITRD_START 0x1040C
136#define INITRD_SIZE 0x10414 145#define INITRD_SIZE 0x10414
146#define OLDMEM_BASE 0x1041C
147#define OLDMEM_SIZE 0x10424
137#else /* __s390x__ */ 148#else /* __s390x__ */
138#define IPL_DEVICE 0x10400 149#define IPL_DEVICE 0x10400
139#define INITRD_START 0x10408 150#define INITRD_START 0x10408
140#define INITRD_SIZE 0x10410 151#define INITRD_SIZE 0x10410
152#define OLDMEM_BASE 0x10418
153#define OLDMEM_SIZE 0x10420
141#endif /* __s390x__ */ 154#endif /* __s390x__ */
142#define COMMAND_LINE 0x10480 155#define COMMAND_LINE 0x10480
143 156
diff --git a/arch/s390/include/asm/sfp-util.h b/arch/s390/include/asm/sfp-util.h
index 0addc6466d95..ca3f8814e361 100644
--- a/arch/s390/include/asm/sfp-util.h
+++ b/arch/s390/include/asm/sfp-util.h
@@ -72,6 +72,6 @@ extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int,
72 72
73#define UDIV_NEEDS_NORMALIZATION 0 73#define UDIV_NEEDS_NORMALIZATION 0
74 74
75#define abort() return 0 75#define abort() BUG()
76 76
77#define __BYTE_ORDER __BIG_ENDIAN 77#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/arch/s390/include/asm/smp.h b/arch/s390/include/asm/smp.h
index 045e009fc164..ab47a69fdf07 100644
--- a/arch/s390/include/asm/smp.h
+++ b/arch/s390/include/asm/smp.h
@@ -33,6 +33,7 @@ extern struct save_area *zfcpdump_save_areas[NR_CPUS + 1];
33extern void smp_switch_to_ipl_cpu(void (*func)(void *), void *); 33extern void smp_switch_to_ipl_cpu(void (*func)(void *), void *);
34extern void smp_switch_to_cpu(void (*)(void *), void *, unsigned long sp, 34extern void smp_switch_to_cpu(void (*)(void *), void *, unsigned long sp,
35 int from, int to); 35 int from, int to);
36extern void smp_restart_with_online_cpu(void);
36extern void smp_restart_cpu(void); 37extern void smp_restart_cpu(void);
37 38
38/* 39/*
@@ -64,6 +65,10 @@ static inline void smp_switch_to_ipl_cpu(void (*func)(void *), void *data)
64 func(data); 65 func(data);
65} 66}
66 67
68static inline void smp_restart_with_online_cpu(void)
69{
70}
71
67#define smp_vcpu_scheduled (1) 72#define smp_vcpu_scheduled (1)
68 73
69#endif /* CONFIG_SMP */ 74#endif /* CONFIG_SMP */
diff --git a/arch/s390/include/asm/spinlock.h b/arch/s390/include/asm/spinlock.h
index 56612fc8186e..fd94dfec8d08 100644
--- a/arch/s390/include/asm/spinlock.h
+++ b/arch/s390/include/asm/spinlock.h
@@ -13,6 +13,8 @@
13 13
14#include <linux/smp.h> 14#include <linux/smp.h>
15 15
16extern int spin_retry;
17
16static inline int 18static inline int
17_raw_compare_and_swap(volatile unsigned int *lock, 19_raw_compare_and_swap(volatile unsigned int *lock,
18 unsigned int old, unsigned int new) 20 unsigned int old, unsigned int new)
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h
index 5c0246b955d8..b239ff53b189 100644
--- a/arch/s390/include/asm/syscall.h
+++ b/arch/s390/include/asm/syscall.h
@@ -13,6 +13,7 @@
13#define _ASM_SYSCALL_H 1 13#define _ASM_SYSCALL_H 1
14 14
15#include <linux/sched.h> 15#include <linux/sched.h>
16#include <linux/err.h>
16#include <asm/ptrace.h> 17#include <asm/ptrace.h>
17 18
18/* 19/*
@@ -25,7 +26,8 @@ extern const unsigned int sys_call_table[];
25static inline long syscall_get_nr(struct task_struct *task, 26static inline long syscall_get_nr(struct task_struct *task,
26 struct pt_regs *regs) 27 struct pt_regs *regs)
27{ 28{
28 return regs->svcnr ? regs->svcnr : -1; 29 return test_tsk_thread_flag(task, TIF_SYSCALL) ?
30 (regs->svc_code & 0xffff) : -1;
29} 31}
30 32
31static inline void syscall_rollback(struct task_struct *task, 33static inline void syscall_rollback(struct task_struct *task,
@@ -37,7 +39,7 @@ static inline void syscall_rollback(struct task_struct *task,
37static inline long syscall_get_error(struct task_struct *task, 39static inline long syscall_get_error(struct task_struct *task,
38 struct pt_regs *regs) 40 struct pt_regs *regs)
39{ 41{
40 return (regs->gprs[2] >= -4096UL) ? -regs->gprs[2] : 0; 42 return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0;
41} 43}
42 44
43static inline long syscall_get_return_value(struct task_struct *task, 45static inline long syscall_get_return_value(struct task_struct *task,
diff --git a/arch/s390/include/asm/system.h b/arch/s390/include/asm/system.h
index 6582f69f2389..ef573c1d71a7 100644
--- a/arch/s390/include/asm/system.h
+++ b/arch/s390/include/asm/system.h
@@ -20,6 +20,8 @@
20 20
21struct task_struct; 21struct task_struct;
22 22
23extern int sysctl_userprocess_debug;
24
23extern struct task_struct *__switch_to(void *, void *); 25extern struct task_struct *__switch_to(void *, void *);
24extern void update_per_regs(struct task_struct *task); 26extern void update_per_regs(struct task_struct *task);
25 27
@@ -114,6 +116,8 @@ extern void pfault_fini(void);
114extern void cmma_init(void); 116extern void cmma_init(void);
115extern int memcpy_real(void *, void *, size_t); 117extern int memcpy_real(void *, void *, size_t);
116extern void copy_to_absolute_zero(void *dest, void *src, size_t count); 118extern void copy_to_absolute_zero(void *dest, void *src, size_t count);
119extern int copy_to_user_real(void __user *dest, void *src, size_t count);
120extern int copy_from_user_real(void *dest, void __user *src, size_t count);
117 121
118#define finish_arch_switch(prev) do { \ 122#define finish_arch_switch(prev) do { \
119 set_fs(current->thread.mm_segment); \ 123 set_fs(current->thread.mm_segment); \
@@ -210,8 +214,10 @@ __set_psw_mask(unsigned long mask)
210 __load_psw_mask(mask | (arch_local_save_flags() & ~(-1UL >> 8))); 214 __load_psw_mask(mask | (arch_local_save_flags() & ~(-1UL >> 8)));
211} 215}
212 216
213#define local_mcck_enable() __set_psw_mask(psw_kernel_bits) 217#define local_mcck_enable() \
214#define local_mcck_disable() __set_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK) 218 __set_psw_mask(psw_kernel_bits | PSW_MASK_DAT | PSW_MASK_MCHECK)
219#define local_mcck_disable() \
220 __set_psw_mask(psw_kernel_bits | PSW_MASK_DAT)
215 221
216#ifdef CONFIG_SMP 222#ifdef CONFIG_SMP
217 223
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h
index 1a5dbb6f1495..a23183423b14 100644
--- a/arch/s390/include/asm/thread_info.h
+++ b/arch/s390/include/asm/thread_info.h
@@ -48,6 +48,7 @@ struct thread_info {
48 unsigned int cpu; /* current CPU */ 48 unsigned int cpu; /* current CPU */
49 int preempt_count; /* 0 => preemptable, <0 => BUG */ 49 int preempt_count; /* 0 => preemptable, <0 => BUG */
50 struct restart_block restart_block; 50 struct restart_block restart_block;
51 unsigned int system_call;
51 __u64 user_timer; 52 __u64 user_timer;
52 __u64 system_timer; 53 __u64 system_timer;
53 unsigned long last_break; /* last breaking-event-address. */ 54 unsigned long last_break; /* last breaking-event-address. */
@@ -84,10 +85,10 @@ static inline struct thread_info *current_thread_info(void)
84/* 85/*
85 * thread information flags bit numbers 86 * thread information flags bit numbers
86 */ 87 */
88#define TIF_SYSCALL 0 /* inside a system call */
87#define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ 89#define TIF_NOTIFY_RESUME 1 /* callback before returning to user */
88#define TIF_SIGPENDING 2 /* signal pending */ 90#define TIF_SIGPENDING 2 /* signal pending */
89#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 91#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
90#define TIF_RESTART_SVC 4 /* restart svc with new svc number */
91#define TIF_PER_TRAP 6 /* deliver sigtrap on return to user */ 92#define TIF_PER_TRAP 6 /* deliver sigtrap on return to user */
92#define TIF_MCCK_PENDING 7 /* machine check handling is pending */ 93#define TIF_MCCK_PENDING 7 /* machine check handling is pending */
93#define TIF_SYSCALL_TRACE 8 /* syscall trace active */ 94#define TIF_SYSCALL_TRACE 8 /* syscall trace active */
@@ -103,11 +104,11 @@ static inline struct thread_info *current_thread_info(void)
103#define TIF_SINGLE_STEP 20 /* This task is single stepped */ 104#define TIF_SINGLE_STEP 20 /* This task is single stepped */
104#define TIF_FREEZE 21 /* thread is freezing for suspend */ 105#define TIF_FREEZE 21 /* thread is freezing for suspend */
105 106
107#define _TIF_SYSCALL (1<<TIF_SYSCALL)
106#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 108#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
107#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) 109#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
108#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 110#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
109#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 111#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
110#define _TIF_RESTART_SVC (1<<TIF_RESTART_SVC)
111#define _TIF_PER_TRAP (1<<TIF_PER_TRAP) 112#define _TIF_PER_TRAP (1<<TIF_PER_TRAP)
112#define _TIF_MCCK_PENDING (1<<TIF_MCCK_PENDING) 113#define _TIF_MCCK_PENDING (1<<TIF_MCCK_PENDING)
113#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 114#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
@@ -117,7 +118,7 @@ static inline struct thread_info *current_thread_info(void)
117#define _TIF_SIE (1<<TIF_SIE) 118#define _TIF_SIE (1<<TIF_SIE)
118#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 119#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
119#define _TIF_31BIT (1<<TIF_31BIT) 120#define _TIF_31BIT (1<<TIF_31BIT)
120#define _TIF_SINGLE_STEP (1<<TIF_FREEZE) 121#define _TIF_SINGLE_STEP (1<<TIF_SINGLE_STEP)
121#define _TIF_FREEZE (1<<TIF_FREEZE) 122#define _TIF_FREEZE (1<<TIF_FREEZE)
122 123
123#ifdef CONFIG_64BIT 124#ifdef CONFIG_64BIT
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h
index 88829a40af6f..d610bef9c5e9 100644
--- a/arch/s390/include/asm/timex.h
+++ b/arch/s390/include/asm/timex.h
@@ -86,6 +86,17 @@ static inline void get_clock_ext(char *clk)
86 asm volatile("stcke %0" : "=Q" (*clk) : : "cc"); 86 asm volatile("stcke %0" : "=Q" (*clk) : : "cc");
87} 87}
88 88
89static inline unsigned long long get_clock_fast(void)
90{
91 unsigned long long clk;
92
93 if (test_facility(25))
94 asm volatile(".insn s,0xb27c0000,%0" : "=Q" (clk) : : "cc");
95 else
96 clk = get_clock();
97 return clk;
98}
99
89static inline unsigned long long get_clock_xt(void) 100static inline unsigned long long get_clock_xt(void)
90{ 101{
91 unsigned char clk[16]; 102 unsigned char clk[16];
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h
index 304445382382..1d8648cf2fea 100644
--- a/arch/s390/include/asm/tlbflush.h
+++ b/arch/s390/include/asm/tlbflush.h
@@ -59,6 +59,7 @@ static inline void __tlb_flush_full(struct mm_struct *mm)
59} 59}
60#else 60#else
61#define __tlb_flush_full(mm) __tlb_flush_local() 61#define __tlb_flush_full(mm) __tlb_flush_local()
62#define __tlb_flush_global() __tlb_flush_local()
62#endif 63#endif
63 64
64/* 65/*