diff options
| author | Steve French <sfrench@us.ibm.com> | 2011-12-16 01:39:20 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2011-12-16 01:39:20 -0500 |
| commit | aaf015890754d58dcb71a4aa44ed246bb082bcf6 (patch) | |
| tree | 17b51ff707fd1b3efec3a3ab872f0d7a7416aca5 /arch/s390/kernel | |
| parent | 9c32c63bb70b2fafc3b18bee29959c3bf245ceba (diff) | |
| parent | 8def5f51b012efb00e77ba2d04696cc0aadd0609 (diff) | |
Merge branch 'master' of git+ssh://git.samba.org/data/git/sfrench/cifs-2.6
Diffstat (limited to 'arch/s390/kernel')
| -rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 20 | ||||
| -rw-r--r-- | arch/s390/kernel/early.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/ptrace.c | 30 | ||||
| -rw-r--r-- | arch/s390/kernel/setup.c | 6 | ||||
| -rw-r--r-- | arch/s390/kernel/signal.c | 8 | ||||
| -rw-r--r-- | arch/s390/kernel/syscalls.S | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/topology.c | 45 | ||||
| -rw-r--r-- | arch/s390/kernel/vmlinux.lds.S | 2 |
8 files changed, 89 insertions, 26 deletions
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 5006a1d9f5d0..18c51df9fe06 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -1627,3 +1627,23 @@ ENTRY(sys_setns_wrapper) | |||
| 1627 | lgfr %r2,%r2 # int | 1627 | lgfr %r2,%r2 # int |
| 1628 | lgfr %r3,%r3 # int | 1628 | lgfr %r3,%r3 # int |
| 1629 | jg sys_setns | 1629 | jg sys_setns |
| 1630 | |||
| 1631 | ENTRY(compat_sys_process_vm_readv_wrapper) | ||
| 1632 | lgfr %r2,%r2 # compat_pid_t | ||
| 1633 | llgtr %r3,%r3 # struct compat_iovec __user * | ||
| 1634 | llgfr %r4,%r4 # unsigned long | ||
| 1635 | llgtr %r5,%r5 # struct compat_iovec __user * | ||
| 1636 | llgfr %r6,%r6 # unsigned long | ||
| 1637 | llgf %r0,164(%r15) # unsigned long | ||
| 1638 | stg %r0,160(%r15) | ||
| 1639 | jg sys_process_vm_readv | ||
| 1640 | |||
| 1641 | ENTRY(compat_sys_process_vm_writev_wrapper) | ||
| 1642 | lgfr %r2,%r2 # compat_pid_t | ||
| 1643 | llgtr %r3,%r3 # struct compat_iovec __user * | ||
| 1644 | llgfr %r4,%r4 # unsigned long | ||
| 1645 | llgtr %r5,%r5 # struct compat_iovec __user * | ||
| 1646 | llgfr %r6,%r6 # unsigned long | ||
| 1647 | llgf %r0,164(%r15) # unsigned long | ||
| 1648 | stg %r0,160(%r15) | ||
| 1649 | jg sys_process_vm_writev | ||
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 37394b3413e2..c9ffe0025197 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
| @@ -390,6 +390,8 @@ static __init void detect_machine_facilities(void) | |||
| 390 | S390_lowcore.machine_flags |= MACHINE_FLAG_MVCOS; | 390 | S390_lowcore.machine_flags |= MACHINE_FLAG_MVCOS; |
| 391 | if (test_facility(40)) | 391 | if (test_facility(40)) |
| 392 | S390_lowcore.machine_flags |= MACHINE_FLAG_SPP; | 392 | S390_lowcore.machine_flags |= MACHINE_FLAG_SPP; |
| 393 | if (test_facility(25)) | ||
| 394 | S390_lowcore.machine_flags |= MACHINE_FLAG_STCKF; | ||
| 393 | #endif | 395 | #endif |
| 394 | } | 396 | } |
| 395 | 397 | ||
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 450931a45b68..573bc29551ef 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
| @@ -296,13 +296,6 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | |||
| 296 | ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)))) | 296 | ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)))) |
| 297 | /* Invalid psw mask. */ | 297 | /* Invalid psw mask. */ |
| 298 | return -EINVAL; | 298 | return -EINVAL; |
| 299 | if (addr == (addr_t) &dummy->regs.psw.addr) | ||
| 300 | /* | ||
| 301 | * The debugger changed the instruction address, | ||
| 302 | * reset system call restart, see signal.c:do_signal | ||
| 303 | */ | ||
| 304 | task_thread_info(child)->system_call = 0; | ||
| 305 | |||
| 306 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; | 299 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; |
| 307 | 300 | ||
| 308 | } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) { | 301 | } else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) { |
| @@ -614,11 +607,6 @@ static int __poke_user_compat(struct task_struct *child, | |||
| 614 | /* Transfer 31 bit amode bit to psw mask. */ | 607 | /* Transfer 31 bit amode bit to psw mask. */ |
| 615 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) | | 608 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) | |
| 616 | (__u64)(tmp & PSW32_ADDR_AMODE); | 609 | (__u64)(tmp & PSW32_ADDR_AMODE); |
| 617 | /* | ||
| 618 | * The debugger changed the instruction address, | ||
| 619 | * reset system call restart, see signal.c:do_signal | ||
| 620 | */ | ||
| 621 | task_thread_info(child)->system_call = 0; | ||
| 622 | } else { | 610 | } else { |
| 623 | /* gpr 0-15 */ | 611 | /* gpr 0-15 */ |
| 624 | *(__u32*)((addr_t) ®s->psw + addr*2 + 4) = tmp; | 612 | *(__u32*)((addr_t) ®s->psw + addr*2 + 4) = tmp; |
| @@ -905,6 +893,14 @@ static int s390_last_break_get(struct task_struct *target, | |||
| 905 | return 0; | 893 | return 0; |
| 906 | } | 894 | } |
| 907 | 895 | ||
| 896 | static int s390_last_break_set(struct task_struct *target, | ||
| 897 | const struct user_regset *regset, | ||
| 898 | unsigned int pos, unsigned int count, | ||
| 899 | const void *kbuf, const void __user *ubuf) | ||
| 900 | { | ||
| 901 | return 0; | ||
| 902 | } | ||
| 903 | |||
| 908 | #endif | 904 | #endif |
| 909 | 905 | ||
| 910 | static int s390_system_call_get(struct task_struct *target, | 906 | static int s390_system_call_get(struct task_struct *target, |
| @@ -951,6 +947,7 @@ static const struct user_regset s390_regsets[] = { | |||
| 951 | .size = sizeof(long), | 947 | .size = sizeof(long), |
| 952 | .align = sizeof(long), | 948 | .align = sizeof(long), |
| 953 | .get = s390_last_break_get, | 949 | .get = s390_last_break_get, |
| 950 | .set = s390_last_break_set, | ||
| 954 | }, | 951 | }, |
| 955 | #endif | 952 | #endif |
| 956 | [REGSET_SYSTEM_CALL] = { | 953 | [REGSET_SYSTEM_CALL] = { |
| @@ -1116,6 +1113,14 @@ static int s390_compat_last_break_get(struct task_struct *target, | |||
| 1116 | return 0; | 1113 | return 0; |
| 1117 | } | 1114 | } |
| 1118 | 1115 | ||
| 1116 | static int s390_compat_last_break_set(struct task_struct *target, | ||
| 1117 | const struct user_regset *regset, | ||
| 1118 | unsigned int pos, unsigned int count, | ||
| 1119 | const void *kbuf, const void __user *ubuf) | ||
| 1120 | { | ||
| 1121 | return 0; | ||
| 1122 | } | ||
| 1123 | |||
| 1119 | static const struct user_regset s390_compat_regsets[] = { | 1124 | static const struct user_regset s390_compat_regsets[] = { |
| 1120 | [REGSET_GENERAL] = { | 1125 | [REGSET_GENERAL] = { |
| 1121 | .core_note_type = NT_PRSTATUS, | 1126 | .core_note_type = NT_PRSTATUS, |
| @@ -1139,6 +1144,7 @@ static const struct user_regset s390_compat_regsets[] = { | |||
| 1139 | .size = sizeof(long), | 1144 | .size = sizeof(long), |
| 1140 | .align = sizeof(long), | 1145 | .align = sizeof(long), |
| 1141 | .get = s390_compat_last_break_get, | 1146 | .get = s390_compat_last_break_get, |
| 1147 | .set = s390_compat_last_break_set, | ||
| 1142 | }, | 1148 | }, |
| 1143 | [REGSET_SYSTEM_CALL] = { | 1149 | [REGSET_SYSTEM_CALL] = { |
| 1144 | .core_note_type = NT_S390_SYSTEM_CALL, | 1150 | .core_note_type = NT_S390_SYSTEM_CALL, |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 8ac6bfa2786c..e54c4ff8abaa 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -211,6 +211,8 @@ static void __init setup_zfcpdump(unsigned int console_devno) | |||
| 211 | 211 | ||
| 212 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) | 212 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) |
| 213 | return; | 213 | return; |
| 214 | if (OLDMEM_BASE) | ||
| 215 | return; | ||
| 214 | if (console_devno != -1) | 216 | if (console_devno != -1) |
| 215 | sprintf(str, " cio_ignore=all,!0.0.%04x,!0.0.%04x", | 217 | sprintf(str, " cio_ignore=all,!0.0.%04x,!0.0.%04x", |
| 216 | ipl_info.data.fcp.dev_id.devno, console_devno); | 218 | ipl_info.data.fcp.dev_id.devno, console_devno); |
| @@ -482,7 +484,7 @@ static void __init setup_memory_end(void) | |||
| 482 | 484 | ||
| 483 | 485 | ||
| 484 | #ifdef CONFIG_ZFCPDUMP | 486 | #ifdef CONFIG_ZFCPDUMP |
| 485 | if (ipl_info.type == IPL_TYPE_FCP_DUMP) { | 487 | if (ipl_info.type == IPL_TYPE_FCP_DUMP && !OLDMEM_BASE) { |
| 486 | memory_end = ZFCPDUMP_HSA_SIZE; | 488 | memory_end = ZFCPDUMP_HSA_SIZE; |
| 487 | memory_end_set = 1; | 489 | memory_end_set = 1; |
| 488 | } | 490 | } |
| @@ -577,7 +579,7 @@ static unsigned long __init find_crash_base(unsigned long crash_size, | |||
| 577 | *msg = "first memory chunk must be at least crashkernel size"; | 579 | *msg = "first memory chunk must be at least crashkernel size"; |
| 578 | return 0; | 580 | return 0; |
| 579 | } | 581 | } |
| 580 | if (is_kdump_kernel() && (crash_size == OLDMEM_SIZE)) | 582 | if (OLDMEM_BASE && crash_size == OLDMEM_SIZE) |
| 581 | return OLDMEM_BASE; | 583 | return OLDMEM_BASE; |
| 582 | 584 | ||
| 583 | for (i = MEMORY_CHUNKS - 1; i >= 0; i--) { | 585 | for (i = MEMORY_CHUNKS - 1; i >= 0; i--) { |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 05a85bc14c98..7f6f9f354545 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -460,9 +460,9 @@ void do_signal(struct pt_regs *regs) | |||
| 460 | regs->svc_code >> 16); | 460 | regs->svc_code >> 16); |
| 461 | break; | 461 | break; |
| 462 | } | 462 | } |
| 463 | /* No longer in a system call */ | ||
| 464 | clear_thread_flag(TIF_SYSCALL); | ||
| 465 | } | 463 | } |
| 464 | /* No longer in a system call */ | ||
| 465 | clear_thread_flag(TIF_SYSCALL); | ||
| 466 | 466 | ||
| 467 | if ((is_compat_task() ? | 467 | if ((is_compat_task() ? |
| 468 | handle_signal32(signr, &ka, &info, oldset, regs) : | 468 | handle_signal32(signr, &ka, &info, oldset, regs) : |
| @@ -486,6 +486,7 @@ void do_signal(struct pt_regs *regs) | |||
| 486 | } | 486 | } |
| 487 | 487 | ||
| 488 | /* No handlers present - check for system call restart */ | 488 | /* No handlers present - check for system call restart */ |
| 489 | clear_thread_flag(TIF_SYSCALL); | ||
| 489 | if (current_thread_info()->system_call) { | 490 | if (current_thread_info()->system_call) { |
| 490 | regs->svc_code = current_thread_info()->system_call; | 491 | regs->svc_code = current_thread_info()->system_call; |
| 491 | switch (regs->gprs[2]) { | 492 | switch (regs->gprs[2]) { |
| @@ -500,9 +501,6 @@ void do_signal(struct pt_regs *regs) | |||
| 500 | regs->gprs[2] = regs->orig_gpr2; | 501 | regs->gprs[2] = regs->orig_gpr2; |
| 501 | set_thread_flag(TIF_SYSCALL); | 502 | set_thread_flag(TIF_SYSCALL); |
| 502 | break; | 503 | break; |
| 503 | default: | ||
| 504 | clear_thread_flag(TIF_SYSCALL); | ||
| 505 | break; | ||
| 506 | } | 504 | } |
| 507 | } | 505 | } |
| 508 | 506 | ||
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 73eb08c874fb..bcab2f04ba58 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
| @@ -348,3 +348,5 @@ SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at | |||
| 348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) | 348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) |
| 349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) | 349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) |
| 350 | SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) | 350 | SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) |
| 351 | SYSCALL(sys_process_vm_readv,sys_process_vm_readv,compat_sys_process_vm_readv_wrapper) /* 340 */ | ||
| 352 | SYSCALL(sys_process_vm_writev,sys_process_vm_writev,compat_sys_process_vm_writev_wrapper) | ||
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 77b8942b9a15..fdb5b8cb260f 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
| @@ -68,8 +68,10 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu) | |||
| 68 | return mask; | 68 | return mask; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static void add_cpus_to_mask(struct topology_cpu *tl_cpu, | 71 | static struct mask_info *add_cpus_to_mask(struct topology_cpu *tl_cpu, |
| 72 | struct mask_info *book, struct mask_info *core) | 72 | struct mask_info *book, |
| 73 | struct mask_info *core, | ||
| 74 | int z10) | ||
| 73 | { | 75 | { |
| 74 | unsigned int cpu; | 76 | unsigned int cpu; |
| 75 | 77 | ||
| @@ -88,10 +90,16 @@ static void add_cpus_to_mask(struct topology_cpu *tl_cpu, | |||
| 88 | cpu_book_id[lcpu] = book->id; | 90 | cpu_book_id[lcpu] = book->id; |
| 89 | #endif | 91 | #endif |
| 90 | cpumask_set_cpu(lcpu, &core->mask); | 92 | cpumask_set_cpu(lcpu, &core->mask); |
| 91 | cpu_core_id[lcpu] = core->id; | 93 | if (z10) { |
| 94 | cpu_core_id[lcpu] = rcpu; | ||
| 95 | core = core->next; | ||
| 96 | } else { | ||
| 97 | cpu_core_id[lcpu] = core->id; | ||
| 98 | } | ||
| 92 | smp_cpu_polarization[lcpu] = tl_cpu->pp; | 99 | smp_cpu_polarization[lcpu] = tl_cpu->pp; |
| 93 | } | 100 | } |
| 94 | } | 101 | } |
| 102 | return core; | ||
| 95 | } | 103 | } |
| 96 | 104 | ||
| 97 | static void clear_masks(void) | 105 | static void clear_masks(void) |
| @@ -123,18 +131,41 @@ static void tl_to_cores(struct sysinfo_15_1_x *info) | |||
| 123 | { | 131 | { |
| 124 | #ifdef CONFIG_SCHED_BOOK | 132 | #ifdef CONFIG_SCHED_BOOK |
| 125 | struct mask_info *book = &book_info; | 133 | struct mask_info *book = &book_info; |
| 134 | struct cpuid cpu_id; | ||
| 126 | #else | 135 | #else |
| 127 | struct mask_info *book = NULL; | 136 | struct mask_info *book = NULL; |
| 128 | #endif | 137 | #endif |
| 129 | struct mask_info *core = &core_info; | 138 | struct mask_info *core = &core_info; |
| 130 | union topology_entry *tle, *end; | 139 | union topology_entry *tle, *end; |
| 140 | int z10 = 0; | ||
| 131 | 141 | ||
| 132 | 142 | #ifdef CONFIG_SCHED_BOOK | |
| 143 | get_cpu_id(&cpu_id); | ||
| 144 | z10 = cpu_id.machine == 0x2097 || cpu_id.machine == 0x2098; | ||
| 145 | #endif | ||
| 133 | spin_lock_irq(&topology_lock); | 146 | spin_lock_irq(&topology_lock); |
| 134 | clear_masks(); | 147 | clear_masks(); |
| 135 | tle = info->tle; | 148 | tle = info->tle; |
| 136 | end = (union topology_entry *)((unsigned long)info + info->length); | 149 | end = (union topology_entry *)((unsigned long)info + info->length); |
| 137 | while (tle < end) { | 150 | while (tle < end) { |
| 151 | #ifdef CONFIG_SCHED_BOOK | ||
| 152 | if (z10) { | ||
| 153 | switch (tle->nl) { | ||
| 154 | case 1: | ||
| 155 | book = book->next; | ||
| 156 | book->id = tle->container.id; | ||
| 157 | break; | ||
| 158 | case 0: | ||
| 159 | core = add_cpus_to_mask(&tle->cpu, book, core, z10); | ||
| 160 | break; | ||
| 161 | default: | ||
| 162 | clear_masks(); | ||
| 163 | goto out; | ||
| 164 | } | ||
| 165 | tle = next_tle(tle); | ||
| 166 | continue; | ||
| 167 | } | ||
| 168 | #endif | ||
| 138 | switch (tle->nl) { | 169 | switch (tle->nl) { |
| 139 | #ifdef CONFIG_SCHED_BOOK | 170 | #ifdef CONFIG_SCHED_BOOK |
| 140 | case 2: | 171 | case 2: |
| @@ -147,7 +178,7 @@ static void tl_to_cores(struct sysinfo_15_1_x *info) | |||
| 147 | core->id = tle->container.id; | 178 | core->id = tle->container.id; |
| 148 | break; | 179 | break; |
| 149 | case 0: | 180 | case 0: |
| 150 | add_cpus_to_mask(&tle->cpu, book, core); | 181 | add_cpus_to_mask(&tle->cpu, book, core, z10); |
| 151 | break; | 182 | break; |
| 152 | default: | 183 | default: |
| 153 | clear_masks(); | 184 | clear_masks(); |
| @@ -328,8 +359,8 @@ void __init s390_init_cpu_topology(void) | |||
| 328 | for (i = 0; i < TOPOLOGY_NR_MAG; i++) | 359 | for (i = 0; i < TOPOLOGY_NR_MAG; i++) |
| 329 | printk(" %d", info->mag[i]); | 360 | printk(" %d", info->mag[i]); |
| 330 | printk(" / %d\n", info->mnest); | 361 | printk(" / %d\n", info->mnest); |
| 331 | alloc_masks(info, &core_info, 2); | 362 | alloc_masks(info, &core_info, 1); |
| 332 | #ifdef CONFIG_SCHED_BOOK | 363 | #ifdef CONFIG_SCHED_BOOK |
| 333 | alloc_masks(info, &book_info, 3); | 364 | alloc_masks(info, &book_info, 2); |
| 334 | #endif | 365 | #endif |
| 335 | } | 366 | } |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 56fe6bc81fee..e4c79ebb40e6 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
| @@ -43,6 +43,8 @@ SECTIONS | |||
| 43 | 43 | ||
| 44 | NOTES :text :note | 44 | NOTES :text :note |
| 45 | 45 | ||
| 46 | .dummy : { *(.dummy) } :data | ||
| 47 | |||
| 46 | RODATA | 48 | RODATA |
| 47 | 49 | ||
| 48 | #ifdef CONFIG_SHARED_KERNEL | 50 | #ifdef CONFIG_SHARED_KERNEL |
