Commit 2aa6195e authored by Alistair Popple's avatar Alistair Popple Committed by Michael Ellerman
Browse files

powerpc: Enable Prefixed Instructions



Prefix instructions have their own FSCR bit which needs to enabled via
a CPU feature. The kernel will save the FSCR for problem state but it
needs to be enabled initially.

If prefixed instructions are made unavailable by the [H]FSCR, attempting
to use them will cause a facility unavailable exception. Add "PREFIX" to
the facility_strings[].

Currently there are no prefixed instructions that are actually emulated
by emulate_instruction() within facility_unavailable_exception().
However, when caused by a prefixed instructions the SRR1 PREFIXED bit is
set. Prepare for dealing with emulated prefixed instructions by checking
for this bit.

Signed-off-by: default avatarAlistair Popple <alistair@popple.id.au>
Signed-off-by: default avatarJordan Niethe <jniethe5@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
Link: https://lore.kernel.org/r/20200506034050.24806-22-jniethe5@gmail.com
parent 0b582db5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -397,6 +397,7 @@
#define SPRN_RWMR	0x375	/* Region-Weighting Mode Register */

/* HFSCR and FSCR bit numbers are the same */
#define FSCR_PREFIX_LG	13	/* Enable Prefix Instructions */
#define FSCR_SCV_LG	12	/* Enable System Call Vectored */
#define FSCR_MSGP_LG	10	/* Enable MSGP */
#define FSCR_TAR_LG	8	/* Enable Target Address Register */
@@ -408,11 +409,13 @@
#define FSCR_VECVSX_LG	1	/* Enable VMX/VSX  */
#define FSCR_FP_LG	0	/* Enable Floating Point */
#define SPRN_FSCR	0x099	/* Facility Status & Control Register */
#define   FSCR_PREFIX	__MASK(FSCR_PREFIX_LG)
#define   FSCR_SCV	__MASK(FSCR_SCV_LG)
#define   FSCR_TAR	__MASK(FSCR_TAR_LG)
#define   FSCR_EBB	__MASK(FSCR_EBB_LG)
#define   FSCR_DSCR	__MASK(FSCR_DSCR_LG)
#define SPRN_HFSCR	0xbe	/* HV=1 Facility Status & Control Register */
#define   HFSCR_PREFIX	__MASK(FSCR_PREFIX_LG)
#define   HFSCR_MSGP	__MASK(FSCR_MSGP_LG)
#define   HFSCR_TAR	__MASK(FSCR_TAR_LG)
#define   HFSCR_EBB	__MASK(FSCR_EBB_LG)
+1 −0
Original line number Diff line number Diff line
@@ -1737,6 +1737,7 @@ void facility_unavailable_exception(struct pt_regs *regs)
		[FSCR_TAR_LG] = "TAR",
		[FSCR_MSGP_LG] = "MSGP",
		[FSCR_SCV_LG] = "SCV",
		[FSCR_PREFIX_LG] = "PREFIX",
	};
	char *facility = "unknown";
	u64 value;