diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h | 25 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h | 13 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h | 25 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h | 13 |
8 files changed, 52 insertions, 36 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S index cd0dfeb527..2578b3ddc0 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S @@ -62,6 +62,9 @@ ENTRY(__getcontext) /* Set __getcontext return value to 0. */ slr %r2,%r2 + /* Store access registers. */ + stam %a0,%a15,SC_ACRS(%r5) + /* Store general purpose registers. */ stm %r0,%r15,SC_GPRS(%r5) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S index 7d4fee258c..7ad360a3a0 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S @@ -59,6 +59,9 @@ ENTRY(__setcontext) ld %f14,SC_FPRS+112(%r5) ld %f15,SC_FPRS+120(%r5) + /* Don't touch %a0, used for thread purposes. */ + lam %a1,%a15,SC_ACRS+4(%r5) + /* Load general purpose registers. */ lm %r0,%r15,SC_GPRS(%r5) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h index a47e247c53..d59b885f15 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sys/ucontext.h @@ -29,18 +29,19 @@ typedef struct ucontext ucontext_t; included in <signal.h>. */ #include <bits/sigcontext.h> +/* Type for a program status word. */ +typedef struct +{ + unsigned long mask; + unsigned long addr; +} __psw_t __attribute__ ((aligned(8)));; /* Type for a general-purpose register. */ typedef unsigned long 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 gregset_t a simple array - that has the same size as s390_regs. */ -#define NGREG 36 -#define NUM_FPRS 16 -/* Must match kernels psw_t alignment */ -typedef greg_t gregset_t[NGREG] __attribute__ ((aligned(8))); +#define NGREG 16 + +typedef greg_t gregset_t[NGREG]; typedef union { @@ -51,14 +52,15 @@ typedef union /* Register set for the floating-point registers. */ typedef struct { unsigned int fpc; - fpreg_t fprs[NUM_FPRS]; + fpreg_t fprs[16]; } fpregset_t; /* Context to describe whole processor state. */ typedef struct { - int version; + __psw_t psw; gregset_t gregs; + unsigned int aregs[16]; fpregset_t fpregs; } mcontext_t; @@ -67,10 +69,9 @@ struct ucontext { unsigned long int uc_flags; struct ucontext *uc_link; - __sigset_t uc_sigmask; stack_t uc_stack; mcontext_t uc_mcontext; - long int uc_filler[170]; + __sigset_t uc_sigmask; }; diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h b/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h index 644615a48f..2e51f04e65 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/ucontext_i.h @@ -26,9 +26,10 @@ #define SC_FLGS 0x000 #define SC_LINK 0x004 -#define SC_MASK 0x008 -#define SC_STCK 0x088 -#define SC_VERS 0x098 -#define SC_GPRS 0x0a0 -#define SC_FPC 0x130 -#define SC_FPRS 0x138 +#define SC_STCK 0x008 +#define SC_PSW 0x018 +#define SC_GPRS 0x020 +#define SC_ACRS 0x060 +#define SC_FPC 0x0A0 +#define SC_FPRS 0x0A8 +#define SC_MASK 0x128 diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S index 66bc882f9b..314df282ce 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S @@ -62,6 +62,9 @@ ENTRY(__getcontext) /* Set __getcontext return value to 0. */ slr %r2,%r2 + /* Store access registers. */ + stam %a0,%a15,SC_ACRS(%r5) + /* Store general purpose registers. */ stmg %r0,%r15,SC_GPRS(%r5) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S index aa1f05211c..268f36e713 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S +++ b/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S @@ -58,6 +58,9 @@ ENTRY(__setcontext) ld %f13,SC_FPRS+104(%r5) ld %f14,SC_FPRS+112(%r5) ld %f15,SC_FPRS+120(%r5) + + /* Don't touch %a0 and %a1, used for thread purposes. */ + lam %a2,%a15,SC_ACRS+8(%r5) /* Load general purpose registers. */ lmg %r0,%r15,SC_GPRS(%r5) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h index 65b2a7998e..6ce7c8a1ee 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sys/ucontext.h @@ -29,18 +29,19 @@ typedef struct ucontext ucontext_t; included in <signal.h>. */ #include <bits/sigcontext.h> +/* Type for a program status word. */ +typedef struct +{ + unsigned long mask; + unsigned long addr; +} __psw_t __attribute__ ((aligned(8))); /* Type for a general-purpose register. */ typedef unsigned long 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 gregset_t a simple array - that has the same size as s390_regs. */ -#define NGREG 27 -#define NUM_FPRS 16 -/* Must match kernels psw_t alignment */ -typedef greg_t gregset_t[NGREG] __attribute__ ((aligned(8))); +#define NGREG 16 + +typedef greg_t gregset_t[NGREG]; typedef union { @@ -51,14 +52,15 @@ typedef union /* Register set for the floating-point registers. */ typedef struct { unsigned int fpc; - fpreg_t fprs[NUM_FPRS]; + fpreg_t fprs[16]; } fpregset_t; /* Context to describe whole processor state. */ typedef struct { - int version; + __psw_t psw; gregset_t gregs; + unsigned int aregs[16]; fpregset_t fpregs; } mcontext_t; @@ -67,10 +69,9 @@ struct ucontext { unsigned long int uc_flags; struct ucontext *uc_link; - __sigset_t uc_sigmask; stack_t uc_stack; mcontext_t uc_mcontext; - long int uc_filler[170]; + __sigset_t uc_sigmask; }; diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h b/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h index cb9c8f4bdb..6d223a08a6 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/ucontext_i.h @@ -26,10 +26,11 @@ #define SC_FLGS 0x000 #define SC_LINK 0x008 -#define SC_MASK 0x010 -#define SC_STCK 0x090 -#define SC_VERS 0x0a8 -#define SC_GPRS 0x0b0 -#define SC_FPC 0x188 -#define SC_FPRS 0x190 +#define SC_STCK 0x010 +#define SC_PSW 0x028 +#define SC_GPRS 0x038 +#define SC_ACRS 0x0B8 +#define SC_FPC 0x0F8 +#define SC_FPRS 0x100 +#define SC_MASK 0x180 |