diff options
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 */ | ||
| 57 | static inline notrace void arch_local_irq_restore(unsigned long flags) | 60 | static 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 | ||
| 62 | static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) | 67 | static 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 | ||
| 67 | static inline notrace bool arch_irqs_disabled(void) | 72 | static 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 | ||
| 16 | struct zpci_iomap_entry { | 19 | struct zpci_iomap_entry { |
| 17 | u32 fh; | 20 | u32 fh; |
| @@ -21,8 +24,9 @@ struct zpci_iomap_entry { | |||
| 21 | 24 | ||
| 22 | extern struct zpci_iomap_entry *zpci_iomap_start; | 25 | extern 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) | |||
| 161 | static inline void instruction_pointer_set(struct pt_regs *regs, | 161 | static 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 | ||
| 167 | int regs_query_register_offset(const char *name); | 167 | int 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 | ||
| 172 | static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | 172 | static 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, | |||
| 177 | COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); | 177 | COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); |
| 178 | COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); | 178 | COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); |
| 179 | COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); | 179 | COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); |
| 180 | COMPAT_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(¤t->tracing_graph_pause))) | 204 | if (unlikely(atomic_read(¤t->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 | } |
| 231 | NOKPROBE_SYMBOL(enable_singlestep); | 231 | NOKPROBE_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 | } |
| 243 | NOKPROBE_SYMBOL(disable_singlestep); | 243 | NOKPROBE_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); | |||
| 490 | static void resume_execution(struct kprobe *p, struct pt_regs *regs) | 490 | static 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 | ||
| 75 | static unsigned long instruction_pointer_guest(struct pt_regs *regs) | 75 | static 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 | ||
| 80 | unsigned long perf_instruction_pointer(struct pt_regs *regs) | 80 | unsigned 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) | |||
| 383 | SYSCALL(sys_recvmsg,compat_sys_recvmsg) | 383 | SYSCALL(sys_recvmsg,compat_sys_recvmsg) |
| 384 | SYSCALL(sys_shutdown,sys_shutdown) | 384 | SYSCALL(sys_shutdown,sys_shutdown) |
| 385 | SYSCALL(sys_mlock2,compat_sys_mlock2) | 385 | SYSCALL(sys_mlock2,compat_sys_mlock2) |
| 386 | SYSCALL(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 | ||
| 39 | static inline void report_user_fault(struct pt_regs *regs, int signr) | 38 | static 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 | ||
| 170 | int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) | 170 | int 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; |
| 60 | repeat: | 60 | repeat: |
| 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 | } |
| 165 | device_initcall(numa_init_late); | 163 | arch_initcall(numa_init_late); |
| 166 | 164 | ||
| 167 | static int __init parse_debug(char *parm) | 165 | static 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 | |||
| 72 | static DEFINE_SPINLOCK(zpci_iomap_lock); | 75 | static DEFINE_SPINLOCK(zpci_iomap_lock); |
| 73 | static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); | 76 | static unsigned long *zpci_iomap_bitmap; |
| 74 | struct zpci_iomap_entry *zpci_iomap_start; | 77 | struct zpci_iomap_entry *zpci_iomap_start; |
| 75 | EXPORT_SYMBOL_GPL(zpci_iomap_start); | 78 | EXPORT_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 | } |
| 290 | EXPORT_SYMBOL(pci_iomap_range); | 286 | EXPORT_SYMBOL(pci_iomap_range); |
| 291 | 287 | ||
| @@ -297,12 +293,11 @@ EXPORT_SYMBOL(pci_iomap); | |||
| 297 | 293 | ||
| 298 | void pci_iounmap(struct pci_dev *pdev, void __iomem *addr) | 294 | void 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 | ||
| 545 | static int zpci_alloc_iomap(struct zpci_dev *zdev) | 540 | static 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; | ||
| 883 | error_iomap_bitmap: | ||
| 884 | kfree(zpci_iomap_start); | ||
| 885 | error_iomap: | 885 | error_iomap: |
| 886 | kmem_cache_destroy(zdev_fmb_cache); | 886 | kmem_cache_destroy(zdev_fmb_cache); |
| 887 | error_zdev: | 887 | error_fmb: |
| 888 | return -ENOMEM; | 888 | return -ENOMEM; |
| 889 | } | 889 | } |
| 890 | 890 | ||
| 891 | static void zpci_mem_exit(void) | 891 | static 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 | ||
| 58 | void zpci_event_error(void *data) | 63 | void 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 | ||
| 149 | static struct bin_attribute chp_measurement_chars_attr = { | 149 | static 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 | */ |
| 422 | int chp_update_desc(struct channel_path *chp) | 423 | int 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 | ||
| 225 | void chsc_chp_offline(struct chp_id chpid) | 226 | void 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 | ||
| 691 | void chsc_chp_online(struct chp_id chpid) | 698 | void 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 | |||
| 967 | chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv, | 980 | chsc_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 | ||
| 983 | int chsc_get_channel_measurement_chars(struct channel_path *chp) | 994 | int 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); |
| 1048 | out: | 1056 | out: |
| 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 | } |
