Created
March 28, 2011 20:10
-
-
Save rikusalminen/891165 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.code64 | |
.section .text | |
.global thread_context_switch | |
# from thread: rdi = interrupt_stack_frame*, rsi = registers_t* | |
# to thread: rdx = const interrupt_stack_frame*, rcx = const registers_t* | |
thread_context_switch: | |
# store general purpose registers to *rdi | |
mov %r15, 0(%rdi) | |
mov %r14, 8(%rdi) | |
mov %r13, 16(%rdi) | |
mov %r12, 24(%rdi) | |
mov %r11, 32(%rdi) | |
mov %r10, 40(%rdi) | |
mov %r9, 48(%rdi) | |
mov %r8, 56(%rdi) | |
mov %rdi, 64(%rdi) | |
mov %rsi, 72(%rdi) | |
mov %rsp, 80(%rdi) | |
mov %rbp, 88(%rdi) | |
mov %rdx, 96(%rdi) | |
mov %rcx, 104(%rdi) | |
mov %rbx, 112(%rdi) | |
mov %rax, 120(%rdi) | |
# store interrupt stack frame to *rsi: rip, cs, rflags, rsp, ss | |
pop %rax | |
mov %rax, 0(%rsi) | |
mov %cs, %rax | |
mov %rax, 8(%rsi) | |
pushfq | |
pop %rax | |
mov %rax, 16(%rsi) | |
mov %rsp, 24(%rsi) | |
mov %ss, %rax | |
mov %rax, 32(%rsi) | |
# restore interrupt stack frame from *rdx and push to stack | |
# push lret stack frame: rip, cs, rsp, ss | |
push 32(%rdx) # offsetof(interrupt_stack_frame_t, ss) = 32 | |
push 24(%rdx) # offsetof(interrupt_stack_frame_t, rsp) = 24 | |
push 8(%rdx) # offsetof(interrupt_stack_frame_t, cs) = 8 | |
push 0(%rdx) # offsetof(interrupt_stack_frame_t, rip) = 0 | |
# push rflags to stack | |
push 16(%rdx) # offsetof(interrupt_stack_frame_t, rflags) = 16 | |
# restore general purpose registers from *rcx | |
mov 0(%rcx), %r15 | |
mov 8(%rcx), %r14 | |
mov 16(%rcx), %r13 | |
mov 24(%rcx), %r12 | |
mov 32(%rcx), %r11 | |
mov 40(%rcx), %r10 | |
mov 48(%rcx), %r9 | |
mov 56(%rcx), %r8 | |
mov 64(%rcx), %rdi | |
mov 72(%rcx), %rsi | |
# rsp is omitted | |
mov 88(%rcx), %rbp | |
mov 96(%rcx), %rdx | |
mov 112(%rcx), %rbx | |
mov 120(%rcx), %rax | |
mov 104(%rcx), %rcx # rcx is restored last | |
# pop flags and far return | |
popfq | |
lretq $0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment