From: Andrew Jones <andrew.jones@linux.dev>
To: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: Vladimir Murzin <vladimir.murzin@arm.com>,
kvmarm@lists.linux.dev, nikos.nikoleris@arm.com,
eric.auger@redhat.com
Subject: Re: [PATCH v4] arm64: Add basic MTE test
Date: Fri, 7 Mar 2025 09:24:48 +0100 [thread overview]
Message-ID: <20250307-1c14700ea8fffa172525395d@orel> (raw)
In-Reply-To: <Z8nXOBGxEGS5il3N@raptor>
On Thu, Mar 06, 2025 at 05:11:20PM +0000, Alexandru Elisei wrote:
> Hi Drew,
>
> On Thu, Mar 06, 2025 at 04:45:06PM +0100, Andrew Jones wrote:
> > On Thu, Feb 27, 2025 at 03:22:40PM +0000, Vladimir Murzin wrote:
> > > Test tag storage access and tag mismatch for different MTE modes.
> > >
> > > Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
> > > ---
> > > arm/Makefile.arm64 | 8 +
> > > arm/cstart64.S | 4 +-
> > > arm/mte.c | 313 ++++++++++++++++++++++++++++++++++
> > > arm/unittests.cfg | 19 +++
> > > lib/arm64/asm/mmu.h | 1 +
> > > lib/arm64/asm/pgtable-hwdef.h | 3 +
> > > lib/arm64/asm/sysreg.h | 14 ++
> > > 7 files changed, 361 insertions(+), 1 deletion(-)
> > > create mode 100644 arm/mte.c
> > >
> >
> > Unfortunately this is failing builds with clang.
> >
> > arm/mte.c:65:18: error: value size does not match register size specified by the constraint and modifier [-Werror,-Wasm-operand-widths]
> > 65 | : "=&r" (r)
> > | ^
> > arm/mte.c:63:21: note: use constraint modifier "w"
> > 63 | asm volatile ("ldr %0,[%1]\n"
> > | ^~
> > | %w0
> > arm/mte.c:65:18: error: value size does not match register size specified by the constraint and modifier [-Werror,-Wasm-operand-widths]
> > 65 | : "=&r" (r)
> > | ^
> > arm/mte.c:64:14: note: use constraint modifier "w"
> > 64 | "str %0,[%2]\n"
> > | ^~
> > | %w0
> > arm/mte.c:75:16: error: value size does not match register size specified by the constraint and modifier [-Werror,-Wasm-operand-widths]
> > 75 | : "r" (val), "r" (addr)
> > | ^
> > arm/mte.c:72:21: note: use constraint modifier "w"
> > 72 | asm volatile ("str %0,[%1]\n"
> > | ^~
> > | %w0
> >
> > Thanks,
> > drew
> >
>
> That's unfortunate, I think it's because %0 specifies a 64bit register, but
> the variable is declared as an unsigned int, which is 32 bits.
>
> Can you give this a go:
>
> diff --git a/arm/mte.c b/arm/mte.c
> index f32203ce275a..9c266fcced5f 100644
> --- a/arm/mte.c
> +++ b/arm/mte.c
> @@ -60,8 +60,8 @@ static inline void mem_read(unsigned int *addr, unsigned int *res)
> {
> unsigned int r;
>
> - asm volatile ("ldr %0,[%1]\n"
> - "str %0,[%2]\n"
> + asm volatile ("ldr %w0,[%1]\n"
> + "str %w0,[%2]\n"
> : "=&r" (r)
> : "r" (addr), "r" (res) : "memory");
> }
> @@ -69,7 +69,7 @@ static inline void mem_read(unsigned int *addr, unsigned int *res)
> static inline void mem_write(unsigned int *addr, unsigned int val)
> {
> /* The NOP allows the same exception handler as mem_read() to be used. */
> - asm volatile ("str %0,[%1]\n"
> + asm volatile ("str %w0,[%1]\n"
> "nop\n"
> :
> : "r" (val), "r" (addr)
>
> It compiles and works with gcc; with clang it compiles,
Yup, works.
> but I cannot run
> the test because kvm-unit-tests doesn't detect MTE support in the compiler.
>
> $ ./configure --arch=arm64 --cc=clang --cross-prefix=aarch64-linux-gnu- --cflags='--target=aarch64-linux -march=armv8.5-a+memtag'
> $ make -j32 clean && make -j32
> $ ./run_tests.sh -g mte
> config.mak: line 13: -march=armv8.5-a+memtag: command not found
> config.mak: line 13: -march=armv8.5-a+memtag: command not found
> SKIP mte-sync (1 tests, 1 skipped)
> SKIP mte-async (1 tests, 1 skipped)
> SKIP mte-asymm (1 tests, 1 skipped)
>
> (the error I suppose it's because configure doesn't wrap CFLAGS in quotes
> when writing config.mak).
We shouldn't need to add -march=armv8.5-a+memtag to --cflags, since this
patch adds the cc-option check in arm/Makefile.arm64. Also, I see that
--target=aarch64-linux, as opposed to just --target=aarch64 that we have
in .gitlab-ci.yml, fails to build arm/spinlock-test.c (at least for me),
so I don't think we want to change that either.
>
> Do you have any hints about enabling MTE in clang?
We need to change cc-option to also specify CFLAGS, like below, then
everything works for me.
diff --git a/Makefile b/Makefile
index 78352fced9d4..9dc5d2234e2a 100644
--- a/Makefile
+++ b/Makefile
@@ -21,7 +21,7 @@ DESTDIR := $(PREFIX)/share/kvm-unit-tests/
# cc-option
# Usage: OP_CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0)
-cc-option = $(shell if $(CC) -Werror $(1) -S -o /dev/null -xc /dev/null \
+cc-option = $(shell if $(CC) $(CFLAGS) -Werror $(1) -S -o /dev/null -xc /dev/null \
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
libcflat := lib/libcflat.a
Thanks,
drew
next prev parent reply other threads:[~2025-03-07 8:24 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-27 15:22 [PATCH v4] arm64: Add basic MTE test Vladimir Murzin
2025-03-06 14:11 ` Alexandru Elisei
2025-03-06 14:25 ` Vladimir Murzin
2025-03-06 15:31 ` Andrew Jones
2025-03-06 15:45 ` Andrew Jones
2025-03-06 17:11 ` Alexandru Elisei
2025-03-07 8:24 ` Andrew Jones [this message]
2025-03-07 9:26 ` Andrew Jones
2025-04-08 15:16 ` Andrew Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250307-1c14700ea8fffa172525395d@orel \
--to=andrew.jones@linux.dev \
--cc=alexandru.elisei@arm.com \
--cc=eric.auger@redhat.com \
--cc=kvmarm@lists.linux.dev \
--cc=nikos.nikoleris@arm.com \
--cc=vladimir.murzin@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox