diff options
Diffstat (limited to 'tools/testing')
| -rw-r--r-- | tools/testing/selftests/powerpc/mm/subpage_prot.c | 14 | ||||
| -rw-r--r-- | tools/testing/selftests/powerpc/tm/Makefile | 2 | ||||
| -rw-r--r-- | tools/testing/selftests/powerpc/tm/tm-trap.c | 2 | ||||
| -rwxr-xr-x | tools/testing/selftests/vm/run_vmtests | 25 | ||||
| -rw-r--r-- | tools/testing/selftests/x86/entry_from_vm86.c | 32 | ||||
| -rw-r--r-- | tools/testing/selftests/x86/test_vsyscall.c | 11 |
6 files changed, 68 insertions, 18 deletions
diff --git a/tools/testing/selftests/powerpc/mm/subpage_prot.c b/tools/testing/selftests/powerpc/mm/subpage_prot.c index 35ade7406dcd..3ae77ba93208 100644 --- a/tools/testing/selftests/powerpc/mm/subpage_prot.c +++ b/tools/testing/selftests/powerpc/mm/subpage_prot.c | |||
| @@ -135,6 +135,16 @@ static int run_test(void *addr, unsigned long size) | |||
| 135 | return 0; | 135 | return 0; |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | static int syscall_available(void) | ||
| 139 | { | ||
| 140 | int rc; | ||
| 141 | |||
| 142 | errno = 0; | ||
| 143 | rc = syscall(__NR_subpage_prot, 0, 0, 0); | ||
| 144 | |||
| 145 | return rc == 0 || (errno != ENOENT && errno != ENOSYS); | ||
| 146 | } | ||
| 147 | |||
| 138 | int test_anon(void) | 148 | int test_anon(void) |
| 139 | { | 149 | { |
| 140 | unsigned long align; | 150 | unsigned long align; |
| @@ -145,6 +155,8 @@ int test_anon(void) | |||
| 145 | void *mallocblock; | 155 | void *mallocblock; |
| 146 | unsigned long mallocsize; | 156 | unsigned long mallocsize; |
| 147 | 157 | ||
| 158 | SKIP_IF(!syscall_available()); | ||
| 159 | |||
| 148 | if (getpagesize() != 0x10000) { | 160 | if (getpagesize() != 0x10000) { |
| 149 | fprintf(stderr, "Kernel page size must be 64K!\n"); | 161 | fprintf(stderr, "Kernel page size must be 64K!\n"); |
| 150 | return 1; | 162 | return 1; |
| @@ -180,6 +192,8 @@ int test_file(void) | |||
| 180 | off_t filesize; | 192 | off_t filesize; |
| 181 | int fd; | 193 | int fd; |
| 182 | 194 | ||
| 195 | SKIP_IF(!syscall_available()); | ||
| 196 | |||
| 183 | fd = open(file_name, O_RDWR); | 197 | fd = open(file_name, O_RDWR); |
| 184 | if (fd == -1) { | 198 | if (fd == -1) { |
| 185 | perror("failed to open file"); | 199 | perror("failed to open file"); |
diff --git a/tools/testing/selftests/powerpc/tm/Makefile b/tools/testing/selftests/powerpc/tm/Makefile index a23453943ad2..5c72ff978f27 100644 --- a/tools/testing/selftests/powerpc/tm/Makefile +++ b/tools/testing/selftests/powerpc/tm/Makefile | |||
| @@ -16,7 +16,7 @@ $(OUTPUT)/tm-syscall: tm-syscall-asm.S | |||
| 16 | $(OUTPUT)/tm-syscall: CFLAGS += -I../../../../../usr/include | 16 | $(OUTPUT)/tm-syscall: CFLAGS += -I../../../../../usr/include |
| 17 | $(OUTPUT)/tm-tmspr: CFLAGS += -pthread | 17 | $(OUTPUT)/tm-tmspr: CFLAGS += -pthread |
| 18 | $(OUTPUT)/tm-vmx-unavail: CFLAGS += -pthread -m64 | 18 | $(OUTPUT)/tm-vmx-unavail: CFLAGS += -pthread -m64 |
| 19 | $(OUTPUT)/tm-resched-dscr: ../pmu/lib.o | 19 | $(OUTPUT)/tm-resched-dscr: ../pmu/lib.c |
| 20 | $(OUTPUT)/tm-unavailable: CFLAGS += -O0 -pthread -m64 -Wno-error=uninitialized -mvsx | 20 | $(OUTPUT)/tm-unavailable: CFLAGS += -O0 -pthread -m64 -Wno-error=uninitialized -mvsx |
| 21 | $(OUTPUT)/tm-trap: CFLAGS += -O0 -pthread -m64 | 21 | $(OUTPUT)/tm-trap: CFLAGS += -O0 -pthread -m64 |
| 22 | 22 | ||
diff --git a/tools/testing/selftests/powerpc/tm/tm-trap.c b/tools/testing/selftests/powerpc/tm/tm-trap.c index 5d92c23ee6cb..179d592f0073 100644 --- a/tools/testing/selftests/powerpc/tm/tm-trap.c +++ b/tools/testing/selftests/powerpc/tm/tm-trap.c | |||
| @@ -255,6 +255,8 @@ int tm_trap_test(void) | |||
| 255 | 255 | ||
| 256 | struct sigaction trap_sa; | 256 | struct sigaction trap_sa; |
| 257 | 257 | ||
| 258 | SKIP_IF(!have_htm()); | ||
| 259 | |||
| 258 | trap_sa.sa_flags = SA_SIGINFO; | 260 | trap_sa.sa_flags = SA_SIGINFO; |
| 259 | trap_sa.sa_sigaction = trap_signal_handler; | 261 | trap_sa.sa_sigaction = trap_signal_handler; |
| 260 | sigaction(SIGTRAP, &trap_sa, NULL); | 262 | sigaction(SIGTRAP, &trap_sa, NULL); |
diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests index d2561895a021..22d564673830 100755 --- a/tools/testing/selftests/vm/run_vmtests +++ b/tools/testing/selftests/vm/run_vmtests | |||
| @@ -2,25 +2,33 @@ | |||
| 2 | # SPDX-License-Identifier: GPL-2.0 | 2 | # SPDX-License-Identifier: GPL-2.0 |
| 3 | #please run as root | 3 | #please run as root |
| 4 | 4 | ||
| 5 | #we need 256M, below is the size in kB | ||
| 6 | needmem=262144 | ||
| 7 | mnt=./huge | 5 | mnt=./huge |
| 8 | exitcode=0 | 6 | exitcode=0 |
| 9 | 7 | ||
| 10 | #get pagesize and freepages from /proc/meminfo | 8 | #get huge pagesize and freepages from /proc/meminfo |
| 11 | while read name size unit; do | 9 | while read name size unit; do |
| 12 | if [ "$name" = "HugePages_Free:" ]; then | 10 | if [ "$name" = "HugePages_Free:" ]; then |
| 13 | freepgs=$size | 11 | freepgs=$size |
| 14 | fi | 12 | fi |
| 15 | if [ "$name" = "Hugepagesize:" ]; then | 13 | if [ "$name" = "Hugepagesize:" ]; then |
| 16 | pgsize=$size | 14 | hpgsize_KB=$size |
| 17 | fi | 15 | fi |
| 18 | done < /proc/meminfo | 16 | done < /proc/meminfo |
| 19 | 17 | ||
| 18 | # Simple hugetlbfs tests have a hardcoded minimum requirement of | ||
| 19 | # huge pages totaling 256MB (262144KB) in size. The userfaultfd | ||
| 20 | # hugetlb test requires a minimum of 2 * nr_cpus huge pages. Take | ||
| 21 | # both of these requirements into account and attempt to increase | ||
| 22 | # number of huge pages available. | ||
| 23 | nr_cpus=$(nproc) | ||
| 24 | hpgsize_MB=$((hpgsize_KB / 1024)) | ||
| 25 | half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128)) | ||
| 26 | needmem_KB=$((half_ufd_size_MB * 2 * 1024)) | ||
| 27 | |||
| 20 | #set proper nr_hugepages | 28 | #set proper nr_hugepages |
| 21 | if [ -n "$freepgs" ] && [ -n "$pgsize" ]; then | 29 | if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then |
| 22 | nr_hugepgs=`cat /proc/sys/vm/nr_hugepages` | 30 | nr_hugepgs=`cat /proc/sys/vm/nr_hugepages` |
| 23 | needpgs=`expr $needmem / $pgsize` | 31 | needpgs=$((needmem_KB / hpgsize_KB)) |
| 24 | tries=2 | 32 | tries=2 |
| 25 | while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do | 33 | while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do |
| 26 | lackpgs=$(( $needpgs - $freepgs )) | 34 | lackpgs=$(( $needpgs - $freepgs )) |
| @@ -107,8 +115,9 @@ fi | |||
| 107 | echo "---------------------------" | 115 | echo "---------------------------" |
| 108 | echo "running userfaultfd_hugetlb" | 116 | echo "running userfaultfd_hugetlb" |
| 109 | echo "---------------------------" | 117 | echo "---------------------------" |
| 110 | # 256MB total huge pages == 128MB src and 128MB dst | 118 | # Test requires source and destination huge pages. Size of source |
| 111 | ./userfaultfd hugetlb 128 32 $mnt/ufd_test_file | 119 | # (half_ufd_size_MB) is passed as argument to test. |
| 120 | ./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file | ||
| 112 | if [ $? -ne 0 ]; then | 121 | if [ $? -ne 0 ]; then |
| 113 | echo "[FAIL]" | 122 | echo "[FAIL]" |
| 114 | exitcode=1 | 123 | exitcode=1 |
diff --git a/tools/testing/selftests/x86/entry_from_vm86.c b/tools/testing/selftests/x86/entry_from_vm86.c index 361466a2eaef..ade443a88421 100644 --- a/tools/testing/selftests/x86/entry_from_vm86.c +++ b/tools/testing/selftests/x86/entry_from_vm86.c | |||
| @@ -95,6 +95,10 @@ asm ( | |||
| 95 | "int3\n\t" | 95 | "int3\n\t" |
| 96 | "vmcode_int80:\n\t" | 96 | "vmcode_int80:\n\t" |
| 97 | "int $0x80\n\t" | 97 | "int $0x80\n\t" |
| 98 | "vmcode_popf_hlt:\n\t" | ||
| 99 | "push %ax\n\t" | ||
| 100 | "popf\n\t" | ||
| 101 | "hlt\n\t" | ||
| 98 | "vmcode_umip:\n\t" | 102 | "vmcode_umip:\n\t" |
| 99 | /* addressing via displacements */ | 103 | /* addressing via displacements */ |
| 100 | "smsw (2052)\n\t" | 104 | "smsw (2052)\n\t" |
| @@ -124,8 +128,8 @@ asm ( | |||
| 124 | 128 | ||
| 125 | extern unsigned char vmcode[], end_vmcode[]; | 129 | extern unsigned char vmcode[], end_vmcode[]; |
| 126 | extern unsigned char vmcode_bound[], vmcode_sysenter[], vmcode_syscall[], | 130 | extern unsigned char vmcode_bound[], vmcode_sysenter[], vmcode_syscall[], |
| 127 | vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_umip[], | 131 | vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_popf_hlt[], |
| 128 | vmcode_umip_str[], vmcode_umip_sldt[]; | 132 | vmcode_umip[], vmcode_umip_str[], vmcode_umip_sldt[]; |
| 129 | 133 | ||
| 130 | /* Returns false if the test was skipped. */ | 134 | /* Returns false if the test was skipped. */ |
| 131 | static bool do_test(struct vm86plus_struct *v86, unsigned long eip, | 135 | static bool do_test(struct vm86plus_struct *v86, unsigned long eip, |
| @@ -175,7 +179,7 @@ static bool do_test(struct vm86plus_struct *v86, unsigned long eip, | |||
| 175 | (VM86_TYPE(ret) == rettype && VM86_ARG(ret) == retarg)) { | 179 | (VM86_TYPE(ret) == rettype && VM86_ARG(ret) == retarg)) { |
| 176 | printf("[OK]\tReturned correctly\n"); | 180 | printf("[OK]\tReturned correctly\n"); |
| 177 | } else { | 181 | } else { |
| 178 | printf("[FAIL]\tIncorrect return reason\n"); | 182 | printf("[FAIL]\tIncorrect return reason (started at eip = 0x%lx, ended at eip = 0x%lx)\n", eip, v86->regs.eip); |
| 179 | nerrs++; | 183 | nerrs++; |
| 180 | } | 184 | } |
| 181 | 185 | ||
| @@ -264,6 +268,9 @@ int main(void) | |||
| 264 | v86.regs.ds = load_addr / 16; | 268 | v86.regs.ds = load_addr / 16; |
| 265 | v86.regs.es = load_addr / 16; | 269 | v86.regs.es = load_addr / 16; |
| 266 | 270 | ||
| 271 | /* Use the end of the page as our stack. */ | ||
| 272 | v86.regs.esp = 4096; | ||
| 273 | |||
| 267 | assert((v86.regs.cs & 3) == 0); /* Looks like RPL = 0 */ | 274 | assert((v86.regs.cs & 3) == 0); /* Looks like RPL = 0 */ |
| 268 | 275 | ||
| 269 | /* #BR -- should deliver SIG??? */ | 276 | /* #BR -- should deliver SIG??? */ |
| @@ -295,6 +302,23 @@ int main(void) | |||
| 295 | v86.regs.eflags &= ~X86_EFLAGS_IF; | 302 | v86.regs.eflags &= ~X86_EFLAGS_IF; |
| 296 | do_test(&v86, vmcode_sti - vmcode, VM86_STI, 0, "STI with VIP set"); | 303 | do_test(&v86, vmcode_sti - vmcode, VM86_STI, 0, "STI with VIP set"); |
| 297 | 304 | ||
| 305 | /* POPF with VIP set but IF clear: should not trap */ | ||
| 306 | v86.regs.eflags = X86_EFLAGS_VIP; | ||
| 307 | v86.regs.eax = 0; | ||
| 308 | do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP set and IF clear"); | ||
| 309 | |||
| 310 | /* POPF with VIP set and IF set: should trap */ | ||
| 311 | v86.regs.eflags = X86_EFLAGS_VIP; | ||
| 312 | v86.regs.eax = X86_EFLAGS_IF; | ||
| 313 | do_test(&v86, vmcode_popf_hlt - vmcode, VM86_STI, 0, "POPF with VIP and IF set"); | ||
| 314 | |||
| 315 | /* POPF with VIP clear and IF set: should not trap */ | ||
| 316 | v86.regs.eflags = 0; | ||
| 317 | v86.regs.eax = X86_EFLAGS_IF; | ||
| 318 | do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP clear and IF set"); | ||
| 319 | |||
| 320 | v86.regs.eflags = 0; | ||
| 321 | |||
| 298 | /* INT3 -- should cause #BP */ | 322 | /* INT3 -- should cause #BP */ |
| 299 | do_test(&v86, vmcode_int3 - vmcode, VM86_TRAP, 3, "INT3"); | 323 | do_test(&v86, vmcode_int3 - vmcode, VM86_TRAP, 3, "INT3"); |
| 300 | 324 | ||
| @@ -318,7 +342,7 @@ int main(void) | |||
| 318 | clearhandler(SIGSEGV); | 342 | clearhandler(SIGSEGV); |
| 319 | 343 | ||
| 320 | /* Make sure nothing explodes if we fork. */ | 344 | /* Make sure nothing explodes if we fork. */ |
| 321 | if (fork() > 0) | 345 | if (fork() == 0) |
| 322 | return 0; | 346 | return 0; |
| 323 | 347 | ||
| 324 | return (nerrs == 0 ? 0 : 1); | 348 | return (nerrs == 0 ? 0 : 1); |
diff --git a/tools/testing/selftests/x86/test_vsyscall.c b/tools/testing/selftests/x86/test_vsyscall.c index be81621446f0..0b4f1cc2291c 100644 --- a/tools/testing/selftests/x86/test_vsyscall.c +++ b/tools/testing/selftests/x86/test_vsyscall.c | |||
| @@ -450,7 +450,7 @@ static void sigtrap(int sig, siginfo_t *info, void *ctx_void) | |||
| 450 | num_vsyscall_traps++; | 450 | num_vsyscall_traps++; |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | static int test_native_vsyscall(void) | 453 | static int test_emulation(void) |
| 454 | { | 454 | { |
| 455 | time_t tmp; | 455 | time_t tmp; |
| 456 | bool is_native; | 456 | bool is_native; |
| @@ -458,7 +458,7 @@ static int test_native_vsyscall(void) | |||
| 458 | if (!vtime) | 458 | if (!vtime) |
| 459 | return 0; | 459 | return 0; |
| 460 | 460 | ||
| 461 | printf("[RUN]\tchecking for native vsyscall\n"); | 461 | printf("[RUN]\tchecking that vsyscalls are emulated\n"); |
| 462 | sethandler(SIGTRAP, sigtrap, 0); | 462 | sethandler(SIGTRAP, sigtrap, 0); |
| 463 | set_eflags(get_eflags() | X86_EFLAGS_TF); | 463 | set_eflags(get_eflags() | X86_EFLAGS_TF); |
| 464 | vtime(&tmp); | 464 | vtime(&tmp); |
| @@ -474,11 +474,12 @@ static int test_native_vsyscall(void) | |||
| 474 | */ | 474 | */ |
| 475 | is_native = (num_vsyscall_traps > 1); | 475 | is_native = (num_vsyscall_traps > 1); |
| 476 | 476 | ||
| 477 | printf("\tvsyscalls are %s (%d instructions in vsyscall page)\n", | 477 | printf("[%s]\tvsyscalls are %s (%d instructions in vsyscall page)\n", |
| 478 | (is_native ? "FAIL" : "OK"), | ||
| 478 | (is_native ? "native" : "emulated"), | 479 | (is_native ? "native" : "emulated"), |
| 479 | (int)num_vsyscall_traps); | 480 | (int)num_vsyscall_traps); |
| 480 | 481 | ||
| 481 | return 0; | 482 | return is_native; |
| 482 | } | 483 | } |
| 483 | #endif | 484 | #endif |
| 484 | 485 | ||
| @@ -498,7 +499,7 @@ int main(int argc, char **argv) | |||
| 498 | nerrs += test_vsys_r(); | 499 | nerrs += test_vsys_r(); |
| 499 | 500 | ||
| 500 | #ifdef __x86_64__ | 501 | #ifdef __x86_64__ |
| 501 | nerrs += test_native_vsyscall(); | 502 | nerrs += test_emulation(); |
| 502 | #endif | 503 | #endif |
| 503 | 504 | ||
| 504 | return nerrs ? 1 : 0; | 505 | return nerrs ? 1 : 0; |
