s390x: STFLE operates on doublewords
PATCH 1/1 s390x: STFLE operates on doublewords
STFLE operates on doublewords, not bytes. Passing in "256" resulted in some ignored bits getting set. Not bad, but also not clean.
Let's just convert our stfle handling code to operate on doublewords.
--- lib/s390x/asm/facility.h | 14 +++++++------- lib/s390x/io.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-)
lib/s390x/asm/facility.h +7 -7
@@ -14,12 +14,12 @@#include <asm/facility.h> #include <asm/arch_def.h> -#define NR_STFL_BYTES 256 -extern uint8_t stfl_bytes[]; +#define NB_STFL_DOUBLEWORDS 32 +extern uint64_t stfl_doublewords[];static inline bool test_facility (int nr) { -return stfl_bytes[nr /8 ] & (0x80U >> (nr %8 )); +return stfl_doublewords[nr /64 ] & (0x8000000000000000UL >> (nr %64 )); }static inline void stfl (void )
@@ -27,9 +27,9 @@ static inline void stfl(void) asmvolatile (" stfl 0(0)\n" : : :"memory" ); } -static inline void stfle (uint8_t *fac,unsigned int len) +static inline void stfle (uint64_t *fac,unsigned int nb_doublewords) { - register unsigned long r0 asm("0") = len - 1; + register unsigned long r0 asm("0") = nb_doublewords - 1; asmvolatile (" .insn s,0xb2b00000,0(%1)\n" :"+d" (r0) :"a" (fac) :"memory" ,"cc" );
@@ -40,9 +40,9 @@ static inline void setup_facilities(void)struct lowcore *lc =NULL ;stfl (); -memcpy (stfl_bytes, &lc->stfl,sizeof (lc->stfl)); +memcpy (stfl_doublewords, &lc->stfl,sizeof (lc->stfl));if (test_facility (7 )) - stfle(stfl_bytes, NR_STFL_BYTES); + stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS); }#endif
lib/s390x/io.c +1 -1
@@ -19,7 +19,7 @@#include "smp.h" extern char ipl_args[]; -uint8_t stfl_bytes[NR_STFL_BYTES] __attribute__((aligned(8))); +uint64_t stfl_doublewords[NB_STFL_DOUBLEWORDS ];static struct spinlock lock;
Signature · 1 line
2.25.1
Quoted 6 lines · David Hildenbrand
STFLE operates on doublewords, not bytes. Passing in "256" resulted in some ignored bits getting set. Not bad, but also not clean.
Let's just convert our stfle handling code to operate on doublewords.
Signed-off-by David Hildenbrand <[email protected]>
Quoted 63 lines
--- lib/s390x/asm/facility.h | 14 +++++++------- lib/s390x/io.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-)lib/s390x/asm/facility.h +7
-7@@ -14,12 +14,12 @@#include <asm/facility.h> #include <asm/arch_def.h> -#define NR_STFL_BYTES 256 -extern uint8_t stfl_bytes[]; +#define NB_STFL_DOUBLEWORDS 32 +extern uint64_t stfl_doublewords[];static inline bool test_facility (int nr) { -return stfl_bytes[nr /8 ] & (0x80U >> (nr %8 )); +return stfl_doublewords[nr /64 ] & (0x8000000000000000UL >> (nr %64 )); }static inline void stfl (void )@@ -27,9 +27,9 @@ static inline void stfl(void) asmvolatile (" stfl 0(0)\n" : : :"memory" ); } -static inline void stfle (uint8_t *fac,unsigned int len) +static inline void stfle (uint64_t *fac,unsigned int nb_doublewords) { - register unsigned long r0 asm("0") = len - 1; + register unsigned long r0 asm("0") = nb_doublewords - 1; asmvolatile (" .insn s,0xb2b00000,0(%1)\n" :"+d" (r0) :"a" (fac) :"memory" ,"cc" );@@ -40,9 +40,9 @@ static inline void setup_facilities(void)struct lowcore *lc =NULL ;stfl (); -memcpy (stfl_bytes, &lc->stfl,sizeof (lc->stfl)); +memcpy (stfl_doublewords, &lc->stfl,sizeof (lc->stfl));if (test_facility (7 )) - stfle(stfl_bytes, NR_STFL_BYTES); + stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS); }#endif lib/s390x/io.c +1
-1@@ -19,7 +19,7 @@#include "smp.h" extern char ipl_args[]; -uint8_t stfl_bytes[NR_STFL_BYTES] __attribute__((aligned(8))); +uint64_t stfl_doublewords[NB_STFL_DOUBLEWORDS ];static struct spinlock lock;
Quoted 6 lines · David Hildenbrand
STFLE operates on doublewords, not bytes. Passing in "256" resulted in some ignored bits getting set. Not bad, but also not clean.
Let's just convert our stfle handling code to operate on doublewords.
Signed-off-by David Hildenbrand <[email protected]>
Quoted 63 lines
--- lib/s390x/asm/facility.h | 14 +++++++------- lib/s390x/io.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-)lib/s390x/asm/facility.h +7
-7@@ -14,12 +14,12 @@#include <asm/facility.h> #include <asm/arch_def.h> -#define NR_STFL_BYTES 256 -extern uint8_t stfl_bytes[]; +#define NB_STFL_DOUBLEWORDS 32 +extern uint64_t stfl_doublewords[];static inline bool test_facility (int nr) { -return stfl_bytes[nr /8 ] & (0x80U >> (nr %8 )); +return stfl_doublewords[nr /64 ] & (0x8000000000000000UL >> (nr %64 )); }static inline void stfl (void )@@ -27,9 +27,9 @@ static inline void stfl(void) asmvolatile (" stfl 0(0)\n" : : :"memory" ); } -static inline void stfle (uint8_t *fac,unsigned int len) +static inline void stfle (uint64_t *fac,unsigned int nb_doublewords) { - register unsigned long r0 asm("0") = len - 1; + register unsigned long r0 asm("0") = nb_doublewords - 1; asmvolatile (" .insn s,0xb2b00000,0(%1)\n" :"+d" (r0) :"a" (fac) :"memory" ,"cc" );@@ -40,9 +40,9 @@ static inline void setup_facilities(void)struct lowcore *lc =NULL ;stfl (); -memcpy (stfl_bytes, &lc->stfl,sizeof (lc->stfl)); +memcpy (stfl_doublewords, &lc->stfl,sizeof (lc->stfl));if (test_facility (7 )) - stfle(stfl_bytes, NR_STFL_BYTES); + stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS); }#endif lib/s390x/io.c +1
-1@@ -19,7 +19,7 @@#include "smp.h" extern char ipl_args[]; -uint8_t stfl_bytes[NR_STFL_BYTES] __attribute__((aligned(8))); +uint64_t stfl_doublewords[NB_STFL_DOUBLEWORDS ];static struct spinlock lock;
Quoted 61 lines · David Hildenbrand
STFLE operates on doublewords, not bytes. Passing in "256" resulted in some ignored bits getting set. Not bad, but also not clean.
Let's just convert our stfle handling code to operate on doublewords.
Signed-off-by David Hildenbrand <[email protected]>--- lib/s390x/asm/facility.h | 14 +++++++------- lib/s390x/io.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-)lib/s390x/asm/facility.h +7
-7@@ -14,12 +14,12 @@#include <asm/facility.h> #include <asm/arch_def.h> -#define NR_STFL_BYTES 256 -extern uint8_t stfl_bytes[]; +#define NB_STFL_DOUBLEWORDS 32 +extern uint64_t stfl_doublewords[];static inline bool test_facility (int nr) { -return stfl_bytes[nr /8 ] & (0x80U >> (nr %8 )); +return stfl_doublewords[nr /64 ] & (0x8000000000000000UL >> (nr %64 )); }static inline void stfl (void )@@ -27,9 +27,9 @@ static inline void stfl(void) asmvolatile (" stfl 0(0)\n" : : :"memory" ); } -static inline void stfle (uint8_t *fac,unsigned int len) +static inline void stfle (uint64_t *fac,unsigned int nb_doublewords) { - register unsigned long r0 asm("0") = len - 1; + register unsigned long r0 asm("0") = nb_doublewords - 1; asmvolatile (" .insn s,0xb2b00000,0(%1)\n" :"+d" (r0) :"a" (fac) :"memory" ,"cc" );@@ -40,9 +40,9 @@ static inline void setup_facilities(void)struct lowcore *lc =NULL ;stfl (); -memcpy (stfl_bytes, &lc->stfl,sizeof (lc->stfl)); +memcpy (stfl_doublewords, &lc->stfl,sizeof (lc->stfl));if (test_facility (7 )) - stfle(stfl_bytes, NR_STFL_BYTES); + stfle(stfl_doublewords, NB_STFL_DOUBLEWORDS); }#endif lib/s390x/io.c +0
-0
lib/s390x/io.c line 25
Quoted 8 lines
lib/s390x/io.c +1
-1@@ -19,7 +19,7 @@#include "smp.h" extern char ipl_args[]; -uint8_t stfl_bytes[NR_STFL_BYTES] __attribute__((aligned(8))); +uint64_t stfl_doublewords[NB_STFL_DOUBLEWORDS ];static struct spinlock lock;
Queued to
https://github.com/davidhildenbrand/kvm-unit-tests.git s390x-next
thanks for the review
Signature · 3 lines
Thanks, David / dhildenb