Le 22/09/2022 à 10:29, Haren Myneni a écrit : > > DSI error will be generated when the paste operation is issued on > the suspended NX window due to NX state changes. The hypervisor > expects the partition to ignore this error during page pault > handling. To differentiate DSI caused by an actual HW configuration > or by the NX window, a new “ibm,pi-features” type value is defined. > Byte 0, bit 3 of pi-attribute-specifier-type is now defined to > indicate this DSI error.
What is NX ? No eXec ? That's what it is usually. But in that case it would be the ISI, not DSI. > > This patch adds changes to read ibm,pi-features property and ignore > DSI error in the page fault handling if CPU_FTR_NX_DSI if defined. > > Signed-off-by: Haren Myneni <ha...@linux.ibm.com> > --- > arch/powerpc/include/asm/cputable.h | 5 ++-- > arch/powerpc/kernel/prom.c | 36 +++++++++++++++++++++-------- > arch/powerpc/mm/fault.c | 17 +++++++++++++- > 3 files changed, 45 insertions(+), 13 deletions(-) > > diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c > index 014005428687..154cc1e85770 100644 > --- a/arch/powerpc/mm/fault.c > +++ b/arch/powerpc/mm/fault.c > @@ -367,7 +367,22 @@ static void sanity_check_fault(bool is_write, bool > is_user, > #elif defined(CONFIG_PPC_8xx) > #define page_fault_is_bad(__err) ((__err) & DSISR_NOEXEC_OR_G) > #elif defined(CONFIG_PPC64) > -#define page_fault_is_bad(__err) ((__err) & DSISR_BAD_FAULT_64S) > +static inline int page_fault_is_bad(unsigned long __err) The name was __err because it was a macro and there was a risk of collision with a 'err' variable in the caller. But as it is now a function, you can just call it 'err'. And no need of the 'inline' keyword, GCC will inline it anyway. > +{ > + unsigned long flag = DSISR_BAD_FAULT_64S; > + > + /* > + * PAPR 14.15.3.4.1 > + * If byte 0, bit 3 of pi-attribute-specifier-type in > + * ibm,pi-features property is defined, ignore the DSI error > + * which is caused by the paste instruction on the > + * suspended NX window. > + */ > + if (cpu_has_feature(CPU_FTR_NX_DSI)) > + flag &= ~DSISR_BAD_COPYPASTE; > + > + return ((__err) & flag); The () around __err was because it was a macro parameter. It is pointless now. And same for the overall ones. Now it can be : return err & flags; > +} > #else > #define page_fault_is_bad(__err) ((__err) & DSISR_BAD_FAULT_32S) > #endif