kselftest/arm64: mte: user_mem: add more test types
authorJoey Gouly <joey.gouly@arm.com>
Wed, 9 Feb 2022 15:22:39 +0000 (15:22 +0000)
committerWill Deacon <will@kernel.org>
Tue, 15 Feb 2022 16:57:50 +0000 (16:57 +0000)
To expand the test coverage for MTE tags in userspace memory,
also perform the test with `write`, `readv` and `writev` syscalls.

Signed-off-by: Joey Gouly <joey.gouly@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Reviewed-by: Mark Brown <broonie@kernel.org>
Tested-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20220209152240.52788-6-joey.gouly@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
tools/testing/selftests/arm64/mte/check_user_mem.c

index 58b1b27..bb4974c 100644 (file)
@@ -11,6 +11,7 @@
 #include <string.h>
 #include <ucontext.h>
 #include <unistd.h>
+#include <sys/uio.h>
 #include <sys/mman.h>
 
 #include "kselftest.h"
@@ -21,6 +22,9 @@ static size_t page_sz;
 
 enum test_type {
        READ_TEST,
+       WRITE_TEST,
+       READV_TEST,
+       WRITEV_TEST,
        LAST_TEST,
 };
 
@@ -81,6 +85,23 @@ static int check_usermem_access_fault(int mem_type, int mode, int mapping,
                                case READ_TEST:
                                        syscall_len = read(fd, ptr + ptroff, size);
                                        break;
+                               case WRITE_TEST:
+                                       syscall_len = write(fd, ptr + ptroff, size);
+                                       break;
+                               case READV_TEST: {
+                                       struct iovec iov[1];
+                                       iov[0].iov_base = ptr + ptroff;
+                                       iov[0].iov_len = size;
+                                       syscall_len = readv(fd, iov, 1);
+                                       break;
+                               }
+                               case WRITEV_TEST: {
+                                       struct iovec iov[1];
+                                       iov[0].iov_base = ptr + ptroff;
+                                       iov[0].iov_len = size;
+                                       syscall_len = writev(fd, iov, 1);
+                                       break;
+                               }
                                case LAST_TEST:
                                        goto usermem_acc_err;
                                }