]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
s390/ptrace: guarded storage regset for the current task
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 19 May 2017 13:32:09 +0000 (15:32 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 12 Jun 2017 14:25:59 +0000 (16:25 +0200)
The regset functions for guarded storage are supposed to work on
the current task as well. For task == current add the required
load and store instructions for the guarded storage control block.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/ptrace.c

index 488c5bb8dc77db162332a9c2351fd6ddc7b0dd2a..252ed61a128b8689a3cbacf592031adeeab5c6cc 100644 (file)
@@ -1160,6 +1160,8 @@ static int s390_gs_cb_get(struct task_struct *target,
                return -ENODEV;
        if (!data)
                return -ENODATA;
+       if (target == current)
+               save_gs_cb(data);
        return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
                                   data, 0, sizeof(struct gs_cb));
 }
@@ -1170,6 +1172,7 @@ static int s390_gs_cb_set(struct task_struct *target,
                          const void *kbuf, const void __user *ubuf)
 {
        struct gs_cb *data = target->thread.gs_cb;
+       int rc;
 
        if (!MACHINE_HAS_GS)
                return -ENODEV;
@@ -1177,10 +1180,18 @@ static int s390_gs_cb_set(struct task_struct *target,
                data = kzalloc(sizeof(*data), GFP_KERNEL);
                if (!data)
                        return -ENOMEM;
+               data->gsd = 25;
                target->thread.gs_cb = data;
+               if (target == current)
+                       __ctl_set_bit(2, 4);
+       } else if (target == current) {
+               save_gs_cb(data);
        }
-       return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
-                                 data, 0, sizeof(struct gs_cb));
+       rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
+                               data, 0, sizeof(struct gs_cb));
+       if (target == current)
+               restore_gs_cb(data);
+       return rc;
 }
 
 static int s390_gs_bc_get(struct task_struct *target,