summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-06-16 19:14:46 -0700
committerAndy Lutomirski <luto@amacapital.net>2014-06-16 19:14:46 -0700
commit77ba3efb094057f7d1a720887c7ae92ca0ac031c (patch)
treead1a84a9d1e0068425da403e7c2f312f8e6c6901
parent2a3443b531b30cd4aab424d3b2002208ff957474 (diff)
downloadmisc-tests-77ba3efb094057f7d1a720887c7ae92ca0ac031c.tar.gz
test_vsyscall: Remove asm int support
The corresponding kernel code never made it into a released kernel.
-rw-r--r--test_vsyscall.cc127
1 files changed, 0 insertions, 127 deletions
diff --git a/test_vsyscall.cc b/test_vsyscall.cc
index e131c37..b285856 100644
--- a/test_vsyscall.cc
+++ b/test_vsyscall.cc
@@ -313,129 +313,6 @@ int call(int argc, char **argv)
return 1;
}
-int intxx(int argc, char **argv)
-{
- unsigned long vec;
- char *end;
-
- if (argc != 1) {
- printf("Usage: intxx <vector>\n");
- return 1;
- }
-
- errno = 0;
- vec = strtoul(argv[0], &end, 0);
- if (errno || *end || vec > 0xff) {
- printf("Bad argumant\n");
- return 1;
- }
-
- 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;
-}
-
-struct __attribute__((packed)) farptr {
- uint32_t offset;
- uint16_t sel;
-};
-
-#if __x86_64__
-static bool to_farptr(farptr *out, uint16_t sel, void *offset)
-{
- out->sel = sel;
- out->offset = (uint32_t)(unsigned long)offset;
- return out->offset == (unsigned long)offset;
-}
-#endif
-
-int intcc32(int argc, char **argv)
-{
- if (argc != 0) {
- printf("Usage: intcc32\n");
- return 1;
- }
-
-#if __x86_64__
- // Install a 32-bit code descriptor
- struct user_desc desc;
- memset(&desc, 0, sizeof(desc));
- desc.entry_number = 0;
- desc.base_addr = 0;
- desc.limit = 0xFFFFF;
- desc.seg_32bit = 1;
- desc.contents = MODIFY_LDT_CONTENTS_CODE;
- desc.limit_in_pages = 1;
-
- if (modify_ldt(1, &desc, sizeof(desc)) != 0) {
- perror("modify_ldt");
- return 1;
- }
-
- /* Load the initial CS. */
- uint16_t initial_cs;
- asm ("mov %%cs,%[initial_cs]" : [initial_cs] "=rm" (initial_cs));
- printf("Initial CS = 0x%04X (entry %d)\n",
- (unsigned)initial_cs, (int)(initial_cs >> 3));
-
- extern char landing_32, landing_64;
-
- /* Set up the pointers. */
- static farptr ptr32, ptr64;
- if (!to_farptr(&ptr32, 0x4, &landing_32) || !to_farptr(&ptr64, initial_cs, &landing_64)) {
- printf("Something's mapped too high\n");
- return 1;
- }
-
- /* Go for it! */
- asm volatile (
- "mov %%rsp,%%rsi\n" // Save rsp (avoids truncation).
- "ljmpl *(%%eax)\n" // Switch to 32-bit mode.
-
- // 32-bit mode!
- // (Well, sort of. DS and ES are 0, so we can't use them.)
- ".code32\n"
- "landing_32:\n"
- "\tint $0xcc\n" // Try int 0xcc.
- "\tljmpl *%%cs:(%%ecx)\n" // Switch back.
-
- // 64-bit mode again!
- ".code64\n"
- "landing_64:\n"
- "\tmov %%rsi,%%rsp"
- :
- : "a" (&ptr32), "c" (&ptr64)
- : "rsi", "cc");
-
- printf("Holy cow! We survived!\n");
-#else
- printf("Not supported on 32-bit builds\n");
-#endif
-
- return 0;
-}
-
int main(int argc, char **argv)
{
struct sigaction sa_segv;
@@ -457,10 +334,6 @@ 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], "int"))
- return intxx(argc - 2, argv + 2);
- if (!strcmp(argv[1], "intcc32"))
- return intcc32(argc - 2, argv + 2);
if (!strcmp(argv[1], "call"))
return call(argc - 2, argv + 2);