Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 31 additions & 11 deletions src/bthread/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,20 +347,40 @@ __asm (
" pushq %r14 \n"
" pushq %r13 \n"
" pushq %r12 \n"
" leaq -0x8(%rsp), %rsp\n"
" leaq -0xa8(%rsp), %rsp\n"
" movups %xmm6, 0x00(%rsp)\n"
" movups %xmm7, 0x10(%rsp)\n"
" movups %xmm8, 0x20(%rsp)\n"
" movups %xmm9, 0x30(%rsp)\n"
" movups %xmm10, 0x40(%rsp)\n"
" movups %xmm11, 0x50(%rsp)\n"
" movups %xmm12, 0x60(%rsp)\n"
" movups %xmm13, 0x70(%rsp)\n"
" movups %xmm14, 0x80(%rsp)\n"
" movups %xmm15, 0x90(%rsp)\n"
" cmp $0, %rcx\n"
" je 1f\n"
" stmxcsr (%rsp)\n"
" fnstcw 0x4(%rsp)\n"
" stmxcsr 0xa0(%rsp)\n"
" fnstcw 0xa4(%rsp)\n"
"1:\n"
" movq %rsp, (%rdi)\n"
" movq %rsi, %rsp\n"
" movups 0x00(%rsp), %xmm6\n"
" movups 0x10(%rsp), %xmm7\n"
" movups 0x20(%rsp), %xmm8\n"
" movups 0x30(%rsp), %xmm9\n"
" movups 0x40(%rsp), %xmm10\n"
" movups 0x50(%rsp), %xmm11\n"
" movups 0x60(%rsp), %xmm12\n"
" movups 0x70(%rsp), %xmm13\n"
" movups 0x80(%rsp), %xmm14\n"
" movups 0x90(%rsp), %xmm15\n"
" cmp $0, %rcx\n"
" je 2f\n"
" ldmxcsr (%rsp)\n"
" fldcw 0x4(%rsp)\n"
" ldmxcsr 0xa0(%rsp)\n"
" fldcw 0xa4(%rsp)\n"
"2:\n"
" leaq 0x8(%rsp), %rsp\n"
" leaq 0xa8(%rsp), %rsp\n"
" popq %r12 \n"
" popq %r13 \n"
" popq %r14 \n"
Expand All @@ -387,12 +407,12 @@ __asm (
"bthread_make_fcontext:\n"
" movq %rdi, %rax\n"
" andq $-16, %rax\n"
" leaq -0x48(%rax), %rax\n"
" movq %rdx, 0x38(%rax)\n"
" stmxcsr (%rax)\n"
" fnstcw 0x4(%rax)\n"
" leaq -0xe8(%rax), %rax\n"
" movq %rdx, 0xd8(%rax)\n"
" stmxcsr 0xa0(%rax)\n"
" fnstcw 0xa4(%rax)\n"
" leaq finish(%rip), %rcx\n"
" movq %rcx, 0x40(%rax)\n"
" movq %rcx, 0xe0(%rax)\n"
" ret \n"
"finish:\n"
" xorq %rdi, %rdi\n"
Expand Down
6 changes: 3 additions & 3 deletions src/bthread/task_tracer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,16 +280,16 @@ unw_cursor_t TaskTracer::MakeCursor(bthread_fcontext_t fcontext) {

// Only need RBP, RIP, RSP on x86_64.
// The base pointer (RBP).
if (unw_set_reg(&cursor, UNW_X86_64_RBP, regs[6]) != 0) {
if (unw_set_reg(&cursor, UNW_X86_64_RBP, regs[26]) != 0) {
LOG(ERROR) << "Fail to set RBP";
}
// The instruction pointer (RIP).
if (unw_set_reg(&cursor, UNW_REG_IP, regs[7]) != 0) {
if (unw_set_reg(&cursor, UNW_REG_IP, regs[27]) != 0) {
LOG(ERROR) << "Fail to set RIP";
}
#if UNW_VERSION_MAJOR >= 1 && UNW_VERSION_MINOR >= 7
// The stack pointer (RSP).
if (unw_set_reg(&cursor, UNW_REG_SP, regs[8]) != 0) {
if (unw_set_reg(&cursor, UNW_REG_SP, regs[28]) != 0) {
LOG(ERROR) << "Fail to set RSP";
}
#endif
Expand Down