From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11530 invoked by alias); 3 Mar 2003 14:30:17 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 11506 invoked from network); 3 Mar 2003 14:30:16 -0000 Received: from unknown (HELO d06lmsgate-5.uk.ibm.com) (195.212.29.5) by 172.16.49.205 with SMTP; 3 Mar 2003 14:30:16 -0000 Received: from d06relay02.portsmouth.uk.ibm.com (d06relay02.uk.ibm.com [9.166.84.148]) by d06lmsgate-5.uk.ibm.com (1.0.0) with ESMTP id OAA80280 for ; Mon, 3 Mar 2003 14:27:47 GMT Received: from dyn-9-152-242-64.boeblingen.de.ibm.com (dyn-9-152-242-64.boeblingen.de.ibm.com [9.152.242.64]) by d06relay02.portsmouth.uk.ibm.com (8.12.3/NCO/VER6.5) with ESMTP id h23EUCBo083264 for ; Mon, 3 Mar 2003 14:30:12 GMT From: Martin Schwidefsky Organization: IBM Deutschland GmbH To: libc-hacker@sources.redhat.com Subject: [PATCH] svc 0 for s390*. Date: Mon, 03 Mar 2003 14:30:00 -0000 User-Agent: KMail/1.5 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Message-Id: <200303031528.56685.schwidefsky@de.ibm.com> X-SW-Source: 2003-03/txt/msg00006.txt.bz2 Hi kernel 2.5.63 introduced 9 new system calls. This pushes the system call numbers on s390* over 256. The immediate system call number embedded in the svc instruction is limited to 256. This makes it necessary to introd= uce a second svc path. We will use the svc 0 and general purpose register %r1 for this. The new style system call will take two instructions instead of o= ne, e.g. "svc 42" will be "lhi %r1,42; svc0". The old style direct svcs will of course continue to work. Patch and ChangeLog for the glibc part of this are attached. blue skies, Martin. 2003-03-03 Martin Schwidefsky * sysdeps/unix/sysv/linux/s390/s390-32/syscall.S (syscall): Add support for system call numbers > 255. * sysdeps/unix/sysv/linux/s390/s390-32/syscall.h (DO_CALL, INLINE_SYSCALL, INTERNAL_SYSCALL_DIRECT, INTERNAL_SYSCALL_SVC0, INTERNAL_SYSCALL): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/syscall.S (syscall): Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/syscall.h (DO_CALL, INLINE_SYSCALL, INTERNAL_SYSCALL_DIRECT, INTERNAL_SYSCALL_SVC0, INTERNAL_SYSCALL): Likewise. diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S libc-s390/sys= deps/unix/sysv/linux/s390/s390-32/syscall.S --- libc/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S Fri Jul 6 06:56:19= 2001 +++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/syscall.S Mon Mar 3 10:= 59:47 2003 @@ -37,15 +37,19 @@ 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 numbe= r */ =20 - 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 */ =20 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) diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h libc-s390/sysd= eps/unix/sysv/linux/s390/s390-32/sysdep.h --- libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h Tue Jan 28 13:04:49 = 2003 +++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h Mon Mar 3 10:5= 9:47 2003 @@ -133,7 +133,12 @@ */ =20 #define DO_CALL(syscall, args) \ - svc SYS_ify (syscall) + .if SYS_ify (syscall) < 256; \ + svc SYS_ify (syscall); \ + .else; \ + lhi %r1,SYS_ify (syscall); \ + svc 0; \ + .endif =20 #define ret = \ br 14 @@ -154,8 +159,8 @@ #undef INTERNAL_SYSCALL_DECL #define INTERNAL_SYSCALL_DECL(err) do { } while (0) =20 -#undef INTERNAL_SYSCALL -#define INTERNAL_SYSCALL(name, err, nr, args...) \ +#undef INTERNAL_SYSCALL_DIRECT +#define INTERNAL_SYSCALL_DIRECT(name, err, nr, args...) \ ({ \ DECLARGS_##nr(args) \ register int _ret asm("2"); \ @@ -165,6 +170,25 @@ : "i" (__NR_##name) ASMFMT_##nr \ : "memory" ); \ _ret; }) + +#undef INTERNAL_SYSCALL_SVC0 +#define INTERNAL_SYSCALL_SVC0(name, err, nr, args...) \ + ({ \ + DECLARGS_##nr(args) \ + register unsigned long _nr asm("1") =3D (unsigned long)(__NR_##name); = \ + register int _ret asm("2"); \ + asm volatile ( \ + "svc 0\n\t" \ + : "=3Dd" (_ret) \ + : "d" (_nr), "i" (__NR_##name) ASMFMT_##nr \ + : "memory" ); \ + _ret; }) + +#undef INTERNAL_SYSCALL +#define INTERNAL_SYSCALL(name, err, nr, args...) \ + (((__NR_##name) < 256) ? \ + INTERNAL_SYSCALL_DIRECT(name, err, nr, args) : \ + INTERNAL_SYSCALL_SVC0(name, err,nr, args)) =20 #undef INTERNAL_SYSCALL_ERROR_P #define INTERNAL_SYSCALL_ERROR_P(val, err) \ diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S libc-s390/sys= deps/unix/sysv/linux/s390/s390-64/syscall.S --- libc/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S Tue Jan 28 13:04:49= 2003 +++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-64/syscall.S Mon Mar 3 10:= 59:47 2003 @@ -37,16 +37,20 @@ lgr %r4,%r5 /* Third parameter. */ lgr %r5,%r6 /* Fourth parameter. */ lg %r6,320(%r15) /* Fifth parameter. */ - basr %r7,0 -.L0: ex %r1,.L1-.L0(%r7) /* Lsb of R1 is subsituted as SVC number. = */ =20 - lg %r15,0(%r15) /* Load back chain. */ + basr %r7,0 +0: clg %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: lg %r15,0(%r15) /* load back chain */ lmg %r6,15,48(%r15) /* Load registers. */ =20 lghi %r0,-4095 clgr %r2,%r0 /* Check R2 for error. */ jgnl SYSCALL_ERROR_LABEL br %r14 /* Return to caller. */ -.L1: .word 0x0A00 /* Opcode for SVC 0. */ +4: .quad 256 PSEUDO_END (syscall) =20 diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h libc-s390/sysd= eps/unix/sysv/linux/s390/s390-64/sysdep.h --- libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h Tue Jan 28 13:04:49 = 2003 +++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h Mon Mar 3 10:5= 9:47 2003 @@ -122,7 +122,12 @@ */ =20 #define DO_CALL(syscall, args) \ - svc SYS_ify (syscall) + .if SYS_ify (syscall) < 256; \ + svc SYS_ify (syscall); \ + .else; \ + lghi %r1,SYS_ify (syscall); \ + svc 0; \ + .endif =20 #define ret \ br 14 @@ -143,8 +148,8 @@ #undef INTERNAL_SYSCALL_DECL #define INTERNAL_SYSCALL_DECL(err) do { } while (0) =20 -#undef INTERNAL_SYSCALL -#define INTERNAL_SYSCALL(name, err, nr, args...) \ +#undef INTERNAL_SYSCALL_DIRECT +#define INTERNAL_SYSCALL_DIRECT(name, err, nr, args...) \ ({ \ DECLARGS_##nr(args) \ register int _ret asm("2"); \ @@ -154,6 +159,25 @@ : "i" (__NR_##name) ASMFMT_##nr \ : "memory" ); \ _ret; }) + +#undef INTERNAL_SYSCALL_SVC0 +#define INTERNAL_SYSCALL_SVC0(name, err, nr, args...) \ + ({ \ + DECLARGS_##nr(args) \ + register unsigned long _nr asm("1") =3D (unsigned long)(__NR_##name); = \ + register int _ret asm("2"); \ + asm volatile ( \ + "svc 0\n\t" \ + : "=3Dd" (_ret) \ + : "d" (_nr), "i" (__NR_##name) ASMFMT_##nr \ + : "memory" ); \ + _ret; }) + +#undef INTERNAL_SYSCALL +#define INTERNAL_SYSCALL(name, err, nr, args...) \ + (((__NR_##name) < 256) ? \ + INTERNAL_SYSCALL_DIRECT(name, err, nr, args) : \ + INTERNAL_SYSCALL_SVC0(name, err,nr, args)) =20 #undef INTERNAL_SYSCALL_ERROR_P #define INTERNAL_SYSCALL_ERROR_P(val, err) \