summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@mit.edu>2011-08-09 10:05:48 -0400
committerAndy Lutomirski <luto@mit.edu>2011-08-09 10:05:48 -0400
commitb6e8c1434ee078d244afe95a48845e72ffa938aa (patch)
tree043ad6788bc8be867e0dadf88879d47cc4a7452e
parent74e8edb0cb3c2421f35754bcd2c364b540946c0a (diff)
downloadmisc-tests-b6e8c1434ee078d244afe95a48845e72ffa938aa.tar.gz
Update test_vsyscall for newer kernels.
-rw-r--r--test_vsyscall.cc63
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"))