s390/entry: fix svc number for TIF_SYSCALL system call restart
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 9 Oct 2012 11:33:53 +0000 (13:33 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 9 Oct 2012 12:17:02 +0000 (14:17 +0200)
The load of the svc number in the TIF_SYSCALL restart path needs to be
done with an instruction that loads all 64 bits of %r1, 'lh' only loads
32 bits. If the upper half of %r1 is not zero and has the msb set,
entry64.S will try to execute an svc with a really large number.
What will be in the upper half of %r1 depends on the code generated by
gcc for the functions on the do_signal() callchain.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/entry64.S

index 7549985..8f211ad 100644 (file)
@@ -295,7 +295,7 @@ sysc_sigpending:
        jno     sysc_return
        lmg     %r2,%r7,__PT_R2(%r11)   # load svc arguments
        lghi    %r8,0                   # svc 0 returns -ENOSYS
-       lh      %r1,__PT_INT_CODE+2(%r11)       # load new svc number
+       llgh    %r1,__PT_INT_CODE+2(%r11)       # load new svc number
        cghi    %r1,NR_syscalls
        jnl     sysc_nr_ok              # invalid svc number -> do svc 0
        slag    %r8,%r1,2