]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/kvm: Move bitfields for dat tables
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Wed, 3 Jul 2024 15:59:00 +0000 (17:59 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 10 Jul 2024 17:50:45 +0000 (19:50 +0200)
Move and improve the struct definitions for DAT tables from gaccess.c
to a new header.

Once in a separate header, the structs become available everywhere. One
possible usecase is to merge them in the s390 pte_t and p?d_t
definitions, which is left as an exercise for the reader.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Link: https://lore.kernel.org/r/20240703155900.103783-3-imbrenda@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/dat-bits.h [new file with mode: 0644]
arch/s390/kvm/gaccess.c

diff --git a/arch/s390/include/asm/dat-bits.h b/arch/s390/include/asm/dat-bits.h
new file mode 100644 (file)
index 0000000..8d65eec
--- /dev/null
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * DAT table and related structures
+ *
+ * Copyright IBM Corp. 2024
+ *
+ */
+
+#ifndef _S390_DAT_BITS_H
+#define _S390_DAT_BITS_H
+
+union asce {
+       unsigned long val;
+       struct {
+               unsigned long rsto: 52;/* Region- or Segment-Table Origin */
+               unsigned long     : 2;
+               unsigned long g   : 1; /* Subspace Group control */
+               unsigned long p   : 1; /* Private Space control */
+               unsigned long s   : 1; /* Storage-Alteration-Event control */
+               unsigned long x   : 1; /* Space-Switch-Event control */
+               unsigned long r   : 1; /* Real-Space control */
+               unsigned long     : 1;
+               unsigned long dt  : 2; /* Designation-Type control */
+               unsigned long tl  : 2; /* Region- or Segment-Table Length */
+       };
+};
+
+enum {
+       ASCE_TYPE_SEGMENT = 0,
+       ASCE_TYPE_REGION3 = 1,
+       ASCE_TYPE_REGION2 = 2,
+       ASCE_TYPE_REGION1 = 3
+};
+
+union region1_table_entry {
+       unsigned long val;
+       struct {
+               unsigned long rto: 52;/* Region-Table Origin */
+               unsigned long    : 2;
+               unsigned long p  : 1; /* DAT-Protection Bit */
+               unsigned long    : 1;
+               unsigned long tf : 2; /* Region-Second-Table Offset */
+               unsigned long i  : 1; /* Region-Invalid Bit */
+               unsigned long    : 1;
+               unsigned long tt : 2; /* Table-Type Bits */
+               unsigned long tl : 2; /* Region-Second-Table Length */
+       };
+};
+
+union region2_table_entry {
+       unsigned long val;
+       struct {
+               unsigned long rto: 52;/* Region-Table Origin */
+               unsigned long    : 2;
+               unsigned long p  : 1; /* DAT-Protection Bit */
+               unsigned long    : 1;
+               unsigned long tf : 2; /* Region-Third-Table Offset */
+               unsigned long i  : 1; /* Region-Invalid Bit */
+               unsigned long    : 1;
+               unsigned long tt : 2; /* Table-Type Bits */
+               unsigned long tl : 2; /* Region-Third-Table Length */
+       };
+};
+
+struct region3_table_entry_fc0 {
+       unsigned long sto: 52;/* Segment-Table Origin */
+       unsigned long    : 1;
+       unsigned long fc : 1; /* Format-Control */
+       unsigned long p  : 1; /* DAT-Protection Bit */
+       unsigned long    : 1;
+       unsigned long tf : 2; /* Segment-Table Offset */
+       unsigned long i  : 1; /* Region-Invalid Bit */
+       unsigned long cr : 1; /* Common-Region Bit */
+       unsigned long tt : 2; /* Table-Type Bits */
+       unsigned long tl : 2; /* Segment-Table Length */
+};
+
+struct region3_table_entry_fc1 {
+       unsigned long rfaa: 33;/* Region-Frame Absolute Address */
+       unsigned long     : 14;
+       unsigned long av  : 1; /* ACCF-Validity Control */
+       unsigned long acc : 4; /* Access-Control Bits */
+       unsigned long f   : 1; /* Fetch-Protection Bit */
+       unsigned long fc  : 1; /* Format-Control */
+       unsigned long p   : 1; /* DAT-Protection Bit */
+       unsigned long iep : 1; /* Instruction-Execution-Protection */
+       unsigned long     : 2;
+       unsigned long i   : 1; /* Region-Invalid Bit */
+       unsigned long cr  : 1; /* Common-Region Bit */
+       unsigned long tt  : 2; /* Table-Type Bits */
+       unsigned long     : 2;
+};
+
+union region3_table_entry {
+       unsigned long val;
+       struct region3_table_entry_fc0 fc0;
+       struct region3_table_entry_fc1 fc1;
+       struct {
+               unsigned long   : 53;
+               unsigned long fc: 1; /* Format-Control */
+               unsigned long   : 4;
+               unsigned long i : 1; /* Region-Invalid Bit */
+               unsigned long cr: 1; /* Common-Region Bit */
+               unsigned long tt: 2; /* Table-Type Bits */
+               unsigned long   : 2;
+       };
+};
+
+struct segment_table_entry_fc0 {
+       unsigned long pto: 53;/* Page-Table Origin */
+       unsigned long fc : 1; /* Format-Control */
+       unsigned long p  : 1; /* DAT-Protection Bit */
+       unsigned long    : 3;
+       unsigned long i  : 1; /* Segment-Invalid Bit */
+       unsigned long cs : 1; /* Common-Segment Bit */
+       unsigned long tt : 2; /* Table-Type Bits */
+       unsigned long    : 2;
+};
+
+struct segment_table_entry_fc1 {
+       unsigned long sfaa: 44;/* Segment-Frame Absolute Address */
+       unsigned long     : 3;
+       unsigned long av  : 1; /* ACCF-Validity Control */
+       unsigned long acc : 4; /* Access-Control Bits */
+       unsigned long f   : 1; /* Fetch-Protection Bit */
+       unsigned long fc  : 1; /* Format-Control */
+       unsigned long p   : 1; /* DAT-Protection Bit */
+       unsigned long iep : 1; /* Instruction-Execution-Protection */
+       unsigned long     : 2;
+       unsigned long i   : 1; /* Segment-Invalid Bit */
+       unsigned long cs  : 1; /* Common-Segment Bit */
+       unsigned long tt  : 2; /* Table-Type Bits */
+       unsigned long     : 2;
+};
+
+union segment_table_entry {
+       unsigned long val;
+       struct segment_table_entry_fc0 fc0;
+       struct segment_table_entry_fc1 fc1;
+       struct {
+               unsigned long   : 53;
+               unsigned long fc: 1; /* Format-Control */
+               unsigned long   : 4;
+               unsigned long i : 1; /* Segment-Invalid Bit */
+               unsigned long cs: 1; /* Common-Segment Bit */
+               unsigned long tt: 2; /* Table-Type Bits */
+               unsigned long   : 2;
+       };
+};
+
+union page_table_entry {
+       unsigned long val;
+       struct {
+               unsigned long pfra: 52;/* Page-Frame Real Address */
+               unsigned long z   : 1; /* Zero Bit */
+               unsigned long i   : 1; /* Page-Invalid Bit */
+               unsigned long p   : 1; /* DAT-Protection Bit */
+               unsigned long iep : 1; /* Instruction-Execution-Protection */
+               unsigned long     : 8;
+       };
+};
+
+enum {
+       TABLE_TYPE_SEGMENT = 0,
+       TABLE_TYPE_REGION3 = 1,
+       TABLE_TYPE_REGION2 = 2,
+       TABLE_TYPE_REGION1 = 3
+};
+
+#endif /* _S390_DAT_BITS_H */
index 5bf3d94e9ddaa98857eb2ecdfb670e14f79d22ab..e65f597e3044a76f2a29fc9aeff84998cc3534da 100644 (file)
 #include <asm/access-regs.h>
 #include <asm/fault.h>
 #include <asm/gmap.h>
+#include <asm/dat-bits.h>
 #include "kvm-s390.h"
 #include "gaccess.h"
 
-union asce {
-       unsigned long val;
-       struct {
-               unsigned long origin : 52; /* Region- or Segment-Table Origin */
-               unsigned long    : 2;
-               unsigned long g  : 1; /* Subspace Group Control */
-               unsigned long p  : 1; /* Private Space Control */
-               unsigned long s  : 1; /* Storage-Alteration-Event Control */
-               unsigned long x  : 1; /* Space-Switch-Event Control */
-               unsigned long r  : 1; /* Real-Space Control */
-               unsigned long    : 1;
-               unsigned long dt : 2; /* Designation-Type Control */
-               unsigned long tl : 2; /* Region- or Segment-Table Length */
-       };
-};
-
-enum {
-       ASCE_TYPE_SEGMENT = 0,
-       ASCE_TYPE_REGION3 = 1,
-       ASCE_TYPE_REGION2 = 2,
-       ASCE_TYPE_REGION1 = 3
-};
-
-union region1_table_entry {
-       unsigned long val;
-       struct {
-               unsigned long rto: 52;/* Region-Table Origin */
-               unsigned long    : 2;
-               unsigned long p  : 1; /* DAT-Protection Bit */
-               unsigned long    : 1;
-               unsigned long tf : 2; /* Region-Second-Table Offset */
-               unsigned long i  : 1; /* Region-Invalid Bit */
-               unsigned long    : 1;
-               unsigned long tt : 2; /* Table-Type Bits */
-               unsigned long tl : 2; /* Region-Second-Table Length */
-       };
-};
-
-union region2_table_entry {
-       unsigned long val;
-       struct {
-               unsigned long rto: 52;/* Region-Table Origin */
-               unsigned long    : 2;
-               unsigned long p  : 1; /* DAT-Protection Bit */
-               unsigned long    : 1;
-               unsigned long tf : 2; /* Region-Third-Table Offset */
-               unsigned long i  : 1; /* Region-Invalid Bit */
-               unsigned long    : 1;
-               unsigned long tt : 2; /* Table-Type Bits */
-               unsigned long tl : 2; /* Region-Third-Table Length */
-       };
-};
-
-struct region3_table_entry_fc0 {
-       unsigned long sto: 52;/* Segment-Table Origin */
-       unsigned long    : 1;
-       unsigned long fc : 1; /* Format-Control */
-       unsigned long p  : 1; /* DAT-Protection Bit */
-       unsigned long    : 1;
-       unsigned long tf : 2; /* Segment-Table Offset */
-       unsigned long i  : 1; /* Region-Invalid Bit */
-       unsigned long cr : 1; /* Common-Region Bit */
-       unsigned long tt : 2; /* Table-Type Bits */
-       unsigned long tl : 2; /* Segment-Table Length */
-};
-
-struct region3_table_entry_fc1 {
-       unsigned long rfaa : 33; /* Region-Frame Absolute Address */
-       unsigned long    : 14;
-       unsigned long av : 1; /* ACCF-Validity Control */
-       unsigned long acc: 4; /* Access-Control Bits */
-       unsigned long f  : 1; /* Fetch-Protection Bit */
-       unsigned long fc : 1; /* Format-Control */
-       unsigned long p  : 1; /* DAT-Protection Bit */
-       unsigned long iep: 1; /* Instruction-Execution-Protection */
-       unsigned long    : 2;
-       unsigned long i  : 1; /* Region-Invalid Bit */
-       unsigned long cr : 1; /* Common-Region Bit */
-       unsigned long tt : 2; /* Table-Type Bits */
-       unsigned long    : 2;
-};
-
-union region3_table_entry {
-       unsigned long val;
-       struct region3_table_entry_fc0 fc0;
-       struct region3_table_entry_fc1 fc1;
-       struct {
-               unsigned long    : 53;
-               unsigned long fc : 1; /* Format-Control */
-               unsigned long    : 4;
-               unsigned long i  : 1; /* Region-Invalid Bit */
-               unsigned long cr : 1; /* Common-Region Bit */
-               unsigned long tt : 2; /* Table-Type Bits */
-               unsigned long    : 2;
-       };
-};
-
-struct segment_entry_fc0 {
-       unsigned long pto: 53;/* Page-Table Origin */
-       unsigned long fc : 1; /* Format-Control */
-       unsigned long p  : 1; /* DAT-Protection Bit */
-       unsigned long    : 3;
-       unsigned long i  : 1; /* Segment-Invalid Bit */
-       unsigned long cs : 1; /* Common-Segment Bit */
-       unsigned long tt : 2; /* Table-Type Bits */
-       unsigned long    : 2;
-};
-
-struct segment_entry_fc1 {
-       unsigned long sfaa : 44; /* Segment-Frame Absolute Address */
-       unsigned long    : 3;
-       unsigned long av : 1; /* ACCF-Validity Control */
-       unsigned long acc: 4; /* Access-Control Bits */
-       unsigned long f  : 1; /* Fetch-Protection Bit */
-       unsigned long fc : 1; /* Format-Control */
-       unsigned long p  : 1; /* DAT-Protection Bit */
-       unsigned long iep: 1; /* Instruction-Execution-Protection */
-       unsigned long    : 2;
-       unsigned long i  : 1; /* Segment-Invalid Bit */
-       unsigned long cs : 1; /* Common-Segment Bit */
-       unsigned long tt : 2; /* Table-Type Bits */
-       unsigned long    : 2;
-};
-
-union segment_table_entry {
-       unsigned long val;
-       struct segment_entry_fc0 fc0;
-       struct segment_entry_fc1 fc1;
-       struct {
-               unsigned long    : 53;
-               unsigned long fc : 1; /* Format-Control */
-               unsigned long    : 4;
-               unsigned long i  : 1; /* Segment-Invalid Bit */
-               unsigned long cs : 1; /* Common-Segment Bit */
-               unsigned long tt : 2; /* Table-Type Bits */
-               unsigned long    : 2;
-       };
-};
-
-enum {
-       TABLE_TYPE_SEGMENT = 0,
-       TABLE_TYPE_REGION3 = 1,
-       TABLE_TYPE_REGION2 = 2,
-       TABLE_TYPE_REGION1 = 3
-};
-
-union page_table_entry {
-       unsigned long val;
-       struct {
-               unsigned long pfra : 52; /* Page-Frame Real Address */
-               unsigned long z  : 1; /* Zero Bit */
-               unsigned long i  : 1; /* Page-Invalid Bit */
-               unsigned long p  : 1; /* DAT-Protection Bit */
-               unsigned long iep: 1; /* Instruction-Execution-Protection */
-               unsigned long    : 8;
-       };
-};
-
 /*
  * vaddress union in order to easily decode a virtual address into its
  * region first index, region second index etc. parts.
@@ -632,7 +475,7 @@ static unsigned long guest_translate(struct kvm_vcpu *vcpu, unsigned long gva,
        iep = ctlreg0.iep && test_kvm_facility(vcpu->kvm, 130);
        if (asce.r)
                goto real_address;
-       ptr = asce.origin * PAGE_SIZE;
+       ptr = asce.rsto * PAGE_SIZE;
        switch (asce.dt) {
        case ASCE_TYPE_REGION1:
                if (vaddr.rfx01 > asce.tl)
@@ -1379,7 +1222,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
        parent = sg->parent;
        vaddr.addr = saddr;
        asce.val = sg->orig_asce;
-       ptr = asce.origin * PAGE_SIZE;
+       ptr = asce.rsto * PAGE_SIZE;
        if (asce.r) {
                *fake = 1;
                ptr = 0;