public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] svc 0 for s390*.
@ 2003-03-03 14:30 Martin Schwidefsky
  2003-03-03 18:32 ` Ulrich Drepper
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Schwidefsky @ 2003-03-03 14:30 UTC (permalink / raw)
  To: libc-hacker

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 introduce
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 one,
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  <schwidefsky@de.ibm.com>

	* 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/sysdeps/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 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)
diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h libc-s390/sysdeps/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:59:47 2003
@@ -133,7 +133,12 @@
  */
 
 #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
 
 #define ret                                                                   \
     br      14
@@ -154,8 +159,8 @@
 #undef INTERNAL_SYSCALL_DECL
 #define INTERNAL_SYSCALL_DECL(err) do { } while (0)
 
-#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") = (unsigned long)(__NR_##name);	      \
+    register int _ret asm("2");						      \
+    asm volatile (							      \
+    "svc    0\n\t"							      \
+    : "=d" (_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))
 
 #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/sysdeps/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.  */
 
-	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.  */
 
 	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)
 
diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h libc-s390/sysdeps/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:59:47 2003
@@ -122,7 +122,12 @@
  */
 
 #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
 
 #define ret								      \
     br	    14
@@ -143,8 +148,8 @@
 #undef INTERNAL_SYSCALL_DECL
 #define INTERNAL_SYSCALL_DECL(err) do { } while (0)
 
-#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") = (unsigned long)(__NR_##name);	      \
+    register int _ret asm("2");						      \
+    asm volatile (							      \
+    "svc    0\n\t"							      \
+    : "=d" (_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))
 
 #undef INTERNAL_SYSCALL_ERROR_P
 #define INTERNAL_SYSCALL_ERROR_P(val, err)				      \

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] svc 0 for s390*.
  2003-03-03 14:30 [PATCH] svc 0 for s390* Martin Schwidefsky
@ 2003-03-03 18:32 ` Ulrich Drepper
  0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2003-03-03 18:32 UTC (permalink / raw)
  To: Martin Schwidefsky; +Cc: libc-hacker

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martin Schwidefsky wrote:

> kernel 2.5.63 introduced 9 new system calls. This pushes the system call
> numbers on s390* over 256.

I've applied the patch.  Thanks,

- -- 
- --------------.                        ,-.            444 Castro Street
Ulrich Drepper \    ,-----------------'   \ Mountain View, CA 94041 USA
Red Hat         `--' drepper at redhat.com `---------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+Y5yC2ijCOnn/RHQRAqN1AJ4uOf7csL7J0xWCfRJZyseuq2IfhACdGrm0
RqYd0RlMER+KzuSDyYGKQAA=
=Y+ZJ
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-03-03 18:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-03 14:30 [PATCH] svc 0 for s390* Martin Schwidefsky
2003-03-03 18:32 ` Ulrich Drepper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).