| 43 | namespace hx { |
| 44 | |
| 45 | void CaptureX64(RegisterCaptureBuffer &outBuffer) |
| 46 | { |
| 47 | #if !defined(__GNUC__) |
| 48 | CONTEXT context; |
| 49 | |
| 50 | context.ContextFlags = CONTEXT_INTEGER; |
| 51 | RtlCaptureContext(&context); |
| 52 | |
| 53 | outBuffer.rbx = (void *)context.Rbx; |
| 54 | outBuffer.rbp = (void *)context.Rbp; |
| 55 | outBuffer.rdi = (void *)context.Rdi; |
| 56 | outBuffer.r12 = (void *)context.R12; |
| 57 | outBuffer.r13 = (void *)context.R13; |
| 58 | outBuffer.r14 = (void *)context.R14; |
| 59 | outBuffer.r15 = (void *)context.R15; |
| 60 | memcpy(outBuffer.xmm, &context.Xmm0, sizeof(outBuffer.xmm)); |
| 61 | #else |
| 62 | void *regBx; |
| 63 | void *regBp; |
| 64 | void *regDi; |
| 65 | void *reg12; |
| 66 | void *reg13; |
| 67 | void *reg14; |
| 68 | void *reg15; |
| 69 | asm ("movq %%rbx, %0\n\t" : "=r" (regBx) ); |
| 70 | asm ("movq %%rbp, %0\n\t" : "=r" (regBp) ); |
| 71 | asm ("movq %%rdi, %0\n\t" : "=r" (regDi) ); |
| 72 | asm ("movq %%r12, %0\n\t" : "=r" (reg12) ); |
| 73 | asm ("movq %%r13, %0\n\t" : "=r" (reg13) ); |
| 74 | asm ("movq %%r14, %0\n\t" : "=r" (reg14) ); |
| 75 | asm ("movq %%r15, %0\n\t" : "=r" (reg15) ); |
| 76 | outBuffer.rbx = regBx; |
| 77 | outBuffer.rbp = regBp; |
| 78 | outBuffer.r12 = reg12; |
| 79 | outBuffer.r13 = reg13; |
| 80 | outBuffer.r14 = reg14; |
| 81 | outBuffer.r15 = reg15; |
| 82 | #endif |
| 83 | } |
| 84 | |
| 85 | } // end namespace hx |
| 86 | |