mckernel/lib/include/*.h mckernel/arch/x86/elfboot/* mckernel/arch/x86/kboot/main.c mckernel/arch/x86/kernel/* mckernel/lib/page_alloc.c mckernel/lib/string.c mckernel/lib/include/ihk/* except mckernel/arch/x86/kernel/include/signal.h mckernel/arch/x86/tools/mcreboot-attached-mic.sh.in mckernel/arch/x86/kernel/include/syscall_list.h mckernel/arch/x86/kernel/syscall.c .
55 lines
1.2 KiB
ArmAsm
55 lines
1.2 KiB
ArmAsm
/**
|
|
* \file context.S
|
|
* License details are found in the file LICENSE.
|
|
* \brief
|
|
* Save registers of old context and load registers of new context.
|
|
* \author Taku Shimosawa <shimosawa@is.s.u-tokyo.ac.jp> \par
|
|
* Copyright (C) 2011 - 2012 Taku Shimosawa
|
|
*/
|
|
|
|
#define X86_CPU_LOCAL_OFFSET_TSS 128
|
|
#define X86_TSS_OFFSET_SP0 4
|
|
#define X86_CPU_LOCAL_OFFSET_SP0 \
|
|
(X86_CPU_LOCAL_OFFSET_TSS + X86_TSS_OFFSET_SP0)
|
|
|
|
.text
|
|
|
|
.globl ihk_mc_switch_context
|
|
ihk_mc_switch_context:
|
|
/*
|
|
* rdi - ihk_mc_kernel_context_t *old_ctx
|
|
* rsi - ihk_mc_kernel_context_t *new_ctx
|
|
* rdx - void *prev
|
|
*/
|
|
pushfq
|
|
popq %rax
|
|
testq %rdi, %rdi
|
|
jz 1f /* skip saving if "old_ctx" is null. */
|
|
movq %rbp, 8(%rdi)
|
|
movq %rbx, 16(%rdi)
|
|
movq %rax, 72(%rdi) /* rflags */
|
|
movq %rsi, 24(%rdi)
|
|
movq %rdi, 32(%rdi)
|
|
movq %r12, 40(%rdi)
|
|
movq %r13, 48(%rdi)
|
|
movq %r14, 56(%rdi)
|
|
movq %r15, 64(%rdi)
|
|
movq %rsp, 0(%rdi)
|
|
1:
|
|
movq 0(%rsi), %rsp
|
|
movq 80(%rsi), %rbp
|
|
movq %rbp, %gs:(X86_CPU_LOCAL_OFFSET_SP0)
|
|
movq 64(%rsi), %r15
|
|
movq 56(%rsi), %r14
|
|
movq 48(%rsi), %r13
|
|
movq 40(%rsi), %r12
|
|
movq 32(%rsi), %rdi
|
|
movq 16(%rsi), %rbx
|
|
movq 72(%rsi), %rax
|
|
pushq %rax
|
|
popfq
|
|
movq 8(%rsi), %rbp
|
|
movq 24(%rsi), %rsi
|
|
movq %rdx,%rax
|
|
retq
|