On Mon, 16 May 2022 16:43:32 +0200 Janis Schoetterl-Glausch <scgl@xxxxxxxxxxxxx> wrote: > gcc 12 warns if a memory operand to inline asm points to memory in the > first 4k bytes. However, in our case, these operands are fine, either > because we actually want to use that memory, or expect and handle the > resulting exception. > Therefore, silence the warning. I really dislike this > > Signed-off-by: Janis Schoetterl-Glausch <scgl@xxxxxxxxxxxxx> > --- > > Alternatives: > * Use memory clobber instead of memory output > Use address in register input instead of memory input > (may require WRITE_ONCE) this sounds better. would you also get rid of the asm("0") annotations on the variables? I really dislike those too > * Disable the warning globally > * Don't use gcc 12.0, with newer versions --param=min-pagesize=0 might > avoid the problem > > lib/s390x/asm/cpacf.h | 7 +++++++ > s390x/skey.c | 7 +++++++ > 2 files changed, 14 insertions(+) > > diff --git a/lib/s390x/asm/cpacf.h b/lib/s390x/asm/cpacf.h > index 685262b0..02e603c8 100644 > --- a/lib/s390x/asm/cpacf.h > +++ b/lib/s390x/asm/cpacf.h > @@ -152,6 +152,12 @@ static __always_inline void __cpacf_query(unsigned int opcode, cpacf_mask_t *mas > register unsigned long r0 asm("0") = 0; /* query function */ > register unsigned long r1 asm("1") = (unsigned long) mask; > > +/* > + * gcc 12.0.1 warns if mask is < 4k. > + * We use such addresses to test invalid or protected mask arguments. > + */ > +#pragma GCC diagnostic push > +#pragma GCC diagnostic ignored "-Warray-bounds" > asm volatile( > " spm 0\n" /* pckmo doesn't change the cc */ > /* Parameter regs are ignored, but must be nonzero and unique */ > @@ -160,6 +166,7 @@ static __always_inline void __cpacf_query(unsigned int opcode, cpacf_mask_t *mas > : "=m" (*mask) > : [fc] "d" (r0), [pba] "a" (r1), [opc] "i" (opcode) > : "cc"); > +#pragma GCC diagnostic pop > } > > static inline int __cpacf_check_opcode(unsigned int opcode) > diff --git a/s390x/skey.c b/s390x/skey.c > index 32bf1070..7aa91d19 100644 > --- a/s390x/skey.c > +++ b/s390x/skey.c > @@ -242,12 +242,19 @@ static void test_store_cpu_address(void) > */ > static void set_prefix_key_1(uint32_t *prefix_ptr) > { > +/* > + * gcc 12.0.1 warns if prefix_ptr is < 4k. > + * We need such addresses to test fetch protection override. > + */ > +#pragma GCC diagnostic push > +#pragma GCC diagnostic ignored "-Warray-bounds" > asm volatile ( > "spka 0x10\n\t" > "spx %0\n\t" > "spka 0\n" > :: "Q" (*prefix_ptr) > ); > +#pragma GCC diagnostic pop > } > > /* > > base-commit: c315f52b88b967cfb4cd58f3b4e1987378c47f3b