On Mon, 20 Jul 2015 10:20:04 +0200 Ingo Molnar <mi...@kernel.org> wrote:
> > * Heiko Carstens <heiko.carst...@de.ibm.com> wrote: > > > Unfortunately not true. It breaks the build on s390 since a couple of > > displacements used in asm code now get too large: > > > > arch/s390/kernel/entry.S:181: Error: operand out of range > > (0x00000000000018a8 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > arch/s390/kernel/entry.S:191: Error: operand out of range > > (0x00000000000018a8 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > arch/s390/kernel/entry.S:423: Error: operand out of range > > (0x0000000000001924 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > arch/s390/kernel/entry.S:437: Error: operand out of range > > (0x00000000000018e8 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > arch/s390/kernel/entry.S:438: Error: operand out of range > > (0x00000000000018e0 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > arch/s390/kernel/entry.S:439: Error: operand out of range > > (0x00000000000018f0 is not between 0x0000000000000000 and > > 0x0000000000000fff) > > make[1]: *** [arch/s390/kernel/entry.o] Error 1 > > > > Let's see how we can fix this. > > Sorry about this! > > So I looked at the __switch_to() assembly, and the main complication appears > to be > that we have two uses of 'prev': > > lg %r4,__THREAD_info(%r2) # get thread_info of prev > > > stg %r15,__THREAD_ksp(%r2) # store kernel stack of prev > > the __THREAD_info offset is best expressed relative to task_struct - the > __THREAD_ksp offset is best expressed relative to thread_struct. > > I.e. I think the best fix would be to extend the signature of s390's > __switch_to() > from (prev,next) to (prev,next,prev_thread,next_thread). > > Is the C parameter mapping r2,r3,r4,r5? If yes then the patch below should do > the > trick. (Utterly untested.) > > Note: > > - I renamed __THREAD_info to __TASK_thread_info, to better separate > task_struct > and thread_struct offsets syntactically and visually. > > - I removed __THREAD_mm_segment which is unused > > I also looked at fixing pgm_check_handler(), but my s390-fu gave up > completely on > that one: task_struct is in 'r14', but this is a hardware entry function it > appears. So to fix it we'd have to pick a temporary register, put > thread_struct > pointer into it, and fix up these offsets: > > arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_per_address, offsetof(struct > task_struct, thread.per_event.address)); > arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_per_paid, offsetof(struct > task_struct, thread.per_event.paid)); > arch/s390/kernel/asm-offsets.c: DEFINE(__THREAD_trap_tdb, offsetof(struct > task_struct, thread.trap_tdb)); > > to be thread_struct relative. Just use the patch I've sent. No worries :-) -- blue skies, Martin. "Reality continues to ruin my life." - Calvin. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/