s390/kprobes,ptrace: open code struct per_reg
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 11 Sep 2023 19:40:02 +0000 (21:40 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 19 Sep 2023 11:26:56 +0000 (13:26 +0200)
Open code struct per_regs within kprobes and ptrace code, since at both
locations a struct per_regs is passed to __local_ctl_load() and
__local_ctl_store() which prevents to implement type checking for both
functions.

Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/kprobes.c
arch/s390/kernel/ptrace.c

index ef556b93596d57979e0590bd9482cf32de297fb3..d4c2ece4f83970aeedc2456e98491a8ff2dd8875 100644 (file)
@@ -224,7 +224,14 @@ static void enable_singlestep(struct kprobe_ctlblk *kcb,
                              struct pt_regs *regs,
                              unsigned long ip)
 {
-       struct per_regs per_kprobe;
+       union {
+               unsigned long regs[3];
+               struct {
+                       unsigned long control;
+                       unsigned long start;
+                       unsigned long end;
+               };
+       } per_kprobe;
 
        /* Set up the PER control registers %cr9-%cr11 */
        per_kprobe.control = PER_EVENT_IFETCH;
@@ -237,7 +244,7 @@ static void enable_singlestep(struct kprobe_ctlblk *kcb,
                (PSW_MASK_PER | PSW_MASK_IO | PSW_MASK_EXT);
 
        /* Set PER control regs, turns on single step for the given address */
-       __local_ctl_load(9, 11, per_kprobe);
+       __local_ctl_load(9, 11, per_kprobe.regs);
        regs->psw.mask |= PSW_MASK_PER;
        regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
        regs->psw.addr = ip;
index c03fda09f68922ead8280384987919d0bcdc35f5..1e1de907f24d374e5626a4eac3e79632155b93f9 100644 (file)
@@ -41,10 +41,17 @@ void update_cr_regs(struct task_struct *task)
 {
        struct pt_regs *regs = task_pt_regs(task);
        struct thread_struct *thread = &task->thread;
-       struct per_regs old, new;
        union ctlreg0 cr0_old, cr0_new;
        union ctlreg2 cr2_old, cr2_new;
        int cr0_changed, cr2_changed;
+       union {
+               unsigned long regs[3];
+               struct {
+                       unsigned long control;
+                       unsigned long start;
+                       unsigned long end;
+               };
+       } old, new;
 
        local_ctl_store(0, &cr0_old.val);
        local_ctl_store(2, &cr2_old.val);
@@ -104,9 +111,9 @@ void update_cr_regs(struct task_struct *task)
                return;
        }
        regs->psw.mask |= PSW_MASK_PER;
-       __local_ctl_store(9, 11, old);
+       __local_ctl_store(9, 11, old.regs);
        if (memcmp(&new, &old, sizeof(struct per_regs)) != 0)
-               __local_ctl_load(9, 11, new);
+               __local_ctl_load(9, 11, new.regs);
 }
 
 void user_enable_single_step(struct task_struct *task)