summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/s390-32/syscall.S')
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/syscall.S14
1 files changed, 9 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
index f4f0beb31b..5455ec832d 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S
@@ -37,15 +37,19 @@ ENTRY (syscall)
lr %r4,%r5 /* third parameter */
lr %r5,%r6 /* fourth parameter */
l %r6,192(%r15) /* fifth parameter */
- basr %r7,0
-.L0: ex %r1,.L1-.L0(%r7) /* lsb of R1 is subsituted as SVC number */
- l %r15,0(0,%r15) /* load back chain */
- lm %r6,15,24(%r15) /* load registers */
+ basr %r7,0
+0: cl %r1,4f-0b(%r7) /* svc number < 256? */
+ jl 2f
+1: svc 0
+ j 3f
+2: ex %r1,1b-0b(%r7) /* lsb of R1 is subsituted as SVC number */
+3: l %r15,0(%r15) /* load back chain */
+ lm %r6,15,24(%r15) /* load registers */
lhi %r0,-4095
clr %r2,%r0 /* check R2 for error */
jnl SYSCALL_ERROR_LABEL
br %r14 /* return to caller */
-.L1: .word 0x0A00 /* opcode for SVC 0 */
+4: .long 256
PSEUDO_END (syscall)