s390/acrs: cleanup access register handling
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 5 Feb 2024 20:32:12 +0000 (21:32 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Mon, 12 Feb 2024 14:03:33 +0000 (15:03 +0100)
save_access_regs() and restore_access_regs() are only available by
including switch_to.h. This is done by a couple of C files, which have
nothing to do with switch_to(), but only need these functions.

Move both functions to a new header file and improve the implementation:

- Get rid of typedef

- Add memory access instrumentation support

- Use long displacement instructions lamy/stamy instead of lam/stam - all
  current users end up with better code because of this

Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/access-regs.h [new file with mode: 0644]
arch/s390/include/asm/switch_to.h
arch/s390/kernel/compat_signal.c
arch/s390/kernel/early.c
arch/s390/kernel/ptrace.c
arch/s390/kernel/signal.c
arch/s390/kernel/smp.c
arch/s390/kvm/gaccess.c
arch/s390/kvm/interrupt.c
arch/s390/kvm/kvm-s390.c

diff --git a/arch/s390/include/asm/access-regs.h b/arch/s390/include/asm/access-regs.h
new file mode 100644 (file)
index 0000000..1a6412d
--- /dev/null
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright IBM Corp. 1999, 2024
+ */
+
+#ifndef __ASM_S390_ACCESS_REGS_H
+#define __ASM_S390_ACCESS_REGS_H
+
+#include <linux/instrumented.h>
+#include <asm/sigcontext.h>
+
+struct access_regs {
+       unsigned int regs[NUM_ACRS];
+};
+
+static inline void save_access_regs(unsigned int *acrs)
+{
+       struct access_regs *regs = (struct access_regs *)acrs;
+
+       instrument_write(regs, sizeof(*regs));
+       asm volatile("stamy     0,15,%[regs]"
+                    : [regs] "=QS" (*regs)
+                    :
+                    : "memory");
+}
+
+static inline void restore_access_regs(unsigned int *acrs)
+{
+       struct access_regs *regs = (struct access_regs *)acrs;
+
+       instrument_read(regs, sizeof(*regs));
+       asm volatile("lamy      0,15,%[regs]"
+                    :
+                    : [regs] "QS" (*regs)
+                    : "memory");
+}
+
+#endif /* __ASM_S390_ACCESS_REGS_H */
index c61b2cc1a8a86a9508fe093a607d106ff0118be3..8b0ca7d5f8b6ebd4a059bbcefd864fee30a81abd 100644 (file)
 
 #include <linux/thread_info.h>
 #include <asm/fpu/api.h>
+#include <asm/access-regs.h>
 #include <asm/ptrace.h>
 #include <asm/guarded_storage.h>
 
 extern struct task_struct *__switch_to(void *, void *);
 extern void update_cr_regs(struct task_struct *task);
 
-static inline void save_access_regs(unsigned int *acrs)
-{
-       typedef struct { int _[NUM_ACRS]; } acrstype;
-
-       asm volatile("stam 0,15,%0" : "=Q" (*(acrstype *)acrs));
-}
-
-static inline void restore_access_regs(unsigned int *acrs)
-{
-       typedef struct { int _[NUM_ACRS]; } acrstype;
-
-       asm volatile("lam 0,15,%0" : : "Q" (*(acrstype *)acrs));
-}
-
 #define switch_to(prev, next, last) do {                               \
        /* save_fpu_regs() sets the CIF_FPU flag, which enforces        \
         * a restore of the floating point / vector registers as        \
index f8fc6c25d0510b1a813c422368cedf917eae089b..13f41cb497beb337485d8114ea9b18e77402f94e 100644 (file)
 #include <linux/tty.h>
 #include <linux/personality.h>
 #include <linux/binfmts.h>
+#include <asm/access-regs.h>
 #include <asm/ucontext.h>
 #include <linux/uaccess.h>
 #include <asm/lowcore.h>
-#include <asm/switch_to.h>
 #include <asm/vdso.h>
 #include <asm/fpu/api.h>
 #include "compat_linux.h"
index 2345ea332b97e21c99442d4e79883510bc9ae679..63d5b51cb45a474f3a857d3bab4ec3d6be7bd708 100644 (file)
@@ -19,6 +19,8 @@
 #include <linux/kernel.h>
 #include <asm/asm-extable.h>
 #include <linux/memblock.h>
+#include <asm/access-regs.h>
+#include <asm/fpu/api.h>
 #include <asm/diag.h>
 #include <asm/ebcdic.h>
 #include <asm/ipl.h>
@@ -31,7 +33,6 @@
 #include <asm/sclp.h>
 #include <asm/facility.h>
 #include <asm/boot_data.h>
-#include <asm/switch_to.h>
 #include "entry.h"
 
 #define decompressor_handled_param(param)                      \
index f1897a8bb221078cf3b0da87c1d614241e0544b9..d662ea9e54f5a70c1e69c76f051771c1dd41fca1 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/seccomp.h>
 #include <linux/compat.h>
 #include <trace/syscall.h>
+#include <asm/access-regs.h>
 #include <asm/page.h>
 #include <linux/uaccess.h>
 #include <asm/unistd.h>
index 43e9661cd715ceb5baea7b8261d6787f5cd3217c..1517aa70678b964ca83a3157ab3dd38b3c8254cf 100644 (file)
@@ -30,8 +30,8 @@
 #include <linux/compat.h>
 #include <asm/ucontext.h>
 #include <linux/uaccess.h>
+#include <asm/access-regs.h>
 #include <asm/lowcore.h>
-#include <asm/switch_to.h>
 #include <asm/vdso.h>
 #include "entry.h"
 
index c39d9f0d4b1c61cffa8284aceb347c5f8fedb959..f77a54e1e4bdce4be7f7f5a698d2c6295ee66dfe 100644 (file)
 #include <linux/sched/task_stack.h>
 #include <linux/crash_dump.h>
 #include <linux/kprobes.h>
+#include <asm/access-regs.h>
 #include <asm/asm-offsets.h>
 #include <asm/ctlreg.h>
 #include <asm/pfault.h>
 #include <asm/diag.h>
-#include <asm/switch_to.h>
 #include <asm/facility.h>
 #include <asm/ipl.h>
 #include <asm/setup.h>
index 5bfcc50c1a682893b9add045508fcbb3d4526338..d264aa81aa150475ba3f3b266c8b9559d78dcd21 100644 (file)
 #include <linux/err.h>
 #include <linux/pgtable.h>
 #include <linux/bitfield.h>
+#include <asm/access-regs.h>
 #include <asm/fault.h>
 #include <asm/gmap.h>
 #include "kvm-s390.h"
 #include "gaccess.h"
-#include <asm/switch_to.h>
 
 union asce {
        unsigned long val;
index fc4007cc067a688d7ce73e8911f50cc88a688507..6e435bf0c27ef176299f31884f917e939c382947 100644 (file)
 #include <linux/slab.h>
 #include <linux/bitmap.h>
 #include <linux/vmalloc.h>
+#include <asm/access-regs.h>
 #include <asm/asm-offsets.h>
 #include <asm/dis.h>
 #include <linux/uaccess.h>
 #include <asm/sclp.h>
 #include <asm/isc.h>
 #include <asm/gmap.h>
-#include <asm/switch_to.h>
 #include <asm/nmi.h>
 #include <asm/airq.h>
 #include <asm/tpi.h>
index ea63ac76988914d85bdfb7fdbe7bd209f4066741..6eab70b19abfc8d0be946d1dabf0617d891f503a 100644 (file)
 #include <linux/pgtable.h>
 #include <linux/mmu_notifier.h>
 
+#include <asm/access-regs.h>
 #include <asm/asm-offsets.h>
 #include <asm/lowcore.h>
 #include <asm/stp.h>
 #include <asm/gmap.h>
 #include <asm/nmi.h>
-#include <asm/switch_to.h>
 #include <asm/isc.h>
 #include <asm/sclp.h>
 #include <asm/cpacf.h>