Dirtying the CC allows us to find missing CC changes when css instructions are emulated. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- lib/s390x/css.h | 18 ++++++++++++++---- s390x/mvpg.c | 6 ++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/s390x/css.h b/lib/s390x/css.h index 0a19324b..47733d2d 100644 --- a/lib/s390x/css.h +++ b/lib/s390x/css.h @@ -6,6 +6,8 @@ * Author: Pierre Morel <pmorel@xxxxxxxxxxxxx> */ +#include <asm/arch_def.h> + #ifndef _S390X_CSS_H_ #define _S390X_CSS_H_ @@ -147,14 +149,16 @@ static inline int ssch(unsigned long schid, struct orb *addr) static inline int stsch(unsigned long schid, struct schib *addr) { register unsigned long reg1 asm ("1") = schid; + uint64_t spm_cc = 1 << SPM_CC_SHIFT; int cc; asm volatile( + " spm %[spm_cc]\n" " stsch 0(%3)\n" " ipm %0\n" " srl %0,28" : "=d" (cc), "=m" (*addr) - : "d" (reg1), "a" (addr) + : "d" (reg1), "a" (addr), [spm_cc] "d" (spm_cc) : "cc"); return cc; } @@ -177,14 +181,16 @@ static inline int msch(unsigned long schid, struct schib *addr) static inline int tsch(unsigned long schid, struct irb *addr) { register unsigned long reg1 asm ("1") = schid; + uint64_t spm_cc = 2 << SPM_CC_SHIFT; int cc; asm volatile( + " spm %[spm_cc]\n" " tsch 0(%3)\n" " ipm %0\n" " srl %0,28" : "=d" (cc), "=m" (*addr) - : "d" (reg1), "a" (addr) + : "d" (reg1), "a" (addr), [spm_cc] "d" (spm_cc) : "cc"); return cc; } @@ -252,28 +258,32 @@ static inline int rsch(unsigned long schid) static inline int rchp(unsigned long chpid) { register unsigned long reg1 asm("1") = chpid; + uint64_t spm_cc = 1 << SPM_CC_SHIFT; int cc; asm volatile( + " spm %[spm_cc]\n" " rchp\n" " ipm %0\n" " srl %0,28" : "=d" (cc) - : "d" (reg1) + : "d" (reg1), [spm_cc] "d" (spm_cc) : "cc"); return cc; } static inline int stcrw(uint32_t *crw) { + uint64_t spm_cc = 1 << SPM_CC_SHIFT; int cc; asm volatile( + " spm %[spm_cc]\n" " stcrw %[crw]\n" " ipm %[cc]\n" " srl %[cc],28" : [cc] "=d" (cc) - : [crw] "Q" (*crw) + : [crw] "Q" (*crw), [spm_cc] "d" (spm_cc) : "cc", "memory"); return cc; } diff --git a/s390x/mvpg.c b/s390x/mvpg.c index 296338d4..21e3ecc7 100644 --- a/s390x/mvpg.c +++ b/s390x/mvpg.c @@ -40,12 +40,14 @@ static uint8_t *fresh; static inline int mvpg(unsigned long r0, void *dest, void *src) { register unsigned long reg0 asm ("0") = r0; + uint64_t spm_cc = 3 << SPM_CC_SHIFT; int cc; - asm volatile(" mvpg %1,%2\n" + asm volatile(" spm %[spm_cc]\n" + " mvpg %1,%2\n" " ipm %0\n" " srl %0,28" - : "=&d" (cc) : "a" (dest), "a" (src), "d" (reg0) + : "=&d" (cc) : "a" (dest), "a" (src), "d" (reg0), [spm_cc] "d" (spm_cc) : "memory", "cc"); return cc; } -- 2.40.1