diff options
author | Andy Lutomirski <luto@mit.edu> | 2011-08-09 10:05:48 -0400 |
---|---|---|
committer | Andy Lutomirski <luto@mit.edu> | 2011-08-09 10:05:48 -0400 |
commit | b6e8c1434ee078d244afe95a48845e72ffa938aa (patch) | |
tree | 043ad6788bc8be867e0dadf88879d47cc4a7452e | |
parent | 74e8edb0cb3c2421f35754bcd2c364b540946c0a (diff) | |
download | misc-tests-b6e8c1434ee078d244afe95a48845e72ffa938aa.tar.gz |
Update test_vsyscall for newer kernels.
-rw-r--r-- | test_vsyscall.cc | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/test_vsyscall.cc b/test_vsyscall.cc index 9b72417..abfc378 100644 --- a/test_vsyscall.cc +++ b/test_vsyscall.cc @@ -79,7 +79,15 @@ static inline long sys_time(time_t *t) return syscall(__NR_time, t); } -/* There is no sys_getcpu. */ +static inline long sys_getcpu(unsigned * cpu, unsigned * node, + struct getcpu_cache* cache) +{ +#ifdef __NR_getcpu + return syscall(__NR_getcpu, cpu, node, cache); +#else + return -ENOSYS; +#endif +} static void segv(int sig, siginfo_t *info, void *ctx_void) { @@ -191,10 +199,13 @@ int test(int argc, char **argv) } printf("Testing getcpu...\n"); - unsigned cpu_vdso, cpu_vsys, node_vdso, node_vsys; + unsigned cpu_sys, cpu_vdso, cpu_vsys, node_sys, node_vdso, node_vsys; + ret_sys = sys_getcpu(&cpu_sys, &node_sys, 0); if (vdso_getcpu) ret_vdso = vdso_getcpu(&cpu_vdso, &node_vdso, 0); ret_vsys = vgetcpu(&cpu_vsys, &node_vsys, 0); + if (!ret_sys) + printf(" syscall: cpu=%u node=%u\n", cpu_sys, node_sys); if (ret_vdso && vdso_getcpu) printf(" vDSO failed (ret:%ld)\n", (unsigned long)ret_vdso); if (ret_vsys) @@ -286,18 +297,46 @@ int call(int argc, char **argv) return 1; } -int intcc(int argc, char **argv) +int intxx(int argc, char **argv) { - if (argc != 0) { - printf("Usage: intcc\n"); + unsigned long vec; + char *end; + + if (argc != 1) { + printf("Usage: intxx <vector>\n"); return 1; } - extern char intcc_addr; - printf("About to execute int 0xcc from RIP = %lX\n", - (unsigned long)&intcc_addr); + errno = 0; + vec = strtoul(argv[0], &end, 0); + if (errno || *end || vec > 0xff) { + printf("Bad argumant\n"); + return 1; + } - asm volatile ("intcc_addr: int $0xcc"); + printf("About to execute int 0x%02x\n", + (unsigned)vec); + + switch (vec) { + case 0xcc: + asm volatile ("int %0" : : "i" (0xcc)); + break; + + case 0x40: + asm volatile ("int %0" : : "i" (0x40)); + break; + + case 0x41: + asm volatile ("int %0" : : "i" (0x41)); + break; + + case 0x42: + asm volatile ("int %0" : : "i" (0x42)); + break; + + default: + printf("Sorry, not implemented.\n"); + } return 0; } @@ -388,7 +427,7 @@ int main(int argc, char **argv) init_vdso(); if (argc < 2) { printf("Usage: test_vsyscall <command> ...\n" - "command := { test, bench, intcc, call }\n"); + "command := { test, bench, int, call }\n"); return 1; } @@ -396,8 +435,8 @@ int main(int argc, char **argv) return test(argc - 2, argv + 2); if (!strcmp(argv[1], "bench")) return bench(argc - 2, argv + 2); - if (!strcmp(argv[1], "intcc")) - return intcc(argc - 2, argv + 2); + if (!strcmp(argv[1], "int")) + return intxx(argc - 2, argv + 2); if (!strcmp(argv[1], "intcc32")) return intcc32(argc - 2, argv + 2); if (!strcmp(argv[1], "call")) |