s390/compat: correct ucontext layout for high gprs
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 11 Jun 2014 14:06:12 +0000 (16:06 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Jun 2014 08:31:40 +0000 (10:31 +0200)
The uc_sigmask definition in the kernel differs from the one in the
glibc, the kernel uc_sigmask has 64 bits while the glibc verison
is 1024 bits. The extension of the ucontext structure for 64-bit
register support for 31-bit compat processes added a new field
uc_gprs_high which starts 8 bytes after the uc_sigmask field.
As the glibc view of the ucontext assumes a size of 128 bytes for
uc_sigmask add a 120 byte padding to the kernel structure
ucontext_extended after the 8 byte uc_sigmask.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/uapi/asm/ucontext.h
arch/s390/kernel/compat_linux.h

index 200e06325c6a52448ac7926928940a62b24c5b90..3e077b2a470579af0cb0827c5ba3050fa373450c 100644 (file)
@@ -16,7 +16,9 @@ struct ucontext_extended {
        struct ucontext  *uc_link;
        stack_t           uc_stack;
        _sigregs          uc_mcontext;
-       unsigned long     uc_sigmask[2];
+       sigset_t          uc_sigmask;
+       /* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
+       unsigned char     __unused[128 - sizeof(sigset_t)];
        unsigned long     uc_gprs_high[16];
 };
 
@@ -27,7 +29,9 @@ struct ucontext {
        struct ucontext  *uc_link;
        stack_t           uc_stack;
        _sigregs          uc_mcontext;
-       sigset_t          uc_sigmask;   /* mask last for extensibility */
+       sigset_t          uc_sigmask;
+       /* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
+       unsigned char     __unused[128 - sizeof(sigset_t)];
 };
 
 #endif /* !_ASM_S390_UCONTEXT_H */
index 39ddfdb40ae86228c89f126b02e6f488ca1ae57e..70d4b7c4beaa92d1b85ec7b38373830b38aab3ee 100644 (file)
@@ -69,7 +69,9 @@ struct ucontext32 {
        __u32                   uc_link;        /* pointer */   
        compat_stack_t          uc_stack;
        _sigregs32              uc_mcontext;
-       compat_sigset_t         uc_sigmask;     /* mask last for extensibility */
+       compat_sigset_t         uc_sigmask;
+       /* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
+       unsigned char           __unused[128 - sizeof(compat_sigset_t)];
 };
 
 struct stat64_emu31;