* Jump to state (also restores %rip and %rsp) */
| 5902 | * Jump to state (also restores %rip and %rsp) |
| 5903 | */ |
| 5904 | static __attribute__((noreturn)) void jump(const struct STATE *state) |
| 5905 | { |
| 5906 | asm volatile |
| 5907 | ( |
| 5908 | /* "mov 0x00(%0),%%rflags\n" */ |
| 5909 | "mov 0x08(%0),%%r15\n" |
| 5910 | "mov 0x10(%0),%%r14\n" |
| 5911 | "mov 0x18(%0),%%r13\n" |
| 5912 | "mov 0x20(%0),%%r12\n" |
| 5913 | "mov 0x28(%0),%%r11\n" |
| 5914 | "mov 0x30(%0),%%r10\n" |
| 5915 | "mov 0x38(%0),%%r9\n" |
| 5916 | "mov 0x40(%0),%%r8\n" |
| 5917 | "mov 0x48(%0),%%rdi\n" |
| 5918 | "mov 0x50(%0),%%rsi\n" |
| 5919 | "mov 0x58(%0),%%rbp\n" |
| 5920 | "mov 0x60(%0),%%rbx\n" |
| 5921 | "mov 0x68(%0),%%rdx\n" |
| 5922 | /* "mov 0x70(%0),%%rcx\n" */ |
| 5923 | /* "mov 0x78(%0),%%rax\n" */ |
| 5924 | "mov 0x80(%0),%%rsp\n" |
| 5925 | /* "mov 0x88(%0),%%rip\n" */ |
| 5926 | |
| 5927 | "mov 0x88(%0),%%rax\n" |
| 5928 | "mov %%rax,%%fs:" STRING(ERRNO_TLS_OFFSET) "\n" |
| 5929 | |
| 5930 | "mov 0x00(%0),%%rax\n" |
| 5931 | "add $0x7f,%%al\n" |
| 5932 | "sahf\n" |
| 5933 | |
| 5934 | "mov 0x78(%0),%%rax\n" |
| 5935 | "mov 0x70(%0),%%rcx\n" |
| 5936 | |
| 5937 | "jmpq *%%fs:" STRING(ERRNO_TLS_OFFSET) "\n" |
| 5938 | |
| 5939 | : "+c"(state) |
| 5940 | ); |
| 5941 | while (true) |
| 5942 | asm volatile ("ud2"); |
| 5943 | } |
| 5944 | |
| 5945 | /****************************************************************************/ |
| 5946 | /* MISC */ |