public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/2] s390: Two small fixes and improvements
@ 2024-07-03 15:58 Claudio Imbrenda
  2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Claudio Imbrenda @ 2024-07-03 15:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, hca, svens, agordeev, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

The main goal of this small series is to do some clean-up and remove some
paper cuts (or at least clear the way for papercuts to be removed in the
future).

Heiko: this can go through the s390 tree, as agreed.

Claudio Imbrenda (2):
  s390/entry: Pass the asce as parameter to sie64a()
  s390/kvm: Move bitfields for dat tables

 arch/s390/include/asm/dat-bits.h   | 170 +++++++++++++++++++++++++++++
 arch/s390/include/asm/kvm_host.h   |   7 +-
 arch/s390/include/asm/stacktrace.h |   1 +
 arch/s390/kernel/asm-offsets.c     |   1 +
 arch/s390/kernel/entry.S           |   8 +-
 arch/s390/kvm/gaccess.c            | 163 +--------------------------
 arch/s390/kvm/kvm-s390.c           |   3 +-
 arch/s390/kvm/vsie.c               |   2 +-
 8 files changed, 185 insertions(+), 170 deletions(-)
 create mode 100644 arch/s390/include/asm/dat-bits.h

-- 
2.45.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a()
  2024-07-03 15:58 [PATCH v1 0/2] s390: Two small fixes and improvements Claudio Imbrenda
@ 2024-07-03 15:58 ` Claudio Imbrenda
  2024-07-09 12:15   ` Nico Boehr
  2024-07-09 14:52   ` Alexander Gordeev
  2024-07-03 15:59 ` [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables Claudio Imbrenda
  2024-07-09 12:25 ` [PATCH v1 0/2] s390: Two small fixes and improvements Heiko Carstens
  2 siblings, 2 replies; 10+ messages in thread
From: Claudio Imbrenda @ 2024-07-03 15:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, hca, svens, agordeev, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

Pass the guest ASCE explicitly as parameter, instead of having sie64a()
take it from lowcore.

This removes hidden state from lowcore, and makes things look cleaner.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
 arch/s390/include/asm/kvm_host.h   | 7 ++++---
 arch/s390/include/asm/stacktrace.h | 1 +
 arch/s390/kernel/asm-offsets.c     | 1 +
 arch/s390/kernel/entry.S           | 8 +++-----
 arch/s390/kvm/kvm-s390.c           | 3 ++-
 arch/s390/kvm/vsie.c               | 2 +-
 6 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 95990461888f..2d4e3f50a823 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -1029,11 +1029,12 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm);
 void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
 			       unsigned long *aqm, unsigned long *adm);
 
-int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa);
+int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa,
+	     unsigned long gasce);
 
-static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa)
+static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa, unsigned long gasce)
 {
-	return __sie64a(virt_to_phys(sie_block), sie_block, rsa);
+	return __sie64a(virt_to_phys(sie_block), sie_block, rsa, gasce);
 }
 
 extern char sie_exit;
diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h
index 85b6738b826a..1d5ca13dc90f 100644
--- a/arch/s390/include/asm/stacktrace.h
+++ b/arch/s390/include/asm/stacktrace.h
@@ -65,6 +65,7 @@ struct stack_frame {
 			unsigned long sie_reason;
 			unsigned long sie_flags;
 			unsigned long sie_control_block_phys;
+			unsigned long sie_guest_asce;
 		};
 	};
 	unsigned long gprs[10];
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c
index f55979f64d49..26bb45d0e6f1 100644
--- a/arch/s390/kernel/asm-offsets.c
+++ b/arch/s390/kernel/asm-offsets.c
@@ -63,6 +63,7 @@ int main(void)
 	OFFSET(__SF_SIE_REASON, stack_frame, sie_reason);
 	OFFSET(__SF_SIE_FLAGS, stack_frame, sie_flags);
 	OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys);
+	OFFSET(__SF_SIE_GUEST_ASCE, stack_frame, sie_guest_asce);
 	DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame));
 	BLANK();
 	OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain);
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index 60cf917a7122..454b6b92c7f8 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -179,6 +179,7 @@ SYM_FUNC_END(__switch_to_asm)
  * %r2 pointer to sie control block phys
  * %r3 pointer to sie control block virt
  * %r4 guest register save area
+ * %r5 guest asce
  */
 SYM_FUNC_START(__sie64a)
 	stmg	%r6,%r14,__SF_GPRS(%r15)	# save kernel registers
@@ -186,15 +187,12 @@ SYM_FUNC_START(__sie64a)
 	stg	%r2,__SF_SIE_CONTROL_PHYS(%r15)	# save sie block physical..
 	stg	%r3,__SF_SIE_CONTROL(%r15)	# ...and virtual addresses
 	stg	%r4,__SF_SIE_SAVEAREA(%r15)	# save guest register save area
+	stg	%r5,__SF_SIE_GUEST_ASCE(%r15)	# save guest asce
 	xc	__SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0
 	mvc	__SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags
 	lmg	%r0,%r13,0(%r4)			# load guest gprs 0-13
-	lg	%r14,__LC_GMAP			# get gmap pointer
-	ltgr	%r14,%r14
-	jz	.Lsie_gmap
 	oi	__LC_CPU_FLAGS+7,_CIF_SIE
-	lctlg	%c1,%c1,__GMAP_ASCE(%r14)	# load primary asce
-.Lsie_gmap:
+	lctlg	%c1,%c1,__SF_SIE_GUEST_ASCE(%r15) # load primary asce
 	lg	%r14,__SF_SIE_CONTROL(%r15)	# get control block pointer
 	oi	__SIE_PROG0C+3(%r14),1		# we are going into SIE now
 	tm	__SIE_PROG20+3(%r14),3		# last exit...
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 82e9631cd9ef..148dff562386 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -4829,7 +4829,8 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
 			       sizeof(sie_page->pv_grregs));
 		}
 		exit_reason = sie64a(vcpu->arch.sie_block,
-				     vcpu->run->s.regs.gprs);
+				     vcpu->run->s.regs.gprs,
+				     gmap_get_enabled()->asce);
 		if (kvm_s390_pv_cpu_is_protected(vcpu)) {
 			memcpy(vcpu->run->s.regs.gprs,
 			       sie_page->pv_grregs,
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index c9ecae830634..97a70c2b83ee 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -1150,7 +1150,7 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
 	vcpu->arch.sie_block->prog0c |= PROG_IN_SIE;
 	barrier();
 	if (!kvm_s390_vcpu_sie_inhibited(vcpu))
-		rc = sie64a(scb_s, vcpu->run->s.regs.gprs);
+		rc = sie64a(scb_s, vcpu->run->s.regs.gprs, gmap_get_enabled()->asce);
 	barrier();
 	vcpu->arch.sie_block->prog0c &= ~PROG_IN_SIE;
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables
  2024-07-03 15:58 [PATCH v1 0/2] s390: Two small fixes and improvements Claudio Imbrenda
  2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
@ 2024-07-03 15:59 ` Claudio Imbrenda
  2024-07-09  8:45   ` Nico Boehr
  2024-07-11 15:16   ` Alexander Gordeev
  2024-07-09 12:25 ` [PATCH v1 0/2] s390: Two small fixes and improvements Heiko Carstens
  2 siblings, 2 replies; 10+ messages in thread
From: Claudio Imbrenda @ 2024-07-03 15:59 UTC (permalink / raw)
  To: linux-kernel
  Cc: kvm, linux-s390, hca, svens, agordeev, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

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>
---
 arch/s390/include/asm/dat-bits.h | 170 +++++++++++++++++++++++++++++++
 arch/s390/kvm/gaccess.c          | 163 +----------------------------
 2 files changed, 173 insertions(+), 160 deletions(-)
 create mode 100644 arch/s390/include/asm/dat-bits.h

diff --git a/arch/s390/include/asm/dat-bits.h b/arch/s390/include/asm/dat-bits.h
new file mode 100644
index 000000000000..d8afd13be48c
--- /dev/null
+++ b/arch/s390/include/asm/dat-bits.h
@@ -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 */
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index 5bf3d94e9dda..e65f597e3044 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -14,167 +14,10 @@
 #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;
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables
  2024-07-03 15:59 ` [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables Claudio Imbrenda
@ 2024-07-09  8:45   ` Nico Boehr
  2024-07-11 15:16   ` Alexander Gordeev
  1 sibling, 0 replies; 10+ messages in thread
From: Nico Boehr @ 2024-07-09  8:45 UTC (permalink / raw)
  To: Claudio Imbrenda, linux-kernel
  Cc: kvm, linux-s390, hca, svens, agordeev, gor, nsg, seiden, frankja,
	borntraeger, gerald.schaefer, david

Quoting Claudio Imbrenda (2024-07-03 17:59:00)
> 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>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a()
  2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
@ 2024-07-09 12:15   ` Nico Boehr
  2024-07-09 14:52   ` Alexander Gordeev
  1 sibling, 0 replies; 10+ messages in thread
From: Nico Boehr @ 2024-07-09 12:15 UTC (permalink / raw)
  To: Claudio Imbrenda, linux-kernel
  Cc: kvm, linux-s390, hca, svens, agordeev, gor, nsg, seiden, frankja,
	borntraeger, gerald.schaefer, david

Quoting Claudio Imbrenda (2024-07-03 17:58:59)
> Pass the guest ASCE explicitly as parameter, instead of having sie64a()
> take it from lowcore.
> 
> This removes hidden state from lowcore, and makes things look cleaner.
> 
> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>

Reviewed-by: Nico Boehr <nrb@linux.ibm.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 0/2] s390: Two small fixes and improvements
  2024-07-03 15:58 [PATCH v1 0/2] s390: Two small fixes and improvements Claudio Imbrenda
  2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
  2024-07-03 15:59 ` [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables Claudio Imbrenda
@ 2024-07-09 12:25 ` Heiko Carstens
  2 siblings, 0 replies; 10+ messages in thread
From: Heiko Carstens @ 2024-07-09 12:25 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, svens, agordeev, gor, nrb, nsg,
	seiden, frankja, borntraeger, gerald.schaefer, david

On Wed, Jul 03, 2024 at 05:58:58PM +0200, Claudio Imbrenda wrote:
> The main goal of this small series is to do some clean-up and remove some
> paper cuts (or at least clear the way for papercuts to be removed in the
> future).
> 
> Heiko: this can go through the s390 tree, as agreed.
> 
> Claudio Imbrenda (2):
>   s390/entry: Pass the asce as parameter to sie64a()
>   s390/kvm: Move bitfields for dat tables
> 
>  arch/s390/include/asm/dat-bits.h   | 170 +++++++++++++++++++++++++++++
>  arch/s390/include/asm/kvm_host.h   |   7 +-
>  arch/s390/include/asm/stacktrace.h |   1 +
>  arch/s390/kernel/asm-offsets.c     |   1 +
>  arch/s390/kernel/entry.S           |   8 +-
>  arch/s390/kvm/gaccess.c            | 163 +--------------------------
>  arch/s390/kvm/kvm-s390.c           |   3 +-
>  arch/s390/kvm/vsie.c               |   2 +-
>  8 files changed, 185 insertions(+), 170 deletions(-)
>  create mode 100644 arch/s390/include/asm/dat-bits.h

Applied, thanks!

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a()
  2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
  2024-07-09 12:15   ` Nico Boehr
@ 2024-07-09 14:52   ` Alexander Gordeev
  1 sibling, 0 replies; 10+ messages in thread
From: Alexander Gordeev @ 2024-07-09 14:52 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, hca, svens, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

On Wed, Jul 03, 2024 at 05:58:59PM +0200, Claudio Imbrenda wrote:
> Pass the guest ASCE explicitly as parameter, instead of having sie64a()
> take it from lowcore.
> 
> This removes hidden state from lowcore, and makes things look cleaner.
> 
> Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> ---
>  arch/s390/include/asm/kvm_host.h   | 7 ++++---
>  arch/s390/include/asm/stacktrace.h | 1 +
>  arch/s390/kernel/asm-offsets.c     | 1 +
>  arch/s390/kernel/entry.S           | 8 +++-----
>  arch/s390/kvm/kvm-s390.c           | 3 ++-
>  arch/s390/kvm/vsie.c               | 2 +-
>  6 files changed, 12 insertions(+), 10 deletions(-)

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables
  2024-07-03 15:59 ` [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables Claudio Imbrenda
  2024-07-09  8:45   ` Nico Boehr
@ 2024-07-11 15:16   ` Alexander Gordeev
  2024-07-11 16:23     ` Claudio Imbrenda
  1 sibling, 1 reply; 10+ messages in thread
From: Alexander Gordeev @ 2024-07-11 15:16 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: linux-kernel, kvm, linux-s390, hca, svens, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

On Wed, Jul 03, 2024 at 05:59:00PM +0200, Claudio Imbrenda wrote:

Hi Claudio,

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

Is my understanding correct that you potentially see page_table_entry::val /
region?_table_entry.*::val / segment_table_entry.* merged with pte_t::pte /
p?d_t::p?d?

Thanks!

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables
  2024-07-11 15:16   ` Alexander Gordeev
@ 2024-07-11 16:23     ` Claudio Imbrenda
  2024-07-12  9:56       ` Heiko Carstens
  0 siblings, 1 reply; 10+ messages in thread
From: Claudio Imbrenda @ 2024-07-11 16:23 UTC (permalink / raw)
  To: Alexander Gordeev
  Cc: linux-kernel, kvm, linux-s390, hca, svens, gor, nrb, nsg, seiden,
	frankja, borntraeger, gerald.schaefer, david

On Thu, 11 Jul 2024 17:16:23 +0200
Alexander Gordeev <agordeev@linux.ibm.com> wrote:

> On Wed, Jul 03, 2024 at 05:59:00PM +0200, Claudio Imbrenda wrote:
> 
> Hi Claudio,
> 
> > Once in a separate header, the structs become available everywhere. One
> > possible usecase is to merge them in the s390 
> > definitions, which is left as an exercise for the reader.  
> 
> Is my understanding correct that you potentially see page_table_entry::val /
> region?_table_entry.*::val / segment_table_entry.* merged with pte_t::pte /
> p?d_t::p?d?
> 
> Thanks!

that depends on how you want to do the merge

you could do:

typedef union {
	unsigned long pte;
	union page_table_entry hw;
	union page_table_entry_softbits sw;
} pte_t;

then you would have pte_t::pte and pte_t::hw::val; unfortunately it's
not possible to anonymously merge a named type.. 

this would be great but can't be done*:

typedef union {
	unsigned long pte;
	union page_table_entry;
} pte_t;

[*] gcc actually supports it with an additional feature switch, but
it's not standard C and I seriously doubt we should even think about
doing it

another possibility is a plain

typedef union page_table_entry pte_t;

and then fix pte_val() and similar, but then you won't have the
softbits.


in the end, it's up to you how you want to merge them. I will
have my own unions that I will use only inside KVM, that's enough for
me.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables
  2024-07-11 16:23     ` Claudio Imbrenda
@ 2024-07-12  9:56       ` Heiko Carstens
  0 siblings, 0 replies; 10+ messages in thread
From: Heiko Carstens @ 2024-07-12  9:56 UTC (permalink / raw)
  To: Claudio Imbrenda
  Cc: Alexander Gordeev, linux-kernel, kvm, linux-s390, svens, gor, nrb,
	nsg, seiden, frankja, borntraeger, gerald.schaefer, david

On Thu, Jul 11, 2024 at 06:23:48PM +0200, Claudio Imbrenda wrote:
> On Thu, 11 Jul 2024 17:16:23 +0200
> Alexander Gordeev <agordeev@linux.ibm.com> wrote:
> > Hi Claudio,
> > 
> > > Once in a separate header, the structs become available everywhere. One
> > > possible usecase is to merge them in the s390 
> > > definitions, which is left as an exercise for the reader.  
> > 
> > Is my understanding correct that you potentially see page_table_entry::val /
> > region?_table_entry.*::val / segment_table_entry.* merged with pte_t::pte /
> > p?d_t::p?d?
> 
> that depends on how you want to do the merge
> 
> you could do:
> 
> typedef union {
> 	unsigned long pte;
> 	union page_table_entry hw;
> 	union page_table_entry_softbits sw;
> } pte_t;
> 
> then you would have pte_t::pte and pte_t::hw::val; unfortunately it's
> not possible to anonymously merge a named type.. 
> 
> this would be great but can't be done*:
> 
> typedef union {
> 	unsigned long pte;
> 	union page_table_entry;
> } pte_t;
> 
> [*] gcc actually supports it with an additional feature switch, but
> it's not standard C and I seriously doubt we should even think about
> doing it
> 
> another possibility is a plain
> 
> typedef union page_table_entry pte_t;
> 
> and then fix pte_val() and similar, but then you won't have the
> softbits.
> 
> 
> in the end, it's up to you how you want to merge them. I will
> have my own unions that I will use only inside KVM, that's enough for
> me.

We discussed this, and I really don't think we want this for the software
defined bits. In general I do like the idea of having bit fields and let
gcc do the decoding. But we have so many masks we use every for ptes and
friends that a single assignment won't work in most cases. So we eiter have
to do several assignments (which sometimes is a no-go when block concurrent
updates are required), or we have to stay with using both the existing
defines plus the new unions - which makes things even more complicated.

There might be uses cases where the hardware structures are also useful for
s390 core code, but I don't think we should go the route outlined above.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-07-12  9:57 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-03 15:58 [PATCH v1 0/2] s390: Two small fixes and improvements Claudio Imbrenda
2024-07-03 15:58 ` [PATCH v1 1/2] s390/entry: Pass the asce as parameter to sie64a() Claudio Imbrenda
2024-07-09 12:15   ` Nico Boehr
2024-07-09 14:52   ` Alexander Gordeev
2024-07-03 15:59 ` [PATCH v1 2/2] s390/kvm: Move bitfields for dat tables Claudio Imbrenda
2024-07-09  8:45   ` Nico Boehr
2024-07-11 15:16   ` Alexander Gordeev
2024-07-11 16:23     ` Claudio Imbrenda
2024-07-12  9:56       ` Heiko Carstens
2024-07-09 12:25 ` [PATCH v1 0/2] s390: Two small fixes and improvements Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox