aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/include/asm/irqflags.h9
-rw-r--r--arch/s390/include/asm/pci_io.h14
-rw-r--r--arch/s390/include/asm/processor.h4
-rw-r--r--arch/s390/include/asm/ptrace.h6
-rw-r--r--arch/s390/include/uapi/asm/unistd.h3
-rw-r--r--arch/s390/kernel/compat_wrapper.c1
-rw-r--r--arch/s390/kernel/crash_dump.c2
-rw-r--r--arch/s390/kernel/debug.c2
-rw-r--r--arch/s390/kernel/dumpstack.c9
-rw-r--r--arch/s390/kernel/early.c8
-rw-r--r--arch/s390/kernel/ftrace.c2
-rw-r--r--arch/s390/kernel/ipl.c4
-rw-r--r--arch/s390/kernel/kprobes.c16
-rw-r--r--arch/s390/kernel/perf_event.c12
-rw-r--r--arch/s390/kernel/process.c12
-rw-r--r--arch/s390/kernel/ptrace.c6
-rw-r--r--arch/s390/kernel/setup.c16
-rw-r--r--arch/s390/kernel/signal.c13
-rw-r--r--arch/s390/kernel/smp.c2
-rw-r--r--arch/s390/kernel/stacktrace.c11
-rw-r--r--arch/s390/kernel/syscalls.S1
-rw-r--r--arch/s390/kernel/traps.c11
-rw-r--r--arch/s390/kvm/guestdbg.c4
-rw-r--r--arch/s390/mm/fault.c6
-rw-r--r--arch/s390/mm/init.c2
-rw-r--r--arch/s390/mm/mmap.c12
-rw-r--r--arch/s390/mm/pgtable.c2
-rw-r--r--arch/s390/numa/numa.c6
-rw-r--r--arch/s390/oprofile/backtrace.c9
-rw-r--r--arch/s390/pci/pci.c61
-rw-r--r--arch/s390/pci/pci_event.c5
-rw-r--r--drivers/s390/cio/chp.c21
-rw-r--r--drivers/s390/cio/chp.h2
-rw-r--r--drivers/s390/cio/chsc.c43
-rw-r--r--drivers/s390/crypto/zcrypt_error.h15
-rw-r--r--drivers/s390/crypto/zcrypt_msgtype50.c9
-rw-r--r--drivers/s390/crypto/zcrypt_msgtype6.c20
37 files changed, 192 insertions, 189 deletions
diff --git a/arch/s390/include/asm/irqflags.h b/arch/s390/include/asm/irqflags.h
index 16aa0c779e07..595a275c36f8 100644
--- a/arch/s390/include/asm/irqflags.h
+++ b/arch/s390/include/asm/irqflags.h
@@ -8,6 +8,8 @@
8 8
9#include <linux/types.h> 9#include <linux/types.h>
10 10
11#define ARCH_IRQ_ENABLED (3UL << (BITS_PER_LONG - 8))
12
11/* store then OR system mask. */ 13/* store then OR system mask. */
12#define __arch_local_irq_stosm(__or) \ 14#define __arch_local_irq_stosm(__or) \
13({ \ 15({ \
@@ -54,14 +56,17 @@ static inline notrace void arch_local_irq_enable(void)
54 __arch_local_irq_stosm(0x03); 56 __arch_local_irq_stosm(0x03);
55} 57}
56 58
59/* This only restores external and I/O interrupt state */
57static inline notrace void arch_local_irq_restore(unsigned long flags) 60static inline notrace void arch_local_irq_restore(unsigned long flags)
58{ 61{
59 __arch_local_irq_ssm(flags); 62 /* only disabled->disabled and disabled->enabled is valid */
63 if (flags & ARCH_IRQ_ENABLED)
64 arch_local_irq_enable();
60} 65}
61 66
62static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) 67static inline notrace bool arch_irqs_disabled_flags(unsigned long flags)
63{ 68{
64 return !(flags & (3UL << (BITS_PER_LONG - 8))); 69 return !(flags & ARCH_IRQ_ENABLED);
65} 70}
66 71
67static inline notrace bool arch_irqs_disabled(void) 72static inline notrace bool arch_irqs_disabled(void)
diff --git a/arch/s390/include/asm/pci_io.h b/arch/s390/include/asm/pci_io.h
index 1a9a98de5bde..69aa18be61af 100644
--- a/arch/s390/include/asm/pci_io.h
+++ b/arch/s390/include/asm/pci_io.h
@@ -8,10 +8,13 @@
8#include <asm/pci_insn.h> 8#include <asm/pci_insn.h>
9 9
10/* I/O Map */ 10/* I/O Map */
11#define ZPCI_IOMAP_MAX_ENTRIES 0x7fff 11#define ZPCI_IOMAP_SHIFT 48
12#define ZPCI_IOMAP_ADDR_BASE 0x8000000000000000ULL 12#define ZPCI_IOMAP_ADDR_BASE 0x8000000000000000UL
13#define ZPCI_IOMAP_ADDR_IDX_MASK 0x7fff000000000000ULL 13#define ZPCI_IOMAP_ADDR_OFF_MASK ((1UL << ZPCI_IOMAP_SHIFT) - 1)
14#define ZPCI_IOMAP_ADDR_OFF_MASK 0x0000ffffffffffffULL 14#define ZPCI_IOMAP_MAX_ENTRIES \
15 ((ULONG_MAX - ZPCI_IOMAP_ADDR_BASE + 1) / (1UL << ZPCI_IOMAP_SHIFT))
16#define ZPCI_IOMAP_ADDR_IDX_MASK \
17 (~ZPCI_IOMAP_ADDR_OFF_MASK - ZPCI_IOMAP_ADDR_BASE)
15 18
16struct zpci_iomap_entry { 19struct zpci_iomap_entry {
17 u32 fh; 20 u32 fh;
@@ -21,8 +24,9 @@ struct zpci_iomap_entry {
21 24
22extern struct zpci_iomap_entry *zpci_iomap_start; 25extern struct zpci_iomap_entry *zpci_iomap_start;
23 26
27#define ZPCI_ADDR(idx) (ZPCI_IOMAP_ADDR_BASE | ((u64) idx << ZPCI_IOMAP_SHIFT))
24#define ZPCI_IDX(addr) \ 28#define ZPCI_IDX(addr) \
25 (((__force u64) addr & ZPCI_IOMAP_ADDR_IDX_MASK) >> 48) 29 (((__force u64) addr & ZPCI_IOMAP_ADDR_IDX_MASK) >> ZPCI_IOMAP_SHIFT)
26#define ZPCI_OFFSET(addr) \ 30#define ZPCI_OFFSET(addr) \
27 ((__force u64) addr & ZPCI_IOMAP_ADDR_OFF_MASK) 31 ((__force u64) addr & ZPCI_IOMAP_ADDR_OFF_MASK)
28 32
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index f16debf6a612..1c4fe129486d 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -166,14 +166,14 @@ extern __vector128 init_task_fpu_regs[__NUM_VXRS];
166 */ 166 */
167#define start_thread(regs, new_psw, new_stackp) do { \ 167#define start_thread(regs, new_psw, new_stackp) do { \
168 regs->psw.mask = PSW_USER_BITS | PSW_MASK_EA | PSW_MASK_BA; \ 168 regs->psw.mask = PSW_USER_BITS | PSW_MASK_EA | PSW_MASK_BA; \
169 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ 169 regs->psw.addr = new_psw; \
170 regs->gprs[15] = new_stackp; \ 170 regs->gprs[15] = new_stackp; \
171 execve_tail(); \ 171 execve_tail(); \
172} while (0) 172} while (0)
173 173
174#define start_thread31(regs, new_psw, new_stackp) do { \ 174#define start_thread31(regs, new_psw, new_stackp) do { \
175 regs->psw.mask = PSW_USER_BITS | PSW_MASK_BA; \ 175 regs->psw.mask = PSW_USER_BITS | PSW_MASK_BA; \
176 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ 176 regs->psw.addr = new_psw; \
177 regs->gprs[15] = new_stackp; \ 177 regs->gprs[15] = new_stackp; \
178 crst_table_downgrade(current->mm, 1UL << 31); \ 178 crst_table_downgrade(current->mm, 1UL << 31); \
179 execve_tail(); \ 179 execve_tail(); \
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h
index f00cd35c8ac4..99bc456cc26a 100644
--- a/arch/s390/include/asm/ptrace.h
+++ b/arch/s390/include/asm/ptrace.h
@@ -149,7 +149,7 @@ static inline int test_pt_regs_flag(struct pt_regs *regs, int flag)
149#define arch_has_block_step() (1) 149#define arch_has_block_step() (1)
150 150
151#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) 151#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
152#define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) 152#define instruction_pointer(regs) ((regs)->psw.addr)
153#define user_stack_pointer(regs)((regs)->gprs[15]) 153#define user_stack_pointer(regs)((regs)->gprs[15])
154#define profile_pc(regs) instruction_pointer(regs) 154#define profile_pc(regs) instruction_pointer(regs)
155 155
@@ -161,7 +161,7 @@ static inline long regs_return_value(struct pt_regs *regs)
161static inline void instruction_pointer_set(struct pt_regs *regs, 161static inline void instruction_pointer_set(struct pt_regs *regs,
162 unsigned long val) 162 unsigned long val)
163{ 163{
164 regs->psw.addr = val | PSW_ADDR_AMODE; 164 regs->psw.addr = val;
165} 165}
166 166
167int regs_query_register_offset(const char *name); 167int regs_query_register_offset(const char *name);
@@ -171,7 +171,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
171 171
172static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) 172static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
173{ 173{
174 return regs->gprs[15] & PSW_ADDR_INSN; 174 return regs->gprs[15];
175} 175}
176 176
177#endif /* __ASSEMBLY__ */ 177#endif /* __ASSEMBLY__ */
diff --git a/arch/s390/include/uapi/asm/unistd.h b/arch/s390/include/uapi/asm/unistd.h
index 34ec202472c6..ab3aa6875a59 100644
--- a/arch/s390/include/uapi/asm/unistd.h
+++ b/arch/s390/include/uapi/asm/unistd.h
@@ -310,7 +310,8 @@
310#define __NR_recvmsg 372 310#define __NR_recvmsg 372
311#define __NR_shutdown 373 311#define __NR_shutdown 373
312#define __NR_mlock2 374 312#define __NR_mlock2 374
313#define NR_syscalls 375 313#define __NR_copy_file_range 375
314#define NR_syscalls 376
314 315
315/* 316/*
316 * There are some system calls that are not present on 64 bit, some 317 * There are some system calls that are not present on 64 bit, some
diff --git a/arch/s390/kernel/compat_wrapper.c b/arch/s390/kernel/compat_wrapper.c
index fac4eeddef91..ae2cda5eee5a 100644
--- a/arch/s390/kernel/compat_wrapper.c
+++ b/arch/s390/kernel/compat_wrapper.c
@@ -177,3 +177,4 @@ COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
177COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); 177COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len);
178COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); 178COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len);
179COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); 179COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags);
180COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags);
diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c
index a92b39fd0e63..3986c9f62191 100644
--- a/arch/s390/kernel/crash_dump.c
+++ b/arch/s390/kernel/crash_dump.c
@@ -59,8 +59,6 @@ struct save_area * __init save_area_alloc(bool is_boot_cpu)
59 struct save_area *sa; 59 struct save_area *sa;
60 60
61 sa = (void *) memblock_alloc(sizeof(*sa), 8); 61 sa = (void *) memblock_alloc(sizeof(*sa), 8);
62 if (!sa)
63 return NULL;
64 if (is_boot_cpu) 62 if (is_boot_cpu)
65 list_add(&sa->list, &dump_save_areas); 63 list_add(&sa->list, &dump_save_areas);
66 else 64 else
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c
index 6fca0e46464e..c890a5589e59 100644
--- a/arch/s390/kernel/debug.c
+++ b/arch/s390/kernel/debug.c
@@ -1470,7 +1470,7 @@ debug_dflt_header_fn(debug_info_t * id, struct debug_view *view,
1470 except_str = "*"; 1470 except_str = "*";
1471 else 1471 else
1472 except_str = "-"; 1472 except_str = "-";
1473 caller = ((unsigned long) entry->caller) & PSW_ADDR_INSN; 1473 caller = (unsigned long) entry->caller;
1474 rc += sprintf(out_buf, "%02i %011lld:%06lu %1u %1s %02i %p ", 1474 rc += sprintf(out_buf, "%02i %011lld:%06lu %1u %1s %02i %p ",
1475 area, (long long)time_spec.tv_sec, 1475 area, (long long)time_spec.tv_sec,
1476 time_spec.tv_nsec / 1000, level, except_str, 1476 time_spec.tv_nsec / 1000, level, except_str,
diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c
index dc8e20473484..02bd02ff648b 100644
--- a/arch/s390/kernel/dumpstack.c
+++ b/arch/s390/kernel/dumpstack.c
@@ -34,22 +34,21 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
34 unsigned long addr; 34 unsigned long addr;
35 35
36 while (1) { 36 while (1) {
37 sp = sp & PSW_ADDR_INSN;
38 if (sp < low || sp > high - sizeof(*sf)) 37 if (sp < low || sp > high - sizeof(*sf))
39 return sp; 38 return sp;
40 sf = (struct stack_frame *) sp; 39 sf = (struct stack_frame *) sp;
41 addr = sf->gprs[8] & PSW_ADDR_INSN; 40 addr = sf->gprs[8];
42 printk("([<%016lx>] %pSR)\n", addr, (void *)addr); 41 printk("([<%016lx>] %pSR)\n", addr, (void *)addr);
43 /* Follow the backchain. */ 42 /* Follow the backchain. */
44 while (1) { 43 while (1) {
45 low = sp; 44 low = sp;
46 sp = sf->back_chain & PSW_ADDR_INSN; 45 sp = sf->back_chain;
47 if (!sp) 46 if (!sp)
48 break; 47 break;
49 if (sp <= low || sp > high - sizeof(*sf)) 48 if (sp <= low || sp > high - sizeof(*sf))
50 return sp; 49 return sp;
51 sf = (struct stack_frame *) sp; 50 sf = (struct stack_frame *) sp;
52 addr = sf->gprs[8] & PSW_ADDR_INSN; 51 addr = sf->gprs[8];
53 printk(" [<%016lx>] %pSR\n", addr, (void *)addr); 52 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
54 } 53 }
55 /* Zero backchain detected, check for interrupt frame. */ 54 /* Zero backchain detected, check for interrupt frame. */
@@ -57,7 +56,7 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
57 if (sp <= low || sp > high - sizeof(*regs)) 56 if (sp <= low || sp > high - sizeof(*regs))
58 return sp; 57 return sp;
59 regs = (struct pt_regs *) sp; 58 regs = (struct pt_regs *) sp;
60 addr = regs->psw.addr & PSW_ADDR_INSN; 59 addr = regs->psw.addr;
61 printk(" [<%016lx>] %pSR\n", addr, (void *)addr); 60 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
62 low = sp; 61 low = sp;
63 sp = regs->gprs[15]; 62 sp = regs->gprs[15];
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c
index 20a5caf6d981..c55576bbaa1f 100644
--- a/arch/s390/kernel/early.c
+++ b/arch/s390/kernel/early.c
@@ -252,14 +252,14 @@ static void early_pgm_check_handler(void)
252 unsigned long addr; 252 unsigned long addr;
253 253
254 addr = S390_lowcore.program_old_psw.addr; 254 addr = S390_lowcore.program_old_psw.addr;
255 fixup = search_exception_tables(addr & PSW_ADDR_INSN); 255 fixup = search_exception_tables(addr);
256 if (!fixup) 256 if (!fixup)
257 disabled_wait(0); 257 disabled_wait(0);
258 /* Disable low address protection before storing into lowcore. */ 258 /* Disable low address protection before storing into lowcore. */
259 __ctl_store(cr0, 0, 0); 259 __ctl_store(cr0, 0, 0);
260 cr0_new = cr0 & ~(1UL << 28); 260 cr0_new = cr0 & ~(1UL << 28);
261 __ctl_load(cr0_new, 0, 0); 261 __ctl_load(cr0_new, 0, 0);
262 S390_lowcore.program_old_psw.addr = extable_fixup(fixup)|PSW_ADDR_AMODE; 262 S390_lowcore.program_old_psw.addr = extable_fixup(fixup);
263 __ctl_load(cr0, 0, 0); 263 __ctl_load(cr0, 0, 0);
264} 264}
265 265
@@ -268,9 +268,9 @@ static noinline __init void setup_lowcore_early(void)
268 psw_t psw; 268 psw_t psw;
269 269
270 psw.mask = PSW_MASK_BASE | PSW_DEFAULT_KEY | PSW_MASK_EA | PSW_MASK_BA; 270 psw.mask = PSW_MASK_BASE | PSW_DEFAULT_KEY | PSW_MASK_EA | PSW_MASK_BA;
271 psw.addr = PSW_ADDR_AMODE | (unsigned long) s390_base_ext_handler; 271 psw.addr = (unsigned long) s390_base_ext_handler;
272 S390_lowcore.external_new_psw = psw; 272 S390_lowcore.external_new_psw = psw;
273 psw.addr = PSW_ADDR_AMODE | (unsigned long) s390_base_pgm_handler; 273 psw.addr = (unsigned long) s390_base_pgm_handler;
274 S390_lowcore.program_new_psw = psw; 274 S390_lowcore.program_new_psw = psw;
275 s390_base_pgm_handler_fn = early_pgm_check_handler; 275 s390_base_pgm_handler_fn = early_pgm_check_handler;
276} 276}
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index e0eaf11134b4..0f7bfeba6da6 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -203,7 +203,7 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
203 goto out; 203 goto out;
204 if (unlikely(atomic_read(&current->tracing_graph_pause))) 204 if (unlikely(atomic_read(&current->tracing_graph_pause)))
205 goto out; 205 goto out;
206 ip = (ip & PSW_ADDR_INSN) - MCOUNT_INSN_SIZE; 206 ip -= MCOUNT_INSN_SIZE;
207 trace.func = ip; 207 trace.func = ip;
208 trace.depth = current->curr_ret_stack + 1; 208 trace.depth = current->curr_ret_stack + 1;
209 /* Only trace if the calling function expects to. */ 209 /* Only trace if the calling function expects to. */
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
index 0a5a6b661b93..f20abdb5630a 100644
--- a/arch/s390/kernel/ipl.c
+++ b/arch/s390/kernel/ipl.c
@@ -2057,12 +2057,12 @@ void s390_reset_system(void)
2057 /* Set new machine check handler */ 2057 /* Set new machine check handler */
2058 S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT; 2058 S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT;
2059 S390_lowcore.mcck_new_psw.addr = 2059 S390_lowcore.mcck_new_psw.addr =
2060 PSW_ADDR_AMODE | (unsigned long) s390_base_mcck_handler; 2060 (unsigned long) s390_base_mcck_handler;
2061 2061
2062 /* Set new program check handler */ 2062 /* Set new program check handler */
2063 S390_lowcore.program_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT; 2063 S390_lowcore.program_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT;
2064 S390_lowcore.program_new_psw.addr = 2064 S390_lowcore.program_new_psw.addr =
2065 PSW_ADDR_AMODE | (unsigned long) s390_base_pgm_handler; 2065 (unsigned long) s390_base_pgm_handler;
2066 2066
2067 /* 2067 /*
2068 * Clear subchannel ID and number to signal new kernel that no CCW or 2068 * Clear subchannel ID and number to signal new kernel that no CCW or
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c
index 389db56a2208..250f5972536a 100644
--- a/arch/s390/kernel/kprobes.c
+++ b/arch/s390/kernel/kprobes.c
@@ -226,7 +226,7 @@ static void enable_singlestep(struct kprobe_ctlblk *kcb,
226 __ctl_load(per_kprobe, 9, 11); 226 __ctl_load(per_kprobe, 9, 11);
227 regs->psw.mask |= PSW_MASK_PER; 227 regs->psw.mask |= PSW_MASK_PER;
228 regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT); 228 regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
229 regs->psw.addr = ip | PSW_ADDR_AMODE; 229 regs->psw.addr = ip;
230} 230}
231NOKPROBE_SYMBOL(enable_singlestep); 231NOKPROBE_SYMBOL(enable_singlestep);
232 232
@@ -238,7 +238,7 @@ static void disable_singlestep(struct kprobe_ctlblk *kcb,
238 __ctl_load(kcb->kprobe_saved_ctl, 9, 11); 238 __ctl_load(kcb->kprobe_saved_ctl, 9, 11);
239 regs->psw.mask &= ~PSW_MASK_PER; 239 regs->psw.mask &= ~PSW_MASK_PER;
240 regs->psw.mask |= kcb->kprobe_saved_imask; 240 regs->psw.mask |= kcb->kprobe_saved_imask;
241 regs->psw.addr = ip | PSW_ADDR_AMODE; 241 regs->psw.addr = ip;
242} 242}
243NOKPROBE_SYMBOL(disable_singlestep); 243NOKPROBE_SYMBOL(disable_singlestep);
244 244
@@ -310,7 +310,7 @@ static int kprobe_handler(struct pt_regs *regs)
310 */ 310 */
311 preempt_disable(); 311 preempt_disable();
312 kcb = get_kprobe_ctlblk(); 312 kcb = get_kprobe_ctlblk();
313 p = get_kprobe((void *)((regs->psw.addr & PSW_ADDR_INSN) - 2)); 313 p = get_kprobe((void *)(regs->psw.addr - 2));
314 314
315 if (p) { 315 if (p) {
316 if (kprobe_running()) { 316 if (kprobe_running()) {
@@ -460,7 +460,7 @@ static int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
460 break; 460 break;
461 } 461 }
462 462
463 regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE; 463 regs->psw.addr = orig_ret_address;
464 464
465 pop_kprobe(get_kprobe_ctlblk()); 465 pop_kprobe(get_kprobe_ctlblk());
466 kretprobe_hash_unlock(current, &flags); 466 kretprobe_hash_unlock(current, &flags);
@@ -490,7 +490,7 @@ NOKPROBE_SYMBOL(trampoline_probe_handler);
490static void resume_execution(struct kprobe *p, struct pt_regs *regs) 490static void resume_execution(struct kprobe *p, struct pt_regs *regs)
491{ 491{
492 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 492 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
493 unsigned long ip = regs->psw.addr & PSW_ADDR_INSN; 493 unsigned long ip = regs->psw.addr;
494 int fixup = probe_get_fixup_type(p->ainsn.insn); 494 int fixup = probe_get_fixup_type(p->ainsn.insn);
495 495
496 /* Check if the kprobes location is an enabled ftrace caller */ 496 /* Check if the kprobes location is an enabled ftrace caller */
@@ -605,9 +605,9 @@ static int kprobe_trap_handler(struct pt_regs *regs, int trapnr)
605 * In case the user-specified fault handler returned 605 * In case the user-specified fault handler returned
606 * zero, try to fix up. 606 * zero, try to fix up.
607 */ 607 */
608 entry = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); 608 entry = search_exception_tables(regs->psw.addr);
609 if (entry) { 609 if (entry) {
610 regs->psw.addr = extable_fixup(entry) | PSW_ADDR_AMODE; 610 regs->psw.addr = extable_fixup(entry);
611 return 1; 611 return 1;
612 } 612 }
613 613
@@ -683,7 +683,7 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
683 memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs)); 683 memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
684 684
685 /* setup return addr to the jprobe handler routine */ 685 /* setup return addr to the jprobe handler routine */
686 regs->psw.addr = (unsigned long) jp->entry | PSW_ADDR_AMODE; 686 regs->psw.addr = (unsigned long) jp->entry;
687 regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT); 687 regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
688 688
689 /* r15 is the stack pointer */ 689 /* r15 is the stack pointer */
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c
index 61595c1f0a0f..cfcba2dd9bb5 100644
--- a/arch/s390/kernel/perf_event.c
+++ b/arch/s390/kernel/perf_event.c
@@ -74,7 +74,7 @@ static unsigned long guest_is_user_mode(struct pt_regs *regs)
74 74
75static unsigned long instruction_pointer_guest(struct pt_regs *regs) 75static unsigned long instruction_pointer_guest(struct pt_regs *regs)
76{ 76{
77 return sie_block(regs)->gpsw.addr & PSW_ADDR_INSN; 77 return sie_block(regs)->gpsw.addr;
78} 78}
79 79
80unsigned long perf_instruction_pointer(struct pt_regs *regs) 80unsigned long perf_instruction_pointer(struct pt_regs *regs)
@@ -231,29 +231,27 @@ static unsigned long __store_trace(struct perf_callchain_entry *entry,
231 struct pt_regs *regs; 231 struct pt_regs *regs;
232 232
233 while (1) { 233 while (1) {
234 sp = sp & PSW_ADDR_INSN;
235 if (sp < low || sp > high - sizeof(*sf)) 234 if (sp < low || sp > high - sizeof(*sf))
236 return sp; 235 return sp;
237 sf = (struct stack_frame *) sp; 236 sf = (struct stack_frame *) sp;
238 perf_callchain_store(entry, sf->gprs[8] & PSW_ADDR_INSN); 237 perf_callchain_store(entry, sf->gprs[8]);
239 /* Follow the backchain. */ 238 /* Follow the backchain. */
240 while (1) { 239 while (1) {
241 low = sp; 240 low = sp;
242 sp = sf->back_chain & PSW_ADDR_INSN; 241 sp = sf->back_chain;
243 if (!sp) 242 if (!sp)
244 break; 243 break;
245 if (sp <= low || sp > high - sizeof(*sf)) 244 if (sp <= low || sp > high - sizeof(*sf))
246 return sp; 245 return sp;
247 sf = (struct stack_frame *) sp; 246 sf = (struct stack_frame *) sp;
248 perf_callchain_store(entry, 247 perf_callchain_store(entry, sf->gprs[8]);
249 sf->gprs[8] & PSW_ADDR_INSN);
250 } 248 }
251 /* Zero backchain detected, check for interrupt frame. */ 249 /* Zero backchain detected, check for interrupt frame. */
252 sp = (unsigned long) (sf + 1); 250 sp = (unsigned long) (sf + 1);
253 if (sp <= low || sp > high - sizeof(*regs)) 251 if (sp <= low || sp > high - sizeof(*regs))
254 return sp; 252 return sp;
255 regs = (struct pt_regs *) sp; 253 regs = (struct pt_regs *) sp;
256 perf_callchain_store(entry, sf->gprs[8] & PSW_ADDR_INSN); 254 perf_callchain_store(entry, sf->gprs[8]);
257 low = sp; 255 low = sp;
258 sp = regs->gprs[15]; 256 sp = regs->gprs[15];
259 } 257 }
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index 114ee8b96f17..2bba7df4ac51 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -56,10 +56,10 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
56 return 0; 56 return 0;
57 low = task_stack_page(tsk); 57 low = task_stack_page(tsk);
58 high = (struct stack_frame *) task_pt_regs(tsk); 58 high = (struct stack_frame *) task_pt_regs(tsk);
59 sf = (struct stack_frame *) (tsk->thread.ksp & PSW_ADDR_INSN); 59 sf = (struct stack_frame *) tsk->thread.ksp;
60 if (sf <= low || sf > high) 60 if (sf <= low || sf > high)
61 return 0; 61 return 0;
62 sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); 62 sf = (struct stack_frame *) sf->back_chain;
63 if (sf <= low || sf > high) 63 if (sf <= low || sf > high)
64 return 0; 64 return 0;
65 return sf->gprs[8]; 65 return sf->gprs[8];
@@ -154,7 +154,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
154 memset(&frame->childregs, 0, sizeof(struct pt_regs)); 154 memset(&frame->childregs, 0, sizeof(struct pt_regs));
155 frame->childregs.psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT | 155 frame->childregs.psw.mask = PSW_KERNEL_BITS | PSW_MASK_DAT |
156 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK; 156 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
157 frame->childregs.psw.addr = PSW_ADDR_AMODE | 157 frame->childregs.psw.addr =
158 (unsigned long) kernel_thread_starter; 158 (unsigned long) kernel_thread_starter;
159 frame->childregs.gprs[9] = new_stackp; /* function */ 159 frame->childregs.gprs[9] = new_stackp; /* function */
160 frame->childregs.gprs[10] = arg; 160 frame->childregs.gprs[10] = arg;
@@ -220,14 +220,14 @@ unsigned long get_wchan(struct task_struct *p)
220 return 0; 220 return 0;
221 low = task_stack_page(p); 221 low = task_stack_page(p);
222 high = (struct stack_frame *) task_pt_regs(p); 222 high = (struct stack_frame *) task_pt_regs(p);
223 sf = (struct stack_frame *) (p->thread.ksp & PSW_ADDR_INSN); 223 sf = (struct stack_frame *) p->thread.ksp;
224 if (sf <= low || sf > high) 224 if (sf <= low || sf > high)
225 return 0; 225 return 0;
226 for (count = 0; count < 16; count++) { 226 for (count = 0; count < 16; count++) {
227 sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); 227 sf = (struct stack_frame *) sf->back_chain;
228 if (sf <= low || sf > high) 228 if (sf <= low || sf > high)
229 return 0; 229 return 0;
230 return_address = sf->gprs[8] & PSW_ADDR_INSN; 230 return_address = sf->gprs[8];
231 if (!in_sched_functions(return_address)) 231 if (!in_sched_functions(return_address))
232 return return_address; 232 return return_address;
233 } 233 }
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
index 01c37b36caf9..49b1c13bf6c9 100644
--- a/arch/s390/kernel/ptrace.c
+++ b/arch/s390/kernel/ptrace.c
@@ -84,7 +84,7 @@ void update_cr_regs(struct task_struct *task)
84 if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP)) 84 if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP))
85 new.control |= PER_EVENT_IFETCH; 85 new.control |= PER_EVENT_IFETCH;
86 new.start = 0; 86 new.start = 0;
87 new.end = PSW_ADDR_INSN; 87 new.end = -1UL;
88 } 88 }
89 89
90 /* Take care of the PER enablement bit in the PSW. */ 90 /* Take care of the PER enablement bit in the PSW. */
@@ -148,7 +148,7 @@ static inline unsigned long __peek_user_per(struct task_struct *child,
148 else if (addr == (addr_t) &dummy->cr11) 148 else if (addr == (addr_t) &dummy->cr11)
149 /* End address of the active per set. */ 149 /* End address of the active per set. */
150 return test_thread_flag(TIF_SINGLE_STEP) ? 150 return test_thread_flag(TIF_SINGLE_STEP) ?
151 PSW_ADDR_INSN : child->thread.per_user.end; 151 -1UL : child->thread.per_user.end;
152 else if (addr == (addr_t) &dummy->bits) 152 else if (addr == (addr_t) &dummy->bits)
153 /* Single-step bit. */ 153 /* Single-step bit. */
154 return test_thread_flag(TIF_SINGLE_STEP) ? 154 return test_thread_flag(TIF_SINGLE_STEP) ?
@@ -495,8 +495,6 @@ long arch_ptrace(struct task_struct *child, long request,
495 } 495 }
496 return 0; 496 return 0;
497 default: 497 default:
498 /* Removing high order bit from addr (only for 31 bit). */
499 addr &= PSW_ADDR_INSN;
500 return ptrace_request(child, request, addr, data); 498 return ptrace_request(child, request, addr, data);
501 } 499 }
502} 500}
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index c6878fbbcf13..9220db5c996a 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -301,25 +301,21 @@ static void __init setup_lowcore(void)
301 BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * 4096); 301 BUILD_BUG_ON(sizeof(struct lowcore) != LC_PAGES * 4096);
302 lc = __alloc_bootmem_low(LC_PAGES * PAGE_SIZE, LC_PAGES * PAGE_SIZE, 0); 302 lc = __alloc_bootmem_low(LC_PAGES * PAGE_SIZE, LC_PAGES * PAGE_SIZE, 0);
303 lc->restart_psw.mask = PSW_KERNEL_BITS; 303 lc->restart_psw.mask = PSW_KERNEL_BITS;
304 lc->restart_psw.addr = 304 lc->restart_psw.addr = (unsigned long) restart_int_handler;
305 PSW_ADDR_AMODE | (unsigned long) restart_int_handler;
306 lc->external_new_psw.mask = PSW_KERNEL_BITS | 305 lc->external_new_psw.mask = PSW_KERNEL_BITS |
307 PSW_MASK_DAT | PSW_MASK_MCHECK; 306 PSW_MASK_DAT | PSW_MASK_MCHECK;
308 lc->external_new_psw.addr = 307 lc->external_new_psw.addr = (unsigned long) ext_int_handler;
309 PSW_ADDR_AMODE | (unsigned long) ext_int_handler;
310 lc->svc_new_psw.mask = PSW_KERNEL_BITS | 308 lc->svc_new_psw.mask = PSW_KERNEL_BITS |
311 PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK; 309 PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
312 lc->svc_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) system_call; 310 lc->svc_new_psw.addr = (unsigned long) system_call;
313 lc->program_new_psw.mask = PSW_KERNEL_BITS | 311 lc->program_new_psw.mask = PSW_KERNEL_BITS |
314 PSW_MASK_DAT | PSW_MASK_MCHECK; 312 PSW_MASK_DAT | PSW_MASK_MCHECK;
315 lc->program_new_psw.addr = 313 lc->program_new_psw.addr = (unsigned long) pgm_check_handler;
316 PSW_ADDR_AMODE | (unsigned long) pgm_check_handler;
317 lc->mcck_new_psw.mask = PSW_KERNEL_BITS; 314 lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
318 lc->mcck_new_psw.addr = 315 lc->mcck_new_psw.addr = (unsigned long) mcck_int_handler;
319 PSW_ADDR_AMODE | (unsigned long) mcck_int_handler;
320 lc->io_new_psw.mask = PSW_KERNEL_BITS | 316 lc->io_new_psw.mask = PSW_KERNEL_BITS |
321 PSW_MASK_DAT | PSW_MASK_MCHECK; 317 PSW_MASK_DAT | PSW_MASK_MCHECK;
322 lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler; 318 lc->io_new_psw.addr = (unsigned long) io_int_handler;
323 lc->clock_comparator = -1ULL; 319 lc->clock_comparator = -1ULL;
324 lc->kernel_stack = ((unsigned long) &init_thread_union) 320 lc->kernel_stack = ((unsigned long) &init_thread_union)
325 + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); 321 + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
index 028cc46cb82a..d82562cf0a0e 100644
--- a/arch/s390/kernel/signal.c
+++ b/arch/s390/kernel/signal.c
@@ -331,13 +331,13 @@ static int setup_frame(int sig, struct k_sigaction *ka,
331 /* Set up to return from userspace. If provided, use a stub 331 /* Set up to return from userspace. If provided, use a stub
332 already in userspace. */ 332 already in userspace. */
333 if (ka->sa.sa_flags & SA_RESTORER) { 333 if (ka->sa.sa_flags & SA_RESTORER) {
334 restorer = (unsigned long) ka->sa.sa_restorer | PSW_ADDR_AMODE; 334 restorer = (unsigned long) ka->sa.sa_restorer;
335 } else { 335 } else {
336 /* Signal frame without vector registers are short ! */ 336 /* Signal frame without vector registers are short ! */
337 __u16 __user *svc = (void __user *) frame + frame_size - 2; 337 __u16 __user *svc = (void __user *) frame + frame_size - 2;
338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc)) 338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc))
339 return -EFAULT; 339 return -EFAULT;
340 restorer = (unsigned long) svc | PSW_ADDR_AMODE; 340 restorer = (unsigned long) svc;
341 } 341 }
342 342
343 /* Set up registers for signal handler */ 343 /* Set up registers for signal handler */
@@ -347,7 +347,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
347 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | 347 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
348 (PSW_USER_BITS & PSW_MASK_ASC) | 348 (PSW_USER_BITS & PSW_MASK_ASC) |
349 (regs->psw.mask & ~PSW_MASK_ASC); 349 (regs->psw.mask & ~PSW_MASK_ASC);
350 regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE; 350 regs->psw.addr = (unsigned long) ka->sa.sa_handler;
351 351
352 regs->gprs[2] = sig; 352 regs->gprs[2] = sig;
353 regs->gprs[3] = (unsigned long) &frame->sc; 353 regs->gprs[3] = (unsigned long) &frame->sc;
@@ -394,13 +394,12 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
394 /* Set up to return from userspace. If provided, use a stub 394 /* Set up to return from userspace. If provided, use a stub
395 already in userspace. */ 395 already in userspace. */
396 if (ksig->ka.sa.sa_flags & SA_RESTORER) { 396 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
397 restorer = (unsigned long) 397 restorer = (unsigned long) ksig->ka.sa.sa_restorer;
398 ksig->ka.sa.sa_restorer | PSW_ADDR_AMODE;
399 } else { 398 } else {
400 __u16 __user *svc = &frame->svc_insn; 399 __u16 __user *svc = &frame->svc_insn;
401 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc)) 400 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc))
402 return -EFAULT; 401 return -EFAULT;
403 restorer = (unsigned long) svc | PSW_ADDR_AMODE; 402 restorer = (unsigned long) svc;
404 } 403 }
405 404
406 /* Create siginfo on the signal stack */ 405 /* Create siginfo on the signal stack */
@@ -426,7 +425,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
426 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA | 425 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
427 (PSW_USER_BITS & PSW_MASK_ASC) | 426 (PSW_USER_BITS & PSW_MASK_ASC) |
428 (regs->psw.mask & ~PSW_MASK_ASC); 427 (regs->psw.mask & ~PSW_MASK_ASC);
429 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE; 428 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler;
430 429
431 regs->gprs[2] = ksig->sig; 430 regs->gprs[2] = ksig->sig;
432 regs->gprs[3] = (unsigned long) &frame->info; 431 regs->gprs[3] = (unsigned long) &frame->info;
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index a13468b9a913..3c65a8eae34d 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -623,8 +623,6 @@ void __init smp_save_dump_cpus(void)
623 return; 623 return;
624 /* Allocate a page as dumping area for the store status sigps */ 624 /* Allocate a page as dumping area for the store status sigps */
625 page = memblock_alloc_base(PAGE_SIZE, PAGE_SIZE, 1UL << 31); 625 page = memblock_alloc_base(PAGE_SIZE, PAGE_SIZE, 1UL << 31);
626 if (!page)
627 panic("could not allocate memory for save area\n");
628 /* Set multi-threading state to the previous system. */ 626 /* Set multi-threading state to the previous system. */
629 pcpu_set_smt(sclp.mtid_prev); 627 pcpu_set_smt(sclp.mtid_prev);
630 boot_cpu_addr = stap(); 628 boot_cpu_addr = stap();
diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c
index 1785cd82253c..5acba3cb7220 100644
--- a/arch/s390/kernel/stacktrace.c
+++ b/arch/s390/kernel/stacktrace.c
@@ -21,12 +21,11 @@ static unsigned long save_context_stack(struct stack_trace *trace,
21 unsigned long addr; 21 unsigned long addr;
22 22
23 while(1) { 23 while(1) {
24 sp &= PSW_ADDR_INSN;
25 if (sp < low || sp > high) 24 if (sp < low || sp > high)
26 return sp; 25 return sp;
27 sf = (struct stack_frame *)sp; 26 sf = (struct stack_frame *)sp;
28 while(1) { 27 while(1) {
29 addr = sf->gprs[8] & PSW_ADDR_INSN; 28 addr = sf->gprs[8];
30 if (!trace->skip) 29 if (!trace->skip)
31 trace->entries[trace->nr_entries++] = addr; 30 trace->entries[trace->nr_entries++] = addr;
32 else 31 else
@@ -34,7 +33,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
34 if (trace->nr_entries >= trace->max_entries) 33 if (trace->nr_entries >= trace->max_entries)
35 return sp; 34 return sp;
36 low = sp; 35 low = sp;
37 sp = sf->back_chain & PSW_ADDR_INSN; 36 sp = sf->back_chain;
38 if (!sp) 37 if (!sp)
39 break; 38 break;
40 if (sp <= low || sp > high - sizeof(*sf)) 39 if (sp <= low || sp > high - sizeof(*sf))
@@ -46,7 +45,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
46 if (sp <= low || sp > high - sizeof(*regs)) 45 if (sp <= low || sp > high - sizeof(*regs))
47 return sp; 46 return sp;
48 regs = (struct pt_regs *)sp; 47 regs = (struct pt_regs *)sp;
49 addr = regs->psw.addr & PSW_ADDR_INSN; 48 addr = regs->psw.addr;
50 if (savesched || !in_sched_functions(addr)) { 49 if (savesched || !in_sched_functions(addr)) {
51 if (!trace->skip) 50 if (!trace->skip)
52 trace->entries[trace->nr_entries++] = addr; 51 trace->entries[trace->nr_entries++] = addr;
@@ -65,7 +64,7 @@ void save_stack_trace(struct stack_trace *trace)
65 register unsigned long sp asm ("15"); 64 register unsigned long sp asm ("15");
66 unsigned long orig_sp, new_sp; 65 unsigned long orig_sp, new_sp;
67 66
68 orig_sp = sp & PSW_ADDR_INSN; 67 orig_sp = sp;
69 new_sp = save_context_stack(trace, orig_sp, 68 new_sp = save_context_stack(trace, orig_sp,
70 S390_lowcore.panic_stack - PAGE_SIZE, 69 S390_lowcore.panic_stack - PAGE_SIZE,
71 S390_lowcore.panic_stack, 1); 70 S390_lowcore.panic_stack, 1);
@@ -86,7 +85,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
86{ 85{
87 unsigned long sp, low, high; 86 unsigned long sp, low, high;
88 87
89 sp = tsk->thread.ksp & PSW_ADDR_INSN; 88 sp = tsk->thread.ksp;
90 low = (unsigned long) task_stack_page(tsk); 89 low = (unsigned long) task_stack_page(tsk);
91 high = (unsigned long) task_pt_regs(tsk); 90 high = (unsigned long) task_pt_regs(tsk);
92 save_context_stack(trace, sp, low, high, 0); 91 save_context_stack(trace, sp, low, high, 0);
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index 5378c3ea1b98..293d8b98fd52 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -383,3 +383,4 @@ SYSCALL(sys_recvfrom,compat_sys_recvfrom)
383SYSCALL(sys_recvmsg,compat_sys_recvmsg) 383SYSCALL(sys_recvmsg,compat_sys_recvmsg)
384SYSCALL(sys_shutdown,sys_shutdown) 384SYSCALL(sys_shutdown,sys_shutdown)
385SYSCALL(sys_mlock2,compat_sys_mlock2) 385SYSCALL(sys_mlock2,compat_sys_mlock2)
386SYSCALL(sys_copy_file_range,compat_sys_copy_file_range) /* 375 */
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
index d69d648759c9..017eb03daee2 100644
--- a/arch/s390/kernel/traps.c
+++ b/arch/s390/kernel/traps.c
@@ -32,8 +32,7 @@ static inline void __user *get_trap_ip(struct pt_regs *regs)
32 address = *(unsigned long *)(current->thread.trap_tdb + 24); 32 address = *(unsigned long *)(current->thread.trap_tdb + 24);
33 else 33 else
34 address = regs->psw.addr; 34 address = regs->psw.addr;
35 return (void __user *) 35 return (void __user *) (address - (regs->int_code >> 16));
36 ((address - (regs->int_code >> 16)) & PSW_ADDR_INSN);
37} 36}
38 37
39static inline void report_user_fault(struct pt_regs *regs, int signr) 38static inline void report_user_fault(struct pt_regs *regs, int signr)
@@ -46,7 +45,7 @@ static inline void report_user_fault(struct pt_regs *regs, int signr)
46 return; 45 return;
47 printk("User process fault: interruption code %04x ilc:%d ", 46 printk("User process fault: interruption code %04x ilc:%d ",
48 regs->int_code & 0xffff, regs->int_code >> 17); 47 regs->int_code & 0xffff, regs->int_code >> 17);
49 print_vma_addr("in ", regs->psw.addr & PSW_ADDR_INSN); 48 print_vma_addr("in ", regs->psw.addr);
50 printk("\n"); 49 printk("\n");
51 show_regs(regs); 50 show_regs(regs);
52} 51}
@@ -69,13 +68,13 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str)
69 report_user_fault(regs, si_signo); 68 report_user_fault(regs, si_signo);
70 } else { 69 } else {
71 const struct exception_table_entry *fixup; 70 const struct exception_table_entry *fixup;
72 fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); 71 fixup = search_exception_tables(regs->psw.addr);
73 if (fixup) 72 if (fixup)
74 regs->psw.addr = extable_fixup(fixup) | PSW_ADDR_AMODE; 73 regs->psw.addr = extable_fixup(fixup);
75 else { 74 else {
76 enum bug_trap_type btt; 75 enum bug_trap_type btt;
77 76
78 btt = report_bug(regs->psw.addr & PSW_ADDR_INSN, regs); 77 btt = report_bug(regs->psw.addr, regs);
79 if (btt == BUG_TRAP_TYPE_WARN) 78 if (btt == BUG_TRAP_TYPE_WARN)
80 return; 79 return;
81 die(regs, str); 80 die(regs, str);
diff --git a/arch/s390/kvm/guestdbg.c b/arch/s390/kvm/guestdbg.c
index 47518a324d75..d697312ce9ee 100644
--- a/arch/s390/kvm/guestdbg.c
+++ b/arch/s390/kvm/guestdbg.c
@@ -116,7 +116,7 @@ static void enable_all_hw_wp(struct kvm_vcpu *vcpu)
116 if (*cr9 & PER_EVENT_STORE && *cr9 & PER_CONTROL_ALTERATION) { 116 if (*cr9 & PER_EVENT_STORE && *cr9 & PER_CONTROL_ALTERATION) {
117 *cr9 &= ~PER_CONTROL_ALTERATION; 117 *cr9 &= ~PER_CONTROL_ALTERATION;
118 *cr10 = 0; 118 *cr10 = 0;
119 *cr11 = PSW_ADDR_INSN; 119 *cr11 = -1UL;
120 } else { 120 } else {
121 *cr9 &= ~PER_CONTROL_ALTERATION; 121 *cr9 &= ~PER_CONTROL_ALTERATION;
122 *cr9 |= PER_EVENT_STORE; 122 *cr9 |= PER_EVENT_STORE;
@@ -159,7 +159,7 @@ void kvm_s390_patch_guest_per_regs(struct kvm_vcpu *vcpu)
159 vcpu->arch.sie_block->gcr[0] &= ~0x800ul; 159 vcpu->arch.sie_block->gcr[0] &= ~0x800ul;
160 vcpu->arch.sie_block->gcr[9] |= PER_EVENT_IFETCH; 160 vcpu->arch.sie_block->gcr[9] |= PER_EVENT_IFETCH;
161 vcpu->arch.sie_block->gcr[10] = 0; 161 vcpu->arch.sie_block->gcr[10] = 0;
162 vcpu->arch.sie_block->gcr[11] = PSW_ADDR_INSN; 162 vcpu->arch.sie_block->gcr[11] = -1UL;
163 } 163 }
164 164
165 if (guestdbg_hw_bp_enabled(vcpu)) { 165 if (guestdbg_hw_bp_enabled(vcpu)) {
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index 1b903f6ad54a..791a4146052c 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -228,7 +228,7 @@ static inline void report_user_fault(struct pt_regs *regs, long signr)
228 return; 228 return;
229 printk(KERN_ALERT "User process fault: interruption code %04x ilc:%d ", 229 printk(KERN_ALERT "User process fault: interruption code %04x ilc:%d ",
230 regs->int_code & 0xffff, regs->int_code >> 17); 230 regs->int_code & 0xffff, regs->int_code >> 17);
231 print_vma_addr(KERN_CONT "in ", regs->psw.addr & PSW_ADDR_INSN); 231 print_vma_addr(KERN_CONT "in ", regs->psw.addr);
232 printk(KERN_CONT "\n"); 232 printk(KERN_CONT "\n");
233 printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n", 233 printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n",
234 regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long); 234 regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long);
@@ -256,9 +256,9 @@ static noinline void do_no_context(struct pt_regs *regs)
256 const struct exception_table_entry *fixup; 256 const struct exception_table_entry *fixup;
257 257
258 /* Are we prepared to handle this kernel fault? */ 258 /* Are we prepared to handle this kernel fault? */
259 fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); 259 fixup = search_exception_tables(regs->psw.addr);
260 if (fixup) { 260 if (fixup) {
261 regs->psw.addr = extable_fixup(fixup) | PSW_ADDR_AMODE; 261 regs->psw.addr = extable_fixup(fixup);
262 return; 262 return;
263 } 263 }
264 264
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c
index c722400c7697..73e290337092 100644
--- a/arch/s390/mm/init.c
+++ b/arch/s390/mm/init.c
@@ -98,7 +98,7 @@ void __init paging_init(void)
98 __ctl_load(S390_lowcore.kernel_asce, 1, 1); 98 __ctl_load(S390_lowcore.kernel_asce, 1, 1);
99 __ctl_load(S390_lowcore.kernel_asce, 7, 7); 99 __ctl_load(S390_lowcore.kernel_asce, 7, 7);
100 __ctl_load(S390_lowcore.kernel_asce, 13, 13); 100 __ctl_load(S390_lowcore.kernel_asce, 13, 13);
101 arch_local_irq_restore(4UL << (BITS_PER_LONG - 8)); 101 __arch_local_irq_stosm(0x04);
102 102
103 sparse_memory_present_with_active_regions(MAX_NUMNODES); 103 sparse_memory_present_with_active_regions(MAX_NUMNODES);
104 sparse_init(); 104 sparse_init();
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c
index ea01477b4aa6..45c4daa49930 100644
--- a/arch/s390/mm/mmap.c
+++ b/arch/s390/mm/mmap.c
@@ -169,12 +169,12 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
169 169
170int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) 170int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
171{ 171{
172 if (is_compat_task() || (TASK_SIZE >= (1UL << 53))) 172 if (is_compat_task() || TASK_SIZE >= TASK_MAX_SIZE)
173 return 0; 173 return 0;
174 if (!(flags & MAP_FIXED)) 174 if (!(flags & MAP_FIXED))
175 addr = 0; 175 addr = 0;
176 if ((addr + len) >= TASK_SIZE) 176 if ((addr + len) >= TASK_SIZE)
177 return crst_table_upgrade(current->mm, 1UL << 53); 177 return crst_table_upgrade(current->mm, TASK_MAX_SIZE);
178 return 0; 178 return 0;
179} 179}
180 180
@@ -189,9 +189,9 @@ s390_get_unmapped_area(struct file *filp, unsigned long addr,
189 area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); 189 area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
190 if (!(area & ~PAGE_MASK)) 190 if (!(area & ~PAGE_MASK))
191 return area; 191 return area;
192 if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { 192 if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < TASK_MAX_SIZE) {
193 /* Upgrade the page table to 4 levels and retry. */ 193 /* Upgrade the page table to 4 levels and retry. */
194 rc = crst_table_upgrade(mm, 1UL << 53); 194 rc = crst_table_upgrade(mm, TASK_MAX_SIZE);
195 if (rc) 195 if (rc)
196 return (unsigned long) rc; 196 return (unsigned long) rc;
197 area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); 197 area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
@@ -211,9 +211,9 @@ s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr,
211 area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); 211 area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
212 if (!(area & ~PAGE_MASK)) 212 if (!(area & ~PAGE_MASK))
213 return area; 213 return area;
214 if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { 214 if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < TASK_MAX_SIZE) {
215 /* Upgrade the page table to 4 levels and retry. */ 215 /* Upgrade the page table to 4 levels and retry. */
216 rc = crst_table_upgrade(mm, 1UL << 53); 216 rc = crst_table_upgrade(mm, TASK_MAX_SIZE);
217 if (rc) 217 if (rc)
218 return (unsigned long) rc; 218 return (unsigned long) rc;
219 area = arch_get_unmapped_area_topdown(filp, addr, len, 219 area = arch_get_unmapped_area_topdown(filp, addr, len,
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index a809fa8e6f8b..5109827883ac 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -55,7 +55,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long limit)
55 unsigned long entry; 55 unsigned long entry;
56 int flush; 56 int flush;
57 57
58 BUG_ON(limit > (1UL << 53)); 58 BUG_ON(limit > TASK_MAX_SIZE);
59 flush = 0; 59 flush = 0;
60repeat: 60repeat:
61 table = crst_table_alloc(mm); 61 table = crst_table_alloc(mm);
diff --git a/arch/s390/numa/numa.c b/arch/s390/numa/numa.c
index 43f32ce60aa3..2794845061c6 100644
--- a/arch/s390/numa/numa.c
+++ b/arch/s390/numa/numa.c
@@ -57,9 +57,7 @@ static __init pg_data_t *alloc_node_data(void)
57{ 57{
58 pg_data_t *res; 58 pg_data_t *res;
59 59
60 res = (pg_data_t *) memblock_alloc(sizeof(pg_data_t), 1); 60 res = (pg_data_t *) memblock_alloc(sizeof(pg_data_t), 8);
61 if (!res)
62 panic("Could not allocate memory for node data!\n");
63 memset(res, 0, sizeof(pg_data_t)); 61 memset(res, 0, sizeof(pg_data_t));
64 return res; 62 return res;
65} 63}
@@ -162,7 +160,7 @@ static int __init numa_init_late(void)
162 register_one_node(nid); 160 register_one_node(nid);
163 return 0; 161 return 0;
164} 162}
165device_initcall(numa_init_late); 163arch_initcall(numa_init_late);
166 164
167static int __init parse_debug(char *parm) 165static int __init parse_debug(char *parm)
168{ 166{
diff --git a/arch/s390/oprofile/backtrace.c b/arch/s390/oprofile/backtrace.c
index 8a6811b2cdb9..fe0bfe370c45 100644
--- a/arch/s390/oprofile/backtrace.c
+++ b/arch/s390/oprofile/backtrace.c
@@ -16,24 +16,23 @@ __show_trace(unsigned int *depth, unsigned long sp,
16 struct pt_regs *regs; 16 struct pt_regs *regs;
17 17
18 while (*depth) { 18 while (*depth) {
19 sp = sp & PSW_ADDR_INSN;
20 if (sp < low || sp > high - sizeof(*sf)) 19 if (sp < low || sp > high - sizeof(*sf))
21 return sp; 20 return sp;
22 sf = (struct stack_frame *) sp; 21 sf = (struct stack_frame *) sp;
23 (*depth)--; 22 (*depth)--;
24 oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); 23 oprofile_add_trace(sf->gprs[8]);
25 24
26 /* Follow the backchain. */ 25 /* Follow the backchain. */
27 while (*depth) { 26 while (*depth) {
28 low = sp; 27 low = sp;
29 sp = sf->back_chain & PSW_ADDR_INSN; 28 sp = sf->back_chain;
30 if (!sp) 29 if (!sp)
31 break; 30 break;
32 if (sp <= low || sp > high - sizeof(*sf)) 31 if (sp <= low || sp > high - sizeof(*sf))
33 return sp; 32 return sp;
34 sf = (struct stack_frame *) sp; 33 sf = (struct stack_frame *) sp;
35 (*depth)--; 34 (*depth)--;
36 oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); 35 oprofile_add_trace(sf->gprs[8]);
37 36
38 } 37 }
39 38
@@ -46,7 +45,7 @@ __show_trace(unsigned int *depth, unsigned long sp,
46 return sp; 45 return sp;
47 regs = (struct pt_regs *) sp; 46 regs = (struct pt_regs *) sp;
48 (*depth)--; 47 (*depth)--;
49 oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); 48 oprofile_add_trace(sf->gprs[8]);
50 low = sp; 49 low = sp;
51 sp = regs->gprs[15]; 50 sp = regs->gprs[15];
52 } 51 }
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 11d4f277e9f6..8f19c8f9d660 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -68,9 +68,12 @@ static struct airq_struct zpci_airq = {
68 .isc = PCI_ISC, 68 .isc = PCI_ISC,
69}; 69};
70 70
71/* I/O Map */ 71#define ZPCI_IOMAP_ENTRIES \
72 min(((unsigned long) CONFIG_PCI_NR_FUNCTIONS * PCI_BAR_COUNT), \
73 ZPCI_IOMAP_MAX_ENTRIES)
74
72static DEFINE_SPINLOCK(zpci_iomap_lock); 75static DEFINE_SPINLOCK(zpci_iomap_lock);
73static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); 76static unsigned long *zpci_iomap_bitmap;
74struct zpci_iomap_entry *zpci_iomap_start; 77struct zpci_iomap_entry *zpci_iomap_start;
75EXPORT_SYMBOL_GPL(zpci_iomap_start); 78EXPORT_SYMBOL_GPL(zpci_iomap_start);
76 79
@@ -265,27 +268,20 @@ void __iomem *pci_iomap_range(struct pci_dev *pdev,
265 unsigned long max) 268 unsigned long max)
266{ 269{
267 struct zpci_dev *zdev = to_zpci(pdev); 270 struct zpci_dev *zdev = to_zpci(pdev);
268 u64 addr;
269 int idx; 271 int idx;
270 272
271 if ((bar & 7) != bar) 273 if (!pci_resource_len(pdev, bar))
272 return NULL; 274 return NULL;
273 275
274 idx = zdev->bars[bar].map_idx; 276 idx = zdev->bars[bar].map_idx;
275 spin_lock(&zpci_iomap_lock); 277 spin_lock(&zpci_iomap_lock);
276 if (zpci_iomap_start[idx].count++) {
277 BUG_ON(zpci_iomap_start[idx].fh != zdev->fh ||
278 zpci_iomap_start[idx].bar != bar);
279 } else {
280 zpci_iomap_start[idx].fh = zdev->fh;
281 zpci_iomap_start[idx].bar = bar;
282 }
283 /* Detect overrun */ 278 /* Detect overrun */
284 BUG_ON(!zpci_iomap_start[idx].count); 279 WARN_ON(!++zpci_iomap_start[idx].count);
280 zpci_iomap_start[idx].fh = zdev->fh;
281 zpci_iomap_start[idx].bar = bar;
285 spin_unlock(&zpci_iomap_lock); 282 spin_unlock(&zpci_iomap_lock);
286 283
287 addr = ZPCI_IOMAP_ADDR_BASE | ((u64) idx << 48); 284 return (void __iomem *) ZPCI_ADDR(idx) + offset;
288 return (void __iomem *) addr + offset;
289} 285}
290EXPORT_SYMBOL(pci_iomap_range); 286EXPORT_SYMBOL(pci_iomap_range);
291 287
@@ -297,12 +293,11 @@ EXPORT_SYMBOL(pci_iomap);
297 293
298void pci_iounmap(struct pci_dev *pdev, void __iomem *addr) 294void pci_iounmap(struct pci_dev *pdev, void __iomem *addr)
299{ 295{
300 unsigned int idx; 296 unsigned int idx = ZPCI_IDX(addr);
301 297
302 idx = (((__force u64) addr) & ~ZPCI_IOMAP_ADDR_BASE) >> 48;
303 spin_lock(&zpci_iomap_lock); 298 spin_lock(&zpci_iomap_lock);
304 /* Detect underrun */ 299 /* Detect underrun */
305 BUG_ON(!zpci_iomap_start[idx].count); 300 WARN_ON(!zpci_iomap_start[idx].count);
306 if (!--zpci_iomap_start[idx].count) { 301 if (!--zpci_iomap_start[idx].count) {
307 zpci_iomap_start[idx].fh = 0; 302 zpci_iomap_start[idx].fh = 0;
308 zpci_iomap_start[idx].bar = 0; 303 zpci_iomap_start[idx].bar = 0;
@@ -544,15 +539,15 @@ static void zpci_irq_exit(void)
544 539
545static int zpci_alloc_iomap(struct zpci_dev *zdev) 540static int zpci_alloc_iomap(struct zpci_dev *zdev)
546{ 541{
547 int entry; 542 unsigned long entry;
548 543
549 spin_lock(&zpci_iomap_lock); 544 spin_lock(&zpci_iomap_lock);
550 entry = find_first_zero_bit(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); 545 entry = find_first_zero_bit(zpci_iomap_bitmap, ZPCI_IOMAP_ENTRIES);
551 if (entry == ZPCI_IOMAP_MAX_ENTRIES) { 546 if (entry == ZPCI_IOMAP_ENTRIES) {
552 spin_unlock(&zpci_iomap_lock); 547 spin_unlock(&zpci_iomap_lock);
553 return -ENOSPC; 548 return -ENOSPC;
554 } 549 }
555 set_bit(entry, zpci_iomap); 550 set_bit(entry, zpci_iomap_bitmap);
556 spin_unlock(&zpci_iomap_lock); 551 spin_unlock(&zpci_iomap_lock);
557 return entry; 552 return entry;
558} 553}
@@ -561,7 +556,7 @@ static void zpci_free_iomap(struct zpci_dev *zdev, int entry)
561{ 556{
562 spin_lock(&zpci_iomap_lock); 557 spin_lock(&zpci_iomap_lock);
563 memset(&zpci_iomap_start[entry], 0, sizeof(struct zpci_iomap_entry)); 558 memset(&zpci_iomap_start[entry], 0, sizeof(struct zpci_iomap_entry));
564 clear_bit(entry, zpci_iomap); 559 clear_bit(entry, zpci_iomap_bitmap);
565 spin_unlock(&zpci_iomap_lock); 560 spin_unlock(&zpci_iomap_lock);
566} 561}
567 562
@@ -611,8 +606,7 @@ static int zpci_setup_bus_resources(struct zpci_dev *zdev,
611 if (zdev->bars[i].val & 4) 606 if (zdev->bars[i].val & 4)
612 flags |= IORESOURCE_MEM_64; 607 flags |= IORESOURCE_MEM_64;
613 608
614 addr = ZPCI_IOMAP_ADDR_BASE + ((u64) entry << 48); 609 addr = ZPCI_ADDR(entry);
615
616 size = 1UL << zdev->bars[i].size; 610 size = 1UL << zdev->bars[i].size;
617 611
618 res = __alloc_res(zdev, addr, size, flags); 612 res = __alloc_res(zdev, addr, size, flags);
@@ -873,23 +867,30 @@ static int zpci_mem_init(void)
873 zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb), 867 zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb),
874 16, 0, NULL); 868 16, 0, NULL);
875 if (!zdev_fmb_cache) 869 if (!zdev_fmb_cache)
876 goto error_zdev; 870 goto error_fmb;
877 871
878 /* TODO: use realloc */ 872 zpci_iomap_start = kcalloc(ZPCI_IOMAP_ENTRIES,
879 zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start), 873 sizeof(*zpci_iomap_start), GFP_KERNEL);
880 GFP_KERNEL);
881 if (!zpci_iomap_start) 874 if (!zpci_iomap_start)
882 goto error_iomap; 875 goto error_iomap;
883 return 0;
884 876
877 zpci_iomap_bitmap = kcalloc(BITS_TO_LONGS(ZPCI_IOMAP_ENTRIES),
878 sizeof(*zpci_iomap_bitmap), GFP_KERNEL);
879 if (!zpci_iomap_bitmap)
880 goto error_iomap_bitmap;
881
882 return 0;
883error_iomap_bitmap:
884 kfree(zpci_iomap_start);
885error_iomap: 885error_iomap:
886 kmem_cache_destroy(zdev_fmb_cache); 886 kmem_cache_destroy(zdev_fmb_cache);
887error_zdev: 887error_fmb:
888 return -ENOMEM; 888 return -ENOMEM;
889} 889}
890 890
891static void zpci_mem_exit(void) 891static void zpci_mem_exit(void)
892{ 892{
893 kfree(zpci_iomap_bitmap);
893 kfree(zpci_iomap_start); 894 kfree(zpci_iomap_start);
894 kmem_cache_destroy(zdev_fmb_cache); 895 kmem_cache_destroy(zdev_fmb_cache);
895} 896}
diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c
index 369a3e05d468..b0e04751c5d5 100644
--- a/arch/s390/pci/pci_event.c
+++ b/arch/s390/pci/pci_event.c
@@ -53,6 +53,11 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)
53 53
54 pr_err("%s: Event 0x%x reports an error for PCI function 0x%x\n", 54 pr_err("%s: Event 0x%x reports an error for PCI function 0x%x\n",
55 pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid); 55 pdev ? pci_name(pdev) : "n/a", ccdf->pec, ccdf->fid);
56
57 if (!pdev)
58 return;
59
60 pdev->error_state = pci_channel_io_perm_failure;
56} 61}
57 62
58void zpci_event_error(void *data) 63void zpci_event_error(void *data)
diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c
index c692dfebd0ba..50597f9522fe 100644
--- a/drivers/s390/cio/chp.c
+++ b/drivers/s390/cio/chp.c
@@ -139,11 +139,11 @@ static ssize_t chp_measurement_chars_read(struct file *filp,
139 139
140 device = container_of(kobj, struct device, kobj); 140 device = container_of(kobj, struct device, kobj);
141 chp = to_channelpath(device); 141 chp = to_channelpath(device);
142 if (!chp->cmg_chars) 142 if (chp->cmg == -1)
143 return 0; 143 return 0;
144 144
145 return memory_read_from_buffer(buf, count, &off, 145 return memory_read_from_buffer(buf, count, &off, &chp->cmg_chars,
146 chp->cmg_chars, sizeof(struct cmg_chars)); 146 sizeof(chp->cmg_chars));
147} 147}
148 148
149static struct bin_attribute chp_measurement_chars_attr = { 149static struct bin_attribute chp_measurement_chars_attr = {
@@ -416,7 +416,8 @@ static void chp_release(struct device *dev)
416 * chp_update_desc - update channel-path description 416 * chp_update_desc - update channel-path description
417 * @chp - channel-path 417 * @chp - channel-path
418 * 418 *
419 * Update the channel-path description of the specified channel-path. 419 * Update the channel-path description of the specified channel-path
420 * including channel measurement related information.
420 * Return zero on success, non-zero otherwise. 421 * Return zero on success, non-zero otherwise.
421 */ 422 */
422int chp_update_desc(struct channel_path *chp) 423int chp_update_desc(struct channel_path *chp)
@@ -428,8 +429,10 @@ int chp_update_desc(struct channel_path *chp)
428 return rc; 429 return rc;
429 430
430 rc = chsc_determine_fmt1_channel_path_desc(chp->chpid, &chp->desc_fmt1); 431 rc = chsc_determine_fmt1_channel_path_desc(chp->chpid, &chp->desc_fmt1);
432 if (rc)
433 return rc;
431 434
432 return rc; 435 return chsc_get_channel_measurement_chars(chp);
433} 436}
434 437
435/** 438/**
@@ -466,14 +469,6 @@ int chp_new(struct chp_id chpid)
466 ret = -ENODEV; 469 ret = -ENODEV;
467 goto out_free; 470 goto out_free;
468 } 471 }
469 /* Get channel-measurement characteristics. */
470 if (css_chsc_characteristics.scmc && css_chsc_characteristics.secm) {
471 ret = chsc_get_channel_measurement_chars(chp);
472 if (ret)
473 goto out_free;
474 } else {
475 chp->cmg = -1;
476 }
477 dev_set_name(&chp->dev, "chp%x.%02x", chpid.cssid, chpid.id); 472 dev_set_name(&chp->dev, "chp%x.%02x", chpid.cssid, chpid.id);
478 473
479 /* make it known to the system */ 474 /* make it known to the system */
diff --git a/drivers/s390/cio/chp.h b/drivers/s390/cio/chp.h
index 4efd5b867cc3..af0232290dc4 100644
--- a/drivers/s390/cio/chp.h
+++ b/drivers/s390/cio/chp.h
@@ -48,7 +48,7 @@ struct channel_path {
48 /* Channel-measurement related stuff: */ 48 /* Channel-measurement related stuff: */
49 int cmg; 49 int cmg;
50 int shared; 50 int shared;
51 void *cmg_chars; 51 struct cmg_chars cmg_chars;
52}; 52};
53 53
54/* Return channel_path struct for given chpid. */ 54/* Return channel_path struct for given chpid. */
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index a831d18596a5..c424c0c7367e 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -14,6 +14,7 @@
14#include <linux/slab.h> 14#include <linux/slab.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/device.h> 16#include <linux/device.h>
17#include <linux/mutex.h>
17#include <linux/pci.h> 18#include <linux/pci.h>
18 19
19#include <asm/cio.h> 20#include <asm/cio.h>
@@ -224,8 +225,9 @@ out_unreg:
224 225
225void chsc_chp_offline(struct chp_id chpid) 226void chsc_chp_offline(struct chp_id chpid)
226{ 227{
227 char dbf_txt[15]; 228 struct channel_path *chp = chpid_to_chp(chpid);
228 struct chp_link link; 229 struct chp_link link;
230 char dbf_txt[15];
229 231
230 sprintf(dbf_txt, "chpr%x.%02x", chpid.cssid, chpid.id); 232 sprintf(dbf_txt, "chpr%x.%02x", chpid.cssid, chpid.id);
231 CIO_TRACE_EVENT(2, dbf_txt); 233 CIO_TRACE_EVENT(2, dbf_txt);
@@ -236,6 +238,11 @@ void chsc_chp_offline(struct chp_id chpid)
236 link.chpid = chpid; 238 link.chpid = chpid;
237 /* Wait until previous actions have settled. */ 239 /* Wait until previous actions have settled. */
238 css_wait_for_slow_path(); 240 css_wait_for_slow_path();
241
242 mutex_lock(&chp->lock);
243 chp_update_desc(chp);
244 mutex_unlock(&chp->lock);
245
239 for_each_subchannel_staged(s390_subchannel_remove_chpid, NULL, &link); 246 for_each_subchannel_staged(s390_subchannel_remove_chpid, NULL, &link);
240} 247}
241 248
@@ -690,8 +697,9 @@ static void chsc_process_crw(struct crw *crw0, struct crw *crw1, int overflow)
690 697
691void chsc_chp_online(struct chp_id chpid) 698void chsc_chp_online(struct chp_id chpid)
692{ 699{
693 char dbf_txt[15]; 700 struct channel_path *chp = chpid_to_chp(chpid);
694 struct chp_link link; 701 struct chp_link link;
702 char dbf_txt[15];
695 703
696 sprintf(dbf_txt, "cadd%x.%02x", chpid.cssid, chpid.id); 704 sprintf(dbf_txt, "cadd%x.%02x", chpid.cssid, chpid.id);
697 CIO_TRACE_EVENT(2, dbf_txt); 705 CIO_TRACE_EVENT(2, dbf_txt);
@@ -701,6 +709,11 @@ void chsc_chp_online(struct chp_id chpid)
701 link.chpid = chpid; 709 link.chpid = chpid;
702 /* Wait until previous actions have settled. */ 710 /* Wait until previous actions have settled. */
703 css_wait_for_slow_path(); 711 css_wait_for_slow_path();
712
713 mutex_lock(&chp->lock);
714 chp_update_desc(chp);
715 mutex_unlock(&chp->lock);
716
704 for_each_subchannel_staged(__s390_process_res_acc, NULL, 717 for_each_subchannel_staged(__s390_process_res_acc, NULL,
705 &link); 718 &link);
706 css_schedule_reprobe(); 719 css_schedule_reprobe();
@@ -967,22 +980,19 @@ static void
967chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv, 980chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv,
968 struct cmg_chars *chars) 981 struct cmg_chars *chars)
969{ 982{
970 struct cmg_chars *cmg_chars;
971 int i, mask; 983 int i, mask;
972 984
973 cmg_chars = chp->cmg_chars;
974 for (i = 0; i < NR_MEASUREMENT_CHARS; i++) { 985 for (i = 0; i < NR_MEASUREMENT_CHARS; i++) {
975 mask = 0x80 >> (i + 3); 986 mask = 0x80 >> (i + 3);
976 if (cmcv & mask) 987 if (cmcv & mask)
977 cmg_chars->values[i] = chars->values[i]; 988 chp->cmg_chars.values[i] = chars->values[i];
978 else 989 else
979 cmg_chars->values[i] = 0; 990 chp->cmg_chars.values[i] = 0;
980 } 991 }
981} 992}
982 993
983int chsc_get_channel_measurement_chars(struct channel_path *chp) 994int chsc_get_channel_measurement_chars(struct channel_path *chp)
984{ 995{
985 struct cmg_chars *cmg_chars;
986 int ccode, ret; 996 int ccode, ret;
987 997
988 struct { 998 struct {
@@ -1006,10 +1016,11 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
1006 u32 data[NR_MEASUREMENT_CHARS]; 1016 u32 data[NR_MEASUREMENT_CHARS];
1007 } __attribute__ ((packed)) *scmc_area; 1017 } __attribute__ ((packed)) *scmc_area;
1008 1018
1009 chp->cmg_chars = NULL; 1019 chp->shared = -1;
1010 cmg_chars = kmalloc(sizeof(*cmg_chars), GFP_KERNEL); 1020 chp->cmg = -1;
1011 if (!cmg_chars) 1021
1012 return -ENOMEM; 1022 if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)
1023 return 0;
1013 1024
1014 spin_lock_irq(&chsc_page_lock); 1025 spin_lock_irq(&chsc_page_lock);
1015 memset(chsc_page, 0, PAGE_SIZE); 1026 memset(chsc_page, 0, PAGE_SIZE);
@@ -1031,25 +1042,19 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
1031 scmc_area->response.code); 1042 scmc_area->response.code);
1032 goto out; 1043 goto out;
1033 } 1044 }
1034 if (scmc_area->not_valid) { 1045 if (scmc_area->not_valid)
1035 chp->cmg = -1;
1036 chp->shared = -1;
1037 goto out; 1046 goto out;
1038 } 1047
1039 chp->cmg = scmc_area->cmg; 1048 chp->cmg = scmc_area->cmg;
1040 chp->shared = scmc_area->shared; 1049 chp->shared = scmc_area->shared;
1041 if (chp->cmg != 2 && chp->cmg != 3) { 1050 if (chp->cmg != 2 && chp->cmg != 3) {
1042 /* No cmg-dependent data. */ 1051 /* No cmg-dependent data. */
1043 goto out; 1052 goto out;
1044 } 1053 }
1045 chp->cmg_chars = cmg_chars;
1046 chsc_initialize_cmg_chars(chp, scmc_area->cmcv, 1054 chsc_initialize_cmg_chars(chp, scmc_area->cmcv,
1047 (struct cmg_chars *) &scmc_area->data); 1055 (struct cmg_chars *) &scmc_area->data);
1048out: 1056out:
1049 spin_unlock_irq(&chsc_page_lock); 1057 spin_unlock_irq(&chsc_page_lock);
1050 if (!chp->cmg_chars)
1051 kfree(cmg_chars);
1052
1053 return ret; 1058 return ret;
1054} 1059}
1055 1060
diff --git a/drivers/s390/crypto/zcrypt_error.h b/drivers/s390/crypto/zcrypt_error.h
index 7b23f43c7b08..de1b6c1d172c 100644
--- a/drivers/s390/crypto/zcrypt_error.h
+++ b/drivers/s390/crypto/zcrypt_error.h
@@ -112,9 +112,10 @@ static inline int convert_error(struct zcrypt_device *zdev,
112 atomic_set(&zcrypt_rescan_req, 1); 112 atomic_set(&zcrypt_rescan_req, 1);
113 zdev->online = 0; 113 zdev->online = 0;
114 pr_err("Cryptographic device %x failed and was set offline\n", 114 pr_err("Cryptographic device %x failed and was set offline\n",
115 zdev->ap_dev->qid); 115 AP_QID_DEVICE(zdev->ap_dev->qid));
116 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d", 116 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d",
117 zdev->ap_dev->qid, zdev->online, ehdr->reply_code); 117 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online,
118 ehdr->reply_code);
118 return -EAGAIN; 119 return -EAGAIN;
119 case REP82_ERROR_TRANSPORT_FAIL: 120 case REP82_ERROR_TRANSPORT_FAIL:
120 case REP82_ERROR_MACHINE_FAILURE: 121 case REP82_ERROR_MACHINE_FAILURE:
@@ -123,16 +124,18 @@ static inline int convert_error(struct zcrypt_device *zdev,
123 atomic_set(&zcrypt_rescan_req, 1); 124 atomic_set(&zcrypt_rescan_req, 1);
124 zdev->online = 0; 125 zdev->online = 0;
125 pr_err("Cryptographic device %x failed and was set offline\n", 126 pr_err("Cryptographic device %x failed and was set offline\n",
126 zdev->ap_dev->qid); 127 AP_QID_DEVICE(zdev->ap_dev->qid));
127 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d", 128 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d",
128 zdev->ap_dev->qid, zdev->online, ehdr->reply_code); 129 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online,
130 ehdr->reply_code);
129 return -EAGAIN; 131 return -EAGAIN;
130 default: 132 default:
131 zdev->online = 0; 133 zdev->online = 0;
132 pr_err("Cryptographic device %x failed and was set offline\n", 134 pr_err("Cryptographic device %x failed and was set offline\n",
133 zdev->ap_dev->qid); 135 AP_QID_DEVICE(zdev->ap_dev->qid));
134 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d", 136 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d",
135 zdev->ap_dev->qid, zdev->online, ehdr->reply_code); 137 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online,
138 ehdr->reply_code);
136 return -EAGAIN; /* repeat the request on a different device. */ 139 return -EAGAIN; /* repeat the request on a different device. */
137 } 140 }
138} 141}
diff --git a/drivers/s390/crypto/zcrypt_msgtype50.c b/drivers/s390/crypto/zcrypt_msgtype50.c
index 74edf2934e7c..eedfaa2cf715 100644
--- a/drivers/s390/crypto/zcrypt_msgtype50.c
+++ b/drivers/s390/crypto/zcrypt_msgtype50.c
@@ -336,9 +336,10 @@ static int convert_type80(struct zcrypt_device *zdev,
336 /* The result is too short, the CEX2A card may not do that.. */ 336 /* The result is too short, the CEX2A card may not do that.. */
337 zdev->online = 0; 337 zdev->online = 0;
338 pr_err("Cryptographic device %x failed and was set offline\n", 338 pr_err("Cryptographic device %x failed and was set offline\n",
339 zdev->ap_dev->qid); 339 AP_QID_DEVICE(zdev->ap_dev->qid));
340 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d", 340 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d",
341 zdev->ap_dev->qid, zdev->online, t80h->code); 341 AP_QID_DEVICE(zdev->ap_dev->qid),
342 zdev->online, t80h->code);
342 343
343 return -EAGAIN; /* repeat the request on a different device. */ 344 return -EAGAIN; /* repeat the request on a different device. */
344 } 345 }
@@ -368,9 +369,9 @@ static int convert_response(struct zcrypt_device *zdev,
368 default: /* Unknown response type, this should NEVER EVER happen */ 369 default: /* Unknown response type, this should NEVER EVER happen */
369 zdev->online = 0; 370 zdev->online = 0;
370 pr_err("Cryptographic device %x failed and was set offline\n", 371 pr_err("Cryptographic device %x failed and was set offline\n",
371 zdev->ap_dev->qid); 372 AP_QID_DEVICE(zdev->ap_dev->qid));
372 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail", 373 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail",
373 zdev->ap_dev->qid, zdev->online); 374 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online);
374 return -EAGAIN; /* repeat the request on a different device. */ 375 return -EAGAIN; /* repeat the request on a different device. */
375 } 376 }
376} 377}
diff --git a/drivers/s390/crypto/zcrypt_msgtype6.c b/drivers/s390/crypto/zcrypt_msgtype6.c
index 9a2dd472c1cc..21959719daef 100644
--- a/drivers/s390/crypto/zcrypt_msgtype6.c
+++ b/drivers/s390/crypto/zcrypt_msgtype6.c
@@ -572,9 +572,9 @@ static int convert_type86_ica(struct zcrypt_device *zdev,
572 return -EINVAL; 572 return -EINVAL;
573 zdev->online = 0; 573 zdev->online = 0;
574 pr_err("Cryptographic device %x failed and was set offline\n", 574 pr_err("Cryptographic device %x failed and was set offline\n",
575 zdev->ap_dev->qid); 575 AP_QID_DEVICE(zdev->ap_dev->qid));
576 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d", 576 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%drc%d",
577 zdev->ap_dev->qid, zdev->online, 577 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online,
578 msg->hdr.reply_code); 578 msg->hdr.reply_code);
579 return -EAGAIN; /* repeat the request on a different device. */ 579 return -EAGAIN; /* repeat the request on a different device. */
580 } 580 }
@@ -715,9 +715,9 @@ static int convert_response_ica(struct zcrypt_device *zdev,
715 default: /* Unknown response type, this should NEVER EVER happen */ 715 default: /* Unknown response type, this should NEVER EVER happen */
716 zdev->online = 0; 716 zdev->online = 0;
717 pr_err("Cryptographic device %x failed and was set offline\n", 717 pr_err("Cryptographic device %x failed and was set offline\n",
718 zdev->ap_dev->qid); 718 AP_QID_DEVICE(zdev->ap_dev->qid));
719 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail", 719 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail",
720 zdev->ap_dev->qid, zdev->online); 720 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online);
721 return -EAGAIN; /* repeat the request on a different device. */ 721 return -EAGAIN; /* repeat the request on a different device. */
722 } 722 }
723} 723}
@@ -747,9 +747,9 @@ static int convert_response_xcrb(struct zcrypt_device *zdev,
747 xcRB->status = 0x0008044DL; /* HDD_InvalidParm */ 747 xcRB->status = 0x0008044DL; /* HDD_InvalidParm */
748 zdev->online = 0; 748 zdev->online = 0;
749 pr_err("Cryptographic device %x failed and was set offline\n", 749 pr_err("Cryptographic device %x failed and was set offline\n",
750 zdev->ap_dev->qid); 750 AP_QID_DEVICE(zdev->ap_dev->qid));
751 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail", 751 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail",
752 zdev->ap_dev->qid, zdev->online); 752 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online);
753 return -EAGAIN; /* repeat the request on a different device. */ 753 return -EAGAIN; /* repeat the request on a different device. */
754 } 754 }
755} 755}
@@ -773,9 +773,9 @@ static int convert_response_ep11_xcrb(struct zcrypt_device *zdev,
773 default: /* Unknown response type, this should NEVER EVER happen */ 773 default: /* Unknown response type, this should NEVER EVER happen */
774 zdev->online = 0; 774 zdev->online = 0;
775 pr_err("Cryptographic device %x failed and was set offline\n", 775 pr_err("Cryptographic device %x failed and was set offline\n",
776 zdev->ap_dev->qid); 776 AP_QID_DEVICE(zdev->ap_dev->qid));
777 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail", 777 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail",
778 zdev->ap_dev->qid, zdev->online); 778 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online);
779 return -EAGAIN; /* repeat the request on a different device. */ 779 return -EAGAIN; /* repeat the request on a different device. */
780 } 780 }
781} 781}
@@ -800,9 +800,9 @@ static int convert_response_rng(struct zcrypt_device *zdev,
800 default: /* Unknown response type, this should NEVER EVER happen */ 800 default: /* Unknown response type, this should NEVER EVER happen */
801 zdev->online = 0; 801 zdev->online = 0;
802 pr_err("Cryptographic device %x failed and was set offline\n", 802 pr_err("Cryptographic device %x failed and was set offline\n",
803 zdev->ap_dev->qid); 803 AP_QID_DEVICE(zdev->ap_dev->qid));
804 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail", 804 ZCRYPT_DBF_DEV(DBF_ERR, zdev, "dev%04xo%dfail",
805 zdev->ap_dev->qid, zdev->online); 805 AP_QID_DEVICE(zdev->ap_dev->qid), zdev->online);
806 return -EAGAIN; /* repeat the request on a different device. */ 806 return -EAGAIN; /* repeat the request on a different device. */
807 } 807 }
808} 808}