]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kselftest/arm64: tpidr2: Adjust to new clone() behaviour
authorMark Rutland <mark.rutland@arm.com>
Thu, 8 May 2025 13:26:42 +0000 (14:26 +0100)
committerWill Deacon <will@kernel.org>
Thu, 8 May 2025 14:45:24 +0000 (15:45 +0100)
In order to fix an ABI problem, we recently changed the way that a
clone() syscall manipulates TPIDR2 and PSTATE.ZA. Historically the child
would inherit the parent's TPIDR2 value unless CLONE_SETTLS was set, and
now the child will inherit the parent's TPIDR2 value unless CLONE_VM is
set.

Update the tpidr2 test for the new behaviour.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Daniel Kiss <daniel.kiss@arm.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Richard Sandiford <richard.sandiford@arm.com>
Cc: Sander De Smalen <sander.desmalen@arm.com>
Cc: Tamas Petz <tamas.petz@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Yury Khrustalev <yury.khrustalev@arm.com>
Link: https://lore.kernel.org/r/20250508132644.1395904-23-mark.rutland@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
tools/testing/selftests/arm64/abi/tpidr2.c

index 285c47dd42f630a05794dd544d977b61b1f78f36..eb19dcc37a755998da99a392922bd97e6a9b325b 100644 (file)
@@ -169,8 +169,10 @@ static int sys_clone(unsigned long clone_flags, unsigned long newsp,
                           child_tidptr);
 }
 
+#define __STACK_SIZE (8 * 1024 * 1024)
+
 /*
- * If we clone with CLONE_SETTLS then the value in the parent should
+ * If we clone with CLONE_VM then the value in the parent should
  * be unchanged and the child should start with zero and be able to
  * set its own value.
  */
@@ -179,11 +181,19 @@ static int write_clone_read(void)
        int parent_tid, child_tid;
        pid_t parent, waiting;
        int ret, status;
+       void *stack;
 
        parent = getpid();
        set_tpidr2(parent);
 
-       ret = sys_clone(CLONE_SETTLS, 0, &parent_tid, 0, &child_tid);
+       stack = malloc(__STACK_SIZE);
+       if (!stack) {
+               putstr("# malloc() failed\n");
+               return 0;
+       }
+
+       ret = sys_clone(CLONE_VM, (unsigned long)stack + __STACK_SIZE,
+                       &parent_tid, 0, &child_tid);
        if (ret == -1) {
                putstr("# clone() failed\n");
                putnum(errno);