* [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage
@ 2022-06-21 14:30 Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 1/3] s390x: Fix sclp facility bit numbers Janis Schoetterl-Glausch
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Janis Schoetterl-Glausch @ 2022-06-21 14:30 UTC (permalink / raw)
To: Thomas Huth, Janosch Frank, Claudio Imbrenda
Cc: Janis Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390
The translation-exception identification (TEID) contains information to
identify the cause of certain program exceptions, including translation
exceptions occurring during dynamic address translation, as well as
protection exceptions.
The meaning of fields in the TEID is complex, depending on the exception
occurring and various potentially installed facilities.
Add function to query which suppression-on-protection facility is
installed.
Rework the type describing the TEID, in order to ease decoding.
Change the existing code interpreting the TEID and extend it to take the
installed suppression-on-protection facility into account.
Also fix the sclp bit order.
v2 -> v3
* rename some identifiers
* implement Claudio's feedback to assert that the array for printing
has the correct number of elements. I kept the array inside the
printing function, tho, because I consider its content an implementation
detail
* ignore ancient machines without at least ESOP-1
v1 -> v2
* pick up r-b
* get rid of esop1 alias of sop_teid_predictable
* assert that the esop2 protection code is valid
* use string literal array and indexing for protection code printing
* fix protection exception check in edat.c
Janis Schoetterl-Glausch (3):
s390x: Fix sclp facility bit numbers
s390x: lib: SOP facility query function
s390x: Rework TEID decoding and usage
lib/s390x/asm/facility.h | 21 +++++++++++++
lib/s390x/asm/interrupt.h | 62 ++++++++++++++++++++++++++++++---------
lib/s390x/fault.h | 30 +++++--------------
lib/s390x/sclp.h | 18 +++++++-----
lib/s390x/fault.c | 58 +++++++++++++++++++++++-------------
lib/s390x/interrupt.c | 2 +-
lib/s390x/sclp.c | 2 ++
s390x/edat.c | 25 +++++++++-------
8 files changed, 142 insertions(+), 76 deletions(-)
Range-diff against v2:
1: 6427944a = 1: 189e03ca s390x: Fix sclp facility bit numbers
2: a08fce3b = 2: 0783c2a4 s390x: lib: SOP facility query function
3: eb268af1 ! 3: 615ec8df s390x: Rework TEID decoding and usage
@@ lib/s390x/asm/interrupt.h
+ /* common fields DAT exc & protection exc */
+ struct {
+ uint64_t addr : 52 - 0;
-+ uint64_t acc_exc_f_s : 54 - 52;
++ uint64_t acc_exc_fetch_store : 54 - 52;
+ uint64_t side_effect_acc : 55 - 54;
+ uint64_t /* reserved */ : 62 - 55;
+ uint64_t asce_id : 64 - 62;
@@ lib/s390x/asm/interrupt.h
};
+enum prot_code {
-+ PROT_KEY_LAP,
++ PROT_KEY_OR_LAP,
+ PROT_DAT,
+ PROT_KEY,
+ PROT_ACC_LIST,
+ PROT_LAP,
+ PROT_IEP,
++ PROT_NUM_CODES /* Must always be last */
+};
+
+static inline enum prot_code teid_esop2_prot_code(union teid teid)
@@ lib/s390x/asm/interrupt.h
+ teid.esop2_prot_code_1 << 1 |
+ teid.esop2_prot_code_2);
+
-+ assert(code < 6);
++ assert(code < PROT_NUM_CODES);
+ return (enum prot_code)code;
+}
+
@@ lib/s390x/fault.c
- printf("Type: IEP\n");
- return;
- }
-+static void print_decode_pgm_prot(union teid teid, bool dat)
++static void print_decode_pgm_prot(union teid teid)
+{
+ switch (get_supp_on_prot_facility()) {
+ case SOP_NONE:
-+ printf("Type: ?\n");
-+ break;
+ case SOP_BASIC:
-+ if (teid.sop_teid_predictable && dat && teid.sop_acc_list)
-+ printf("Type: ACC\n");
-+ else
-+ printf("Type: ?\n");
++ printf("Type: ?\n"); /* modern/relevant machines have ESOP */
+ break;
+ case SOP_ENHANCED_1:
+ if (teid.sop_teid_predictable) {/* implies access list or DAT */
@@ lib/s390x/fault.c
+ "LAP",
+ "IEP",
+ };
++ _Static_assert(ARRAY_SIZE(prot_str) == PROT_NUM_CODES);
+ int prot_code = teid_esop2_prot_code(teid);
- if (prot_is_datp(teid)) {
- printf("Type: DAT\n");
- return;
-+ assert(0 <= prot_code && prot_code < ARRAY_SIZE(prot_str));
+ printf("Type: %s\n", prot_str[prot_code]);
+ }
}
@@ lib/s390x/fault.c
case AS_PRIM:
printf("Primary\n");
break;
-@@ lib/s390x/fault.c: void print_decode_teid(uint64_t teid)
- }
-
- if (lowcore.pgm_int_code == PGM_INT_CODE_PROTECTION)
-- print_decode_pgm_prot(teid);
-+ print_decode_pgm_prot(teid, dat);
-
- /*
- * If teid bit 61 is off for these two exception the reported
@@ lib/s390x/fault.c: void print_decode_teid(uint64_t teid)
*/
if ((lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_ACCESS ||
@@ s390x/edat.c: static bool check_pgm_prot(void *ptr)
- * field might or might not be meaningful when the m field is 0.
- */
- if (!teid.m)
+- return true;
+- return (!teid.acc_list_prot && !teid.asce_id &&
+ switch (get_supp_on_prot_facility()) {
+ case SOP_NONE:
- return true;
-- return (!teid.acc_list_prot && !teid.asce_id &&
+ case SOP_BASIC:
-+ if (!teid.sop_teid_predictable)
-+ return true;
-+ break;
++ assert(false); /* let's ignore ancient/irrelevant machines */
+ case SOP_ENHANCED_1:
+ if (!teid.sop_teid_predictable) /* implies key or low addr */
+ return false;
base-commit: 610c15284a537484682adfb4b6d6313991ab954f
--
2.36.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [kvm-unit-tests PATCH v3 1/3] s390x: Fix sclp facility bit numbers
2022-06-21 14:30 [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
@ 2022-06-21 14:30 ` Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 2/3] s390x: lib: SOP facility query function Janis Schoetterl-Glausch
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Janis Schoetterl-Glausch @ 2022-06-21 14:30 UTC (permalink / raw)
To: Thomas Huth, Janosch Frank, Claudio Imbrenda
Cc: Janis Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390
sclp_feat_check takes care of adjusting the bit numbering such that they
can be defined as they are in the documentation.
Fixes: 4dd649c8 ("lib: s390x: sclp: Extend feature probing")
Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
---
lib/s390x/sclp.h | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h
index e48a5a3d..3488f4d2 100644
--- a/lib/s390x/sclp.h
+++ b/lib/s390x/sclp.h
@@ -134,13 +134,13 @@ struct sclp_facilities {
};
/* bit number within a certain byte */
-#define SCLP_FEAT_85_BIT_GSLS 7
-#define SCLP_FEAT_98_BIT_KSS 0
-#define SCLP_FEAT_116_BIT_64BSCAO 7
-#define SCLP_FEAT_116_BIT_CMMA 6
-#define SCLP_FEAT_116_BIT_ESCA 3
-#define SCLP_FEAT_117_BIT_PFMFI 6
-#define SCLP_FEAT_117_BIT_IBS 5
+#define SCLP_FEAT_85_BIT_GSLS 0
+#define SCLP_FEAT_98_BIT_KSS 7
+#define SCLP_FEAT_116_BIT_64BSCAO 0
+#define SCLP_FEAT_116_BIT_CMMA 1
+#define SCLP_FEAT_116_BIT_ESCA 4
+#define SCLP_FEAT_117_BIT_PFMFI 1
+#define SCLP_FEAT_117_BIT_IBS 2
typedef struct ReadInfo {
SCCBHeader h;
--
2.36.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [kvm-unit-tests PATCH v3 2/3] s390x: lib: SOP facility query function
2022-06-21 14:30 [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 1/3] s390x: Fix sclp facility bit numbers Janis Schoetterl-Glausch
@ 2022-06-21 14:30 ` Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 3/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
2022-06-21 15:35 ` [kvm-unit-tests PATCH v3 0/3] " Claudio Imbrenda
3 siblings, 0 replies; 5+ messages in thread
From: Janis Schoetterl-Glausch @ 2022-06-21 14:30 UTC (permalink / raw)
To: Thomas Huth, Janosch Frank, Claudio Imbrenda
Cc: Janis Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390
Add function returning which suppression-on-protection facility is
installed.
Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
---
lib/s390x/asm/facility.h | 21 +++++++++++++++++++++
lib/s390x/sclp.h | 4 ++++
lib/s390x/sclp.c | 2 ++
3 files changed, 27 insertions(+)
diff --git a/lib/s390x/asm/facility.h b/lib/s390x/asm/facility.h
index 49380203..a66fe56a 100644
--- a/lib/s390x/asm/facility.h
+++ b/lib/s390x/asm/facility.h
@@ -12,6 +12,7 @@
#include <asm/facility.h>
#include <asm/arch_def.h>
#include <bitops.h>
+#include <sclp.h>
#define NB_STFL_DOUBLEWORDS 32
extern uint64_t stfl_doublewords[];
@@ -42,4 +43,24 @@ static inline void setup_facilities(void)
stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS);
}
+enum supp_on_prot_facility {
+ SOP_NONE,
+ SOP_BASIC,
+ SOP_ENHANCED_1,
+ SOP_ENHANCED_2,
+};
+
+static inline enum supp_on_prot_facility get_supp_on_prot_facility(void)
+{
+ if (sclp_facilities.has_esop) {
+ if (test_facility(131)) /* side-effect-access facility */
+ return SOP_ENHANCED_2;
+ else
+ return SOP_ENHANCED_1;
+ }
+ if (sclp_facilities.has_sop)
+ return SOP_BASIC;
+ return SOP_NONE;
+}
+
#endif
diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h
index 3488f4d2..853529bf 100644
--- a/lib/s390x/sclp.h
+++ b/lib/s390x/sclp.h
@@ -123,7 +123,9 @@ struct sclp_facilities {
uint64_t has_cei : 1;
uint64_t has_diag318 : 1;
+ uint64_t has_sop : 1;
uint64_t has_gsls : 1;
+ uint64_t has_esop : 1;
uint64_t has_cmma : 1;
uint64_t has_64bscao : 1;
uint64_t has_esca : 1;
@@ -134,7 +136,9 @@ struct sclp_facilities {
};
/* bit number within a certain byte */
+#define SCLP_FEAT_80_BIT_SOP 2
#define SCLP_FEAT_85_BIT_GSLS 0
+#define SCLP_FEAT_85_BIT_ESOP 6
#define SCLP_FEAT_98_BIT_KSS 7
#define SCLP_FEAT_116_BIT_64BSCAO 0
#define SCLP_FEAT_116_BIT_CMMA 1
diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c
index b8204c5f..e6017f64 100644
--- a/lib/s390x/sclp.c
+++ b/lib/s390x/sclp.c
@@ -152,7 +152,9 @@ void sclp_facilities_setup(void)
cpu = sclp_get_cpu_entries();
if (read_info->offset_cpu > 134)
sclp_facilities.has_diag318 = read_info->byte_134_diag318;
+ sclp_facilities.has_sop = sclp_feat_check(80, SCLP_FEAT_80_BIT_SOP);
sclp_facilities.has_gsls = sclp_feat_check(85, SCLP_FEAT_85_BIT_GSLS);
+ sclp_facilities.has_esop = sclp_feat_check(85, SCLP_FEAT_85_BIT_ESOP);
sclp_facilities.has_kss = sclp_feat_check(98, SCLP_FEAT_98_BIT_KSS);
sclp_facilities.has_cmma = sclp_feat_check(116, SCLP_FEAT_116_BIT_CMMA);
sclp_facilities.has_64bscao = sclp_feat_check(116, SCLP_FEAT_116_BIT_64BSCAO);
--
2.36.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [kvm-unit-tests PATCH v3 3/3] s390x: Rework TEID decoding and usage
2022-06-21 14:30 [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 1/3] s390x: Fix sclp facility bit numbers Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 2/3] s390x: lib: SOP facility query function Janis Schoetterl-Glausch
@ 2022-06-21 14:30 ` Janis Schoetterl-Glausch
2022-06-21 15:35 ` [kvm-unit-tests PATCH v3 0/3] " Claudio Imbrenda
3 siblings, 0 replies; 5+ messages in thread
From: Janis Schoetterl-Glausch @ 2022-06-21 14:30 UTC (permalink / raw)
To: Thomas Huth, Janosch Frank, Claudio Imbrenda
Cc: Janis Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390
The translation-exception identification (TEID) contains information to
identify the cause of certain program exceptions, including translation
exceptions occurring during dynamic address translation, as well as
protection exceptions.
The meaning of fields in the TEID is complex, depending on the exception
occurring and various potentially installed facilities.
Rework the type describing the TEID, in order to ease decoding.
Change the existing code interpreting the TEID and extend it to take the
installed suppression-on-protection facility into account.
Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
---
lib/s390x/asm/interrupt.h | 62 ++++++++++++++++++++++++++++++---------
lib/s390x/fault.h | 30 +++++--------------
lib/s390x/fault.c | 58 +++++++++++++++++++++++-------------
lib/s390x/interrupt.c | 2 +-
s390x/edat.c | 25 +++++++++-------
5 files changed, 108 insertions(+), 69 deletions(-)
diff --git a/lib/s390x/asm/interrupt.h b/lib/s390x/asm/interrupt.h
index d9ab0bd7..fc66a925 100644
--- a/lib/s390x/asm/interrupt.h
+++ b/lib/s390x/asm/interrupt.h
@@ -20,23 +20,57 @@
union teid {
unsigned long val;
- struct {
- unsigned long addr:52;
- unsigned long fetch:1;
- unsigned long store:1;
- unsigned long reserved:6;
- unsigned long acc_list_prot:1;
- /*
- * depending on the exception and the installed facilities,
- * the m field can indicate several different things,
- * including whether the exception was triggered by a MVPG
- * instruction, or whether the addr field is meaningful
- */
- unsigned long m:1;
- unsigned long asce_id:2;
+ union {
+ /* common fields DAT exc & protection exc */
+ struct {
+ uint64_t addr : 52 - 0;
+ uint64_t acc_exc_fetch_store : 54 - 52;
+ uint64_t side_effect_acc : 55 - 54;
+ uint64_t /* reserved */ : 62 - 55;
+ uint64_t asce_id : 64 - 62;
+ };
+ /* DAT exc */
+ struct {
+ uint64_t /* pad */ : 61 - 0;
+ uint64_t dat_move_page : 62 - 61;
+ };
+ /* suppression on protection */
+ struct {
+ uint64_t /* pad */ : 60 - 0;
+ uint64_t sop_acc_list : 61 - 60;
+ uint64_t sop_teid_predictable : 62 - 61;
+ };
+ /* enhanced suppression on protection 2 */
+ struct {
+ uint64_t /* pad */ : 56 - 0;
+ uint64_t esop2_prot_code_0 : 57 - 56;
+ uint64_t /* pad */ : 60 - 57;
+ uint64_t esop2_prot_code_1 : 61 - 60;
+ uint64_t esop2_prot_code_2 : 62 - 61;
+ };
};
};
+enum prot_code {
+ PROT_KEY_OR_LAP,
+ PROT_DAT,
+ PROT_KEY,
+ PROT_ACC_LIST,
+ PROT_LAP,
+ PROT_IEP,
+ PROT_NUM_CODES /* Must always be last */
+};
+
+static inline enum prot_code teid_esop2_prot_code(union teid teid)
+{
+ int code = (teid.esop2_prot_code_0 << 2 |
+ teid.esop2_prot_code_1 << 1 |
+ teid.esop2_prot_code_2);
+
+ assert(code < PROT_NUM_CODES);
+ return (enum prot_code)code;
+}
+
void register_pgm_cleanup_func(void (*f)(void));
void handle_pgm_int(struct stack_frame_int *stack);
void handle_ext_int(struct stack_frame_int *stack);
diff --git a/lib/s390x/fault.h b/lib/s390x/fault.h
index 726da2f0..867997f2 100644
--- a/lib/s390x/fault.h
+++ b/lib/s390x/fault.h
@@ -11,32 +11,16 @@
#define _S390X_FAULT_H_
#include <bitops.h>
+#include <asm/facility.h>
+#include <asm/interrupt.h>
/* Instruction execution prevention, i.e. no-execute, 101 */
-static inline bool prot_is_iep(uint64_t teid)
+static inline bool prot_is_iep(union teid teid)
{
- if (test_bit_inv(56, &teid) && !test_bit_inv(60, &teid) && test_bit_inv(61, &teid))
- return true;
-
- return false;
-}
-
-/* Standard DAT exception, 001 */
-static inline bool prot_is_datp(uint64_t teid)
-{
- if (!test_bit_inv(56, &teid) && !test_bit_inv(60, &teid) && test_bit_inv(61, &teid))
- return true;
-
- return false;
-}
-
-/* Low-address protection exception, 100 */
-static inline bool prot_is_lap(uint64_t teid)
-{
- if (test_bit_inv(56, &teid) && !test_bit_inv(60, &teid) && !test_bit_inv(61, &teid))
- return true;
-
- return false;
+ if (!test_facility(130))
+ return false;
+ /* IEP installed -> ESOP2 installed */
+ return teid_esop2_prot_code(teid) == PROT_IEP;
}
void print_decode_teid(uint64_t teid);
diff --git a/lib/s390x/fault.c b/lib/s390x/fault.c
index efa62fcb..1cd6e265 100644
--- a/lib/s390x/fault.c
+++ b/lib/s390x/fault.c
@@ -13,35 +13,51 @@
#include <asm/page.h>
#include <fault.h>
-/* Decodes the protection exceptions we'll most likely see */
-static void print_decode_pgm_prot(uint64_t teid)
-{
- if (prot_is_lap(teid)) {
- printf("Type: LAP\n");
- return;
- }
- if (prot_is_iep(teid)) {
- printf("Type: IEP\n");
- return;
- }
+static void print_decode_pgm_prot(union teid teid)
+{
+ switch (get_supp_on_prot_facility()) {
+ case SOP_NONE:
+ case SOP_BASIC:
+ printf("Type: ?\n"); /* modern/relevant machines have ESOP */
+ break;
+ case SOP_ENHANCED_1:
+ if (teid.sop_teid_predictable) {/* implies access list or DAT */
+ if (teid.sop_acc_list)
+ printf("Type: ACC\n");
+ else
+ printf("Type: DAT\n");
+ } else {
+ printf("Type: KEY or LAP\n");
+ }
+ break;
+ case SOP_ENHANCED_2: {
+ static const char * const prot_str[] = {
+ "KEY or LAP",
+ "DAT",
+ "KEY",
+ "ACC",
+ "LAP",
+ "IEP",
+ };
+ _Static_assert(ARRAY_SIZE(prot_str) == PROT_NUM_CODES);
+ int prot_code = teid_esop2_prot_code(teid);
- if (prot_is_datp(teid)) {
- printf("Type: DAT\n");
- return;
+ printf("Type: %s\n", prot_str[prot_code]);
+ }
}
}
-void print_decode_teid(uint64_t teid)
+void print_decode_teid(uint64_t raw_teid)
{
- int asce_id = teid & 3;
+ union teid teid = { .val = raw_teid };
bool dat = lowcore.pgm_old_psw.mask & PSW_MASK_DAT;
printf("Memory exception information:\n");
printf("DAT: %s\n", dat ? "on" : "off");
printf("AS: ");
- switch (asce_id) {
+ switch (teid.asce_id) {
case AS_PRIM:
printf("Primary\n");
break;
@@ -65,10 +81,10 @@ void print_decode_teid(uint64_t teid)
*/
if ((lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_ACCESS ||
lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_VIOLATION) &&
- !test_bit_inv(61, &teid)) {
- printf("Address: %lx, unpredictable\n ", teid & PAGE_MASK);
+ !teid.sop_teid_predictable) {
+ printf("Address: %lx, unpredictable\n ", raw_teid & PAGE_MASK);
return;
}
- printf("TEID: %lx\n", teid);
- printf("Address: %lx\n\n", teid & PAGE_MASK);
+ printf("TEID: %lx\n", raw_teid);
+ printf("Address: %lx\n\n", raw_teid & PAGE_MASK);
}
diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
index 6da20c44..ac3d1ecd 100644
--- a/lib/s390x/interrupt.c
+++ b/lib/s390x/interrupt.c
@@ -77,7 +77,7 @@ static void fixup_pgm_int(struct stack_frame_int *stack)
break;
case PGM_INT_CODE_PROTECTION:
/* Handling for iep.c test case. */
- if (prot_is_iep(lowcore.trans_exc_id))
+ if (prot_is_iep((union teid) { .val = lowcore.trans_exc_id }))
/*
* We branched to the instruction that caused
* the exception so we can use the return
diff --git a/s390x/edat.c b/s390x/edat.c
index c6c25042..16138397 100644
--- a/s390x/edat.c
+++ b/s390x/edat.c
@@ -26,8 +26,8 @@ static void *root, *mem, *m;
volatile unsigned int *p;
/*
- * Check if a non-access-list protection exception happened for the given
- * address, in the primary address space.
+ * Check if the exception is consistent with DAT protection and has the correct
+ * address and primary address space.
*/
static bool check_pgm_prot(void *ptr)
{
@@ -37,14 +37,19 @@ static bool check_pgm_prot(void *ptr)
return false;
teid.val = lowcore.trans_exc_id;
-
- /*
- * depending on the presence of the ESOP feature, the rest of the
- * field might or might not be meaningful when the m field is 0.
- */
- if (!teid.m)
- return true;
- return (!teid.acc_list_prot && !teid.asce_id &&
+ switch (get_supp_on_prot_facility()) {
+ case SOP_NONE:
+ case SOP_BASIC:
+ assert(false); /* let's ignore ancient/irrelevant machines */
+ case SOP_ENHANCED_1:
+ if (!teid.sop_teid_predictable) /* implies key or low addr */
+ return false;
+ break;
+ case SOP_ENHANCED_2:
+ if (teid_esop2_prot_code(teid) != PROT_DAT)
+ return false;
+ }
+ return (!teid.sop_acc_list && !teid.asce_id &&
(teid.addr == ((unsigned long)ptr >> PAGE_SHIFT)));
}
--
2.36.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage
2022-06-21 14:30 [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
` (2 preceding siblings ...)
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 3/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
@ 2022-06-21 15:35 ` Claudio Imbrenda
3 siblings, 0 replies; 5+ messages in thread
From: Claudio Imbrenda @ 2022-06-21 15:35 UTC (permalink / raw)
To: Janis Schoetterl-Glausch
Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390
On Tue, 21 Jun 2022 16:30:12 +0200
Janis Schoetterl-Glausch <scgl@linux.ibm.com> wrote:
> The translation-exception identification (TEID) contains information to
> identify the cause of certain program exceptions, including translation
> exceptions occurring during dynamic address translation, as well as
> protection exceptions.
> The meaning of fields in the TEID is complex, depending on the exception
> occurring and various potentially installed facilities.
thanks, queued
>
> Add function to query which suppression-on-protection facility is
> installed.
> Rework the type describing the TEID, in order to ease decoding.
> Change the existing code interpreting the TEID and extend it to take the
> installed suppression-on-protection facility into account.
>
> Also fix the sclp bit order.
>
> v2 -> v3
> * rename some identifiers
> * implement Claudio's feedback to assert that the array for printing
> has the correct number of elements. I kept the array inside the
> printing function, tho, because I consider its content an implementation
> detail
> * ignore ancient machines without at least ESOP-1
>
> v1 -> v2
> * pick up r-b
> * get rid of esop1 alias of sop_teid_predictable
> * assert that the esop2 protection code is valid
> * use string literal array and indexing for protection code printing
> * fix protection exception check in edat.c
>
> Janis Schoetterl-Glausch (3):
> s390x: Fix sclp facility bit numbers
> s390x: lib: SOP facility query function
> s390x: Rework TEID decoding and usage
>
> lib/s390x/asm/facility.h | 21 +++++++++++++
> lib/s390x/asm/interrupt.h | 62 ++++++++++++++++++++++++++++++---------
> lib/s390x/fault.h | 30 +++++--------------
> lib/s390x/sclp.h | 18 +++++++-----
> lib/s390x/fault.c | 58 +++++++++++++++++++++++-------------
> lib/s390x/interrupt.c | 2 +-
> lib/s390x/sclp.c | 2 ++
> s390x/edat.c | 25 +++++++++-------
> 8 files changed, 142 insertions(+), 76 deletions(-)
>
> Range-diff against v2:
> 1: 6427944a = 1: 189e03ca s390x: Fix sclp facility bit numbers
> 2: a08fce3b = 2: 0783c2a4 s390x: lib: SOP facility query function
> 3: eb268af1 ! 3: 615ec8df s390x: Rework TEID decoding and usage
> @@ lib/s390x/asm/interrupt.h
> + /* common fields DAT exc & protection exc */
> + struct {
> + uint64_t addr : 52 - 0;
> -+ uint64_t acc_exc_f_s : 54 - 52;
> ++ uint64_t acc_exc_fetch_store : 54 - 52;
> + uint64_t side_effect_acc : 55 - 54;
> + uint64_t /* reserved */ : 62 - 55;
> + uint64_t asce_id : 64 - 62;
> @@ lib/s390x/asm/interrupt.h
> };
>
> +enum prot_code {
> -+ PROT_KEY_LAP,
> ++ PROT_KEY_OR_LAP,
> + PROT_DAT,
> + PROT_KEY,
> + PROT_ACC_LIST,
> + PROT_LAP,
> + PROT_IEP,
> ++ PROT_NUM_CODES /* Must always be last */
> +};
> +
> +static inline enum prot_code teid_esop2_prot_code(union teid teid)
> @@ lib/s390x/asm/interrupt.h
> + teid.esop2_prot_code_1 << 1 |
> + teid.esop2_prot_code_2);
> +
> -+ assert(code < 6);
> ++ assert(code < PROT_NUM_CODES);
> + return (enum prot_code)code;
> +}
> +
> @@ lib/s390x/fault.c
> - printf("Type: IEP\n");
> - return;
> - }
> -+static void print_decode_pgm_prot(union teid teid, bool dat)
> ++static void print_decode_pgm_prot(union teid teid)
> +{
> + switch (get_supp_on_prot_facility()) {
> + case SOP_NONE:
> -+ printf("Type: ?\n");
> -+ break;
> + case SOP_BASIC:
> -+ if (teid.sop_teid_predictable && dat && teid.sop_acc_list)
> -+ printf("Type: ACC\n");
> -+ else
> -+ printf("Type: ?\n");
> ++ printf("Type: ?\n"); /* modern/relevant machines have ESOP */
> + break;
> + case SOP_ENHANCED_1:
> + if (teid.sop_teid_predictable) {/* implies access list or DAT */
> @@ lib/s390x/fault.c
> + "LAP",
> + "IEP",
> + };
> ++ _Static_assert(ARRAY_SIZE(prot_str) == PROT_NUM_CODES);
> + int prot_code = teid_esop2_prot_code(teid);
>
> - if (prot_is_datp(teid)) {
> - printf("Type: DAT\n");
> - return;
> -+ assert(0 <= prot_code && prot_code < ARRAY_SIZE(prot_str));
> + printf("Type: %s\n", prot_str[prot_code]);
> + }
> }
> @@ lib/s390x/fault.c
> case AS_PRIM:
> printf("Primary\n");
> break;
> -@@ lib/s390x/fault.c: void print_decode_teid(uint64_t teid)
> - }
> -
> - if (lowcore.pgm_int_code == PGM_INT_CODE_PROTECTION)
> -- print_decode_pgm_prot(teid);
> -+ print_decode_pgm_prot(teid, dat);
> -
> - /*
> - * If teid bit 61 is off for these two exception the reported
> @@ lib/s390x/fault.c: void print_decode_teid(uint64_t teid)
> */
> if ((lowcore.pgm_int_code == PGM_INT_CODE_SECURE_STOR_ACCESS ||
> @@ s390x/edat.c: static bool check_pgm_prot(void *ptr)
> - * field might or might not be meaningful when the m field is 0.
> - */
> - if (!teid.m)
> +- return true;
> +- return (!teid.acc_list_prot && !teid.asce_id &&
> + switch (get_supp_on_prot_facility()) {
> + case SOP_NONE:
> - return true;
> -- return (!teid.acc_list_prot && !teid.asce_id &&
> + case SOP_BASIC:
> -+ if (!teid.sop_teid_predictable)
> -+ return true;
> -+ break;
> ++ assert(false); /* let's ignore ancient/irrelevant machines */
> + case SOP_ENHANCED_1:
> + if (!teid.sop_teid_predictable) /* implies key or low addr */
> + return false;
>
> base-commit: 610c15284a537484682adfb4b6d6313991ab954f
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-21 15:35 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-21 14:30 [kvm-unit-tests PATCH v3 0/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 1/3] s390x: Fix sclp facility bit numbers Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 2/3] s390x: lib: SOP facility query function Janis Schoetterl-Glausch
2022-06-21 14:30 ` [kvm-unit-tests PATCH v3 3/3] s390x: Rework TEID decoding and usage Janis Schoetterl-Glausch
2022-06-21 15:35 ` [kvm-unit-tests PATCH v3 0/3] " Claudio Imbrenda
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox