Skip to content

Instantly share code, notes, and snippets.

@rikusalminen
Created March 28, 2011 20:10
Show Gist options
  • Save rikusalminen/891165 to your computer and use it in GitHub Desktop.
Save rikusalminen/891165 to your computer and use it in GitHub Desktop.
.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