Commit 146c9ab3 authored by Sayali Patil's avatar Sayali Patil Committed by Madhavan Srinivasan
Browse files

powerpc/selftests/copyloops: extend selftest to exercise __copy_tofrom_user_power7_vmx



The new PowerPC VMX fast path (__copy_tofrom_user_power7_vmx) is not
exercised by existing copyloops selftests. This patch updates
the selftest to exercise the VMX variant, ensuring the VMX copy path
is validated.

Changes include:
  - COPY_LOOP=test___copy_tofrom_user_power7_vmx with -D VMX_TEST is used
    in existing selftest build targets.
  - Inclusion of ../utils.c to provide get_auxv_entry() for hardware
    feature detection.
  - At runtime, the test skips execution if Altivec is not available.
  - Copy sizes above VMX_COPY_THRESHOLD are used to ensure the VMX
    path is taken.

This enables validation of the VMX fast path without affecting systems
that do not support Altivec.

Signed-off-by: default avatarSayali Patil <sayalip@linux.ibm.com>
Tested-by: default avatarVenkat Rao Bagalkote <venkat88@linux.ibm.com>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260304122201.153049-2-sayalip@linux.ibm.com
parent 6bc9c0a9
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@
copyuser_64_t0
copyuser_64_t1
copyuser_64_t2
copyuser_p7_t0
copyuser_p7_t1
copyuser_p7
copyuser_p7_vmx
memcpy_64_t0
memcpy_64_t1
memcpy_64_t2
+8 −3
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \
		copyuser_p7_t0 copyuser_p7_t1 \
		copyuser_p7 copyuser_p7_vmx \
		memcpy_64_t0 memcpy_64_t1 memcpy_64_t2 \
		memcpy_p7_t0 memcpy_p7_t1 copy_mc_64 \
		copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 \
@@ -28,10 +28,15 @@ $(OUTPUT)/copyuser_64_t%: copyuser_64.S $(EXTRA_SOURCES)
		-D SELFTEST_CASE=$(subst copyuser_64_t,,$(notdir $@)) \
		-o $@ $^

$(OUTPUT)/copyuser_p7_t%:	copyuser_power7.S $(EXTRA_SOURCES)
$(OUTPUT)/copyuser_p7:	copyuser_power7.S $(EXTRA_SOURCES)
	$(CC) $(CPPFLAGS) $(CFLAGS) \
		-D COPY_LOOP=test___copy_tofrom_user_power7 \
		-D SELFTEST_CASE=$(subst copyuser_p7_t,,$(notdir $@)) \
		-o $@ $^

$(OUTPUT)/copyuser_p7_vmx:       copyuser_power7.S $(EXTRA_SOURCES) ../utils.c
	$(CC) $(CPPFLAGS) $(CFLAGS) \
		-D COPY_LOOP=test___copy_tofrom_user_power7_vmx \
		-D VMX_TEST \
		-o $@ $^

# Strictly speaking, we only need the memcpy_64 test cases for big-endian
+0 −8
Original line number Diff line number Diff line
#include <asm/ppc_asm.h>

FUNC_START(enter_vmx_usercopy)
	li	r3,1
	blr

FUNC_START(exit_vmx_usercopy)
	li	r3,0
	blr

FUNC_START(enter_vmx_ops)
	li	r3,1
	blr
+14 −1
Original line number Diff line number Diff line
@@ -12,6 +12,10 @@
#define BUFLEN (MAX_LEN+MAX_OFFSET+2*MIN_REDZONE)
#define POISON 0xa5

#ifdef VMX_TEST
#define VMX_COPY_THRESHOLD 3328
#endif

unsigned long COPY_LOOP(void *to, const void *from, unsigned long size);

static void do_one(char *src, char *dst, unsigned long src_off,
@@ -81,8 +85,12 @@ int test_copy_loop(void)
	/* Fill with sequential bytes */
	for (i = 0; i < BUFLEN; i++)
		fill[i] = i & 0xff;

#ifdef VMX_TEST
	/* Force sizes above kernel VMX threshold (3328) */
	for (len = VMX_COPY_THRESHOLD + 1; len < MAX_LEN; len++) {
#else
	for (len = 1; len < MAX_LEN; len++) {
#endif
		for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
			for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
				do_one(src, dst, src_off, dst_off, len,
@@ -96,5 +104,10 @@ int test_copy_loop(void)

int main(void)
{
#ifdef VMX_TEST
	/* Skip if Altivec not present */
	SKIP_IF_MSG(!have_hwcap(PPC_FEATURE_HAS_ALTIVEC), "ALTIVEC not supported");
#endif

	return test_harness(test_copy_loop, str(COPY_LOOP));
}