diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-06-16 19:14:46 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-06-16 19:14:46 -0700 |
commit | 77ba3efb094057f7d1a720887c7ae92ca0ac031c (patch) | |
tree | ad1a84a9d1e0068425da403e7c2f312f8e6c6901 | |
parent | 2a3443b531b30cd4aab424d3b2002208ff957474 (diff) | |
download | misc-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.cc | 127 |
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); |