diff -u -r --new-file libc/linuxthreads/sysdeps/s390/pt-machine.h libc-s390/linuxthreads/sysdeps/s390/pt-machine.h --- libc/linuxthreads/sysdeps/s390/pt-machine.h Thu Sep 28 23:03:19 2000 +++ libc-s390/linuxthreads/sysdeps/s390/pt-machine.h Thu Sep 28 17:30:05 2000 @@ -30,12 +30,13 @@ int ret; __asm__ __volatile__( + " la 1,%1\n" " lhi 0,1\n" " l %0,%1\n" - "0: cs %0,0,%1\n" + "0: cs %0,0,0(1)\n" " jl 0b" : "=&d" (ret), "+m" (*spinlock) - : : "0", "cc"); + : : "0", "1", "cc"); return ret; } @@ -46,7 +47,26 @@ #define CURRENT_STACK_FRAME stack_pointer register char * stack_pointer __asm__ ("15"); +/* Return the thread descriptor for the current thread. + S/390 registers uses access register 0 as "thread register". */ +#define THREAD_SELF ({ \ + register pthread_descr __self; \ + __asm__ ("ear %0,%%a0" : "=d" (__self) ); \ + __self; \ +}) + +/* Initialize the thread-unique value. */ +#define INIT_THREAD_SELF(descr, nr) ({ \ + __asm__ ("sar %%a0,%0" : : "d" (descr) ); \ +}) + +/* Access to data in the thread descriptor is easy. */ +#define THREAD_GETMEM(descr, member) THREAD_SELF->member +#define THREAD_GETMEM_NC(descr, member) THREAD_SELF->member +#define THREAD_SETMEM(descr, member, value) THREAD_SELF->member = (value) +#define THREAD_SETMEM_NC(descr, member, value) THREAD_SELF->member = (value) + /* Compare-and-swap for semaphores. */ #define HAS_COMPARE_AND_SWAP @@ -57,14 +77,15 @@ int retval; __asm__ __volatile__( + " la 1,%1\n" " lr 0,%2\n" - " cs 0,%3,%1\n" + " cs 0,%3,0(1)\n" " ipm %0\n" " srl %0,28\n" "0:" : "=&d" (retval), "+m" (*p) : "d" (oldval) , "d" (newval) - : "cc", "0"); + : "cc", "0", "1" ); return retval == 0; } diff -u -r --new-file libc/sysdeps/s390/atomicity.h libc-s390/sysdeps/s390/atomicity.h --- libc/sysdeps/s390/atomicity.h Thu Sep 28 23:03:50 2000 +++ libc-s390/sysdeps/s390/atomicity.h Thu Sep 28 22:52:12 2000 @@ -61,13 +61,15 @@ int retval; __asm__ __volatile__( - " cs %2,%3,%1\n" + " la 1,%1\n" + " lr 0,%2\n" + " cs 0,%3,0(1)\n" " ipm %0\n" " srl %0,28\n" "0:" : "=&r" (retval), "+m" (*p) : "d" (oldval) , "d" (newval) - : "memory", "cc"); + : "memory", "0", "1", "cc"); return !retval; } diff -u -r --new-file libc/sysdeps/unix/sysv/linux/s390/bits/fcntl.h libc-s390/sysdeps/unix/sysv/linux/s390/bits/fcntl.h --- libc/sysdeps/unix/sysv/linux/s390/bits/fcntl.h Thu Sep 28 23:04:12 2000 +++ libc-s390/sysdeps/unix/sysv/linux/s390/bits/fcntl.h Tue Sep 19 14:05:09 2000 @@ -65,14 +65,18 @@ #define F_SETFD 2 /* Set file descriptor flags. */ #define F_GETFL 3 /* Get file status flags. */ #define F_SETFL 4 /* Set file status flags. */ +#ifndef __USE_FILE_OFFSET64 #define F_GETLK 5 /* Get record locking info. */ #define F_SETLK 6 /* Set record locking info (non-blocking). */ #define F_SETLKW 7 /* Set record locking info (blocking). */ - -/* XXX missing */ -#define F_GETLK64 5 /* Get record locking info. */ -#define F_SETLK64 6 /* Set record locking info (non-blocking). */ -#define F_SETLKW64 7 /* Set record locking info (blocking). */ +#else +# define F_GETLK F_GETLK64 /* Get record locking info. */ +# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/ +# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */ +#endif +#define F_GETLK64 12 /* Get record locking info. */ +#define F_SETLK64 13 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 14 /* Set record locking info (blocking). */ #if defined __USE_BSD || defined __USE_XOPEN2K # define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */ diff -u -r --new-file libc/sysdeps/unix/sysv/linux/s390/sys/procfs.h libc-s390/sysdeps/unix/sysv/linux/s390/sys/procfs.h --- libc/sysdeps/unix/sysv/linux/s390/sys/procfs.h Thu Sep 28 23:04:23 2000 +++ libc-s390/sysdeps/unix/sysv/linux/s390/sys/procfs.h Mon Sep 25 21:54:34 2000 @@ -32,31 +32,15 @@ #include #include #include +#include __BEGIN_DECLS -/* Type for a general-purpose register. */ -typedef unsigned long elf_greg_t; - -/* And the whole bunch of them. We should have used `struct s390_regs', - but to avoid name space pollution and since the tradition says that - the register set is an array, we make elf_gregset_t a simple array - that has the same size as s390_regs. */ -#define ELF_NGREG 35 -typedef elf_greg_t elf_gregset_t[ELF_NGREG]; - -typedef union -{ - double d; - float f; -} elf_fpreg_t; - -/* Register set for the floating-point registers. */ -typedef struct { - unsigned int fpc; - elf_fpreg_t fprs[NUM_FPRS]; -} elf_fpregset_t; - +typedef greg_t elf_greg_t; +#define ELF_NGREG NGREG +typedef gregset_t elf_gregset_t; +typedef fpreg_t elf_fpreg_t; +typedef fpregset_t elf_fpregset_t; /* Signal info. */ struct elf_siginfo diff -u -r --new-file libc/sysdeps/unix/sysv/linux/s390/sys/ucontext.h libc-s390/sysdeps/unix/sysv/linux/s390/sys/ucontext.h --- libc/sysdeps/unix/sysv/linux/s390/sys/ucontext.h Thu Sep 28 23:04:24 2000 +++ libc-s390/sysdeps/unix/sysv/linux/s390/sys/ucontext.h Thu Sep 28 17:01:35 2000 @@ -19,7 +19,9 @@ #ifndef _SYS_UCONTEXT_H #define _SYS_UCONTEXT_H 1 - +/* Forward definition to avoid parse errors */ +struct ucontext; +typedef struct ucontext ucontext_t; #include #include @@ -28,62 +30,39 @@ #include -/* Type for general register. */ -typedef int greg_t; +/* Type for a general-purpose register. */ +typedef unsigned long greg_t; -/* Number of general registers. */ -#define NGREG 16 +/* And the whole bunch of them. We should have used `struct s390_regs', + but to avoid name space pollution and since the tradition says that + the register set is an array, we make gregset_t a simple array + that has the same size as s390_regs. */ +#define NGREG 36 +#define NUM_FPRS 16 +typedef greg_t gregset_t[NGREG]; -/* Number of each register is the `gregset_t' array. */ -enum +typedef union { - GPR0 = 0, -#define GPR0 GPR0 - GPR1, -#define GPR1 GPR1 - GPR2, -#define GPR2 GPR2 - GPR3, -#define GPR3 GPR3 - GPR4, -#define GPR4 GPR4 - GPR5, -#define GPR5 GPR5 - GPR6, -#define GPR6 GPR6 - GPR7, -#define GPR7 GPR7 - GPR8, -#define GPR8 GPR8 - GPR9, -#define GPR9 GPR9 - GPRA, -#define GPRA GPRA - GPRB, -#define GPRB GPRB - GPRC, -#define GPRC GPRC - GPRD, -#define GPRD GPRD - GPRE, -#define GPRE GPRE - GPRF -#define GPRF GPRF -}; - -/* Structure to describe FPU registers. */ -typedef long long fpreg_t; + double d; + float f; +} fpreg_t; + +/* Register set for the floating-point registers. */ +typedef struct { + unsigned int fpc; + fpreg_t fprs[NUM_FPRS]; +} fpregset_t; /* Context to describe whole processor state. */ typedef struct { int version; - greg_t gregs[NGREG]; - fpreg_t fpregs[16]; + gregset_t gregs; + fpregset_t fpregs; } mcontext_t; /* Userlevel context. */ -typedef struct ucontext +struct ucontext { unsigned long int uc_flags; struct ucontext *uc_links; @@ -91,6 +70,7 @@ stack_t uc_stack; mcontext_t uc_mcontext; long int uc_filler[170]; - } ucontext_t; + }; + #endif /* sys/ucontext.h */