diff options
| -rw-r--r-- | arch/s390/kernel/asm-offsets.c | 15 | ||||
| -rw-r--r-- | arch/s390/kernel/entry.S | 13 | ||||
| -rw-r--r-- | arch/s390/kernel/traps.c | 4 |
3 files changed, 18 insertions, 14 deletions
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index c7d1b9d09011..a2da259d9327 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
| @@ -23,15 +23,15 @@ | |||
| 23 | 23 | ||
| 24 | int main(void) | 24 | int main(void) |
| 25 | { | 25 | { |
| 26 | DEFINE(__THREAD_info, offsetof(struct task_struct, stack)); | 26 | DEFINE(__TASK_thread_info, offsetof(struct task_struct, stack)); |
| 27 | DEFINE(__THREAD_ksp, offsetof(struct task_struct, thread.ksp)); | 27 | DEFINE(__TASK_thread, offsetof(struct task_struct, thread)); |
| 28 | DEFINE(__THREAD_mm_segment, offsetof(struct task_struct, thread.mm_segment)); | ||
| 29 | BLANK(); | ||
| 30 | DEFINE(__TASK_pid, offsetof(struct task_struct, pid)); | 28 | DEFINE(__TASK_pid, offsetof(struct task_struct, pid)); |
| 31 | BLANK(); | 29 | BLANK(); |
| 32 | DEFINE(__THREAD_per_cause, offsetof(struct task_struct, thread.per_event.cause)); | 30 | DEFINE(__THREAD_ksp, offsetof(struct thread_struct, ksp)); |
| 33 | DEFINE(__THREAD_per_address, offsetof(struct task_struct, thread.per_event.address)); | 31 | DEFINE(__THREAD_per_cause, offsetof(struct thread_struct, per_event.cause)); |
| 34 | DEFINE(__THREAD_per_paid, offsetof(struct task_struct, thread.per_event.paid)); | 32 | DEFINE(__THREAD_per_address, offsetof(struct thread_struct, per_event.address)); |
| 33 | DEFINE(__THREAD_per_paid, offsetof(struct thread_struct, per_event.paid)); | ||
| 34 | DEFINE(__THREAD_trap_tdb, offsetof(struct thread_struct, trap_tdb)); | ||
| 35 | BLANK(); | 35 | BLANK(); |
| 36 | DEFINE(__TI_task, offsetof(struct thread_info, task)); | 36 | DEFINE(__TI_task, offsetof(struct thread_info, task)); |
| 37 | DEFINE(__TI_flags, offsetof(struct thread_info, flags)); | 37 | DEFINE(__TI_flags, offsetof(struct thread_info, flags)); |
| @@ -176,7 +176,6 @@ int main(void) | |||
| 176 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); | 176 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); |
| 177 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); | 177 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); |
| 178 | DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); | 178 | DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); |
| 179 | DEFINE(__THREAD_trap_tdb, offsetof(struct task_struct, thread.trap_tdb)); | ||
| 180 | DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce)); | 179 | DEFINE(__GMAP_ASCE, offsetof(struct gmap, asce)); |
| 181 | DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c)); | 180 | DEFINE(__SIE_PROG0C, offsetof(struct kvm_s390_sie_block, prog0c)); |
| 182 | DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20)); | 181 | DEFINE(__SIE_PROG20, offsetof(struct kvm_s390_sie_block, prog20)); |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 3238893c9d4f..84062e7a77da 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
| @@ -178,17 +178,21 @@ _PIF_WORK = (_PIF_PER_TRAP) | |||
| 178 | */ | 178 | */ |
| 179 | ENTRY(__switch_to) | 179 | ENTRY(__switch_to) |
| 180 | stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task | 180 | stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task |
| 181 | stg %r15,__THREAD_ksp(%r2) # store kernel stack of prev | 181 | lgr %r1,%r2 |
| 182 | lg %r4,__THREAD_info(%r2) # get thread_info of prev | 182 | aghi %r1,__TASK_thread # thread_struct of prev task |
| 183 | lg %r5,__THREAD_info(%r3) # get thread_info of next | 183 | lg %r4,__TASK_thread_info(%r2) # get thread_info of prev |
| 184 | lg %r5,__TASK_thread_info(%r3) # get thread_info of next | ||
| 185 | stg %r15,__THREAD_ksp(%r1) # store kernel stack of prev | ||
| 186 | lgr %r1,%r3 | ||
| 187 | aghi %r1,__TASK_thread # thread_struct of next task | ||
| 184 | lgr %r15,%r5 | 188 | lgr %r15,%r5 |
| 185 | aghi %r15,STACK_INIT # end of kernel stack of next | 189 | aghi %r15,STACK_INIT # end of kernel stack of next |
| 186 | stg %r3,__LC_CURRENT # store task struct of next | 190 | stg %r3,__LC_CURRENT # store task struct of next |
| 187 | stg %r5,__LC_THREAD_INFO # store thread info of next | 191 | stg %r5,__LC_THREAD_INFO # store thread info of next |
| 188 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack | 192 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack |
| 193 | lg %r15,__THREAD_ksp(%r1) # load kernel stack of next | ||
| 189 | lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 | 194 | lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 |
| 190 | mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next | 195 | mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next |
| 191 | lg %r15,__THREAD_ksp(%r3) # load kernel stack of next | ||
| 192 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task | 196 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task |
| 193 | br %r14 | 197 | br %r14 |
| 194 | 198 | ||
| @@ -417,6 +421,7 @@ ENTRY(pgm_check_handler) | |||
| 417 | LAST_BREAK %r14 | 421 | LAST_BREAK %r14 |
| 418 | lg %r15,__LC_KERNEL_STACK | 422 | lg %r15,__LC_KERNEL_STACK |
| 419 | lg %r14,__TI_task(%r12) | 423 | lg %r14,__TI_task(%r12) |
| 424 | aghi %r14,__TASK_thread # pointer to thread_struct | ||
| 420 | lghi %r13,__LC_PGM_TDB | 425 | lghi %r13,__LC_PGM_TDB |
| 421 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort | 426 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort |
| 422 | jz 2f | 427 | jz 2f |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 4d96c9f53455..7bea81d8a363 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
| @@ -259,7 +259,7 @@ void vector_exception(struct pt_regs *regs) | |||
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | /* get vector interrupt code from fpc */ | 261 | /* get vector interrupt code from fpc */ |
| 262 | asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); | 262 | asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc)); |
| 263 | vic = (current->thread.fp_regs.fpc & 0xf00) >> 8; | 263 | vic = (current->thread.fp_regs.fpc & 0xf00) >> 8; |
| 264 | switch (vic) { | 264 | switch (vic) { |
| 265 | case 1: /* invalid vector operation */ | 265 | case 1: /* invalid vector operation */ |
| @@ -297,7 +297,7 @@ void data_exception(struct pt_regs *regs) | |||
| 297 | 297 | ||
| 298 | location = get_trap_ip(regs); | 298 | location = get_trap_ip(regs); |
| 299 | 299 | ||
| 300 | asm volatile("stfpc %0" : "=m" (current->thread.fp_regs.fpc)); | 300 | asm volatile("stfpc %0" : "=Q" (current->thread.fp_regs.fpc)); |
| 301 | /* Check for vector register enablement */ | 301 | /* Check for vector register enablement */ |
| 302 | if (MACHINE_HAS_VX && !current->thread.vxrs && | 302 | if (MACHINE_HAS_VX && !current->thread.vxrs && |
| 303 | (current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) { | 303 | (current->thread.fp_regs.fpc & FPC_DXC_MASK) == 0xfe00) { |
