From: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Add a union to represent Translation-Exception Identification (TEID). Clear the TEID in expect_pgm_int clear_pgm_int. Signed-off-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Message-Id: <20210611140705.553307-6-imbrenda@xxxxxxxxxxxxx> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- lib/s390x/asm/interrupt.h | 24 ++++++++++++++++++++++++ lib/s390x/interrupt.c | 2 ++ 2 files changed, 26 insertions(+) diff --git a/lib/s390x/asm/interrupt.h b/lib/s390x/asm/interrupt.h index bf0eb40d..d9ab0bd7 100644 --- a/lib/s390x/asm/interrupt.h +++ b/lib/s390x/asm/interrupt.h @@ -13,6 +13,30 @@ #define EXT_IRQ_EXTERNAL_CALL 0x1202 #define EXT_IRQ_SERVICE_SIG 0x2401 +#define TEID_ASCE_PRIMARY 0 +#define TEID_ASCE_AR 1 +#define TEID_ASCE_SECONDARY 2 +#define TEID_ASCE_HOME 3 + +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; + }; +}; + 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/interrupt.c b/lib/s390x/interrupt.c index ce0003de..b627942f 100644 --- a/lib/s390x/interrupt.c +++ b/lib/s390x/interrupt.c @@ -22,6 +22,7 @@ void expect_pgm_int(void) { pgm_int_expected = true; lc->pgm_int_code = 0; + lc->trans_exc_id = 0; mb(); } @@ -39,6 +40,7 @@ uint16_t clear_pgm_int(void) mb(); code = lc->pgm_int_code; lc->pgm_int_code = 0; + lc->trans_exc_id = 0; pgm_int_expected = false; return code; } -- 2.31.1