]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/context-ia32-64.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / 64 / context-ia32-64.cpp
1 INTERFACE [amd64]:
2
3 EXTENSION class Context
4 {
5 protected:
6   Mword _gs_base, _fs_base;
7 };
8
9 // ------------------------------------------------------------------------
10 IMPLEMENTATION [amd64]:
11
12 IMPLEMENT inline NEEDS [Context::update_consumed_time,
13                         Context::store_segments]
14 void
15 Context::switch_cpu (Context *t)
16 {
17   Mword dummy1, dummy2, dummy3, dummy4;
18
19   update_consumed_time();
20
21   store_segments();
22
23   asm volatile
24     (
25      "   push %%rbp                     \n\t"   // save base ptr of old thread
26      "   pushq $1f                      \n\t"   // push restart addr on old stack
27      "   mov  %%rsp, (%[old_ksp])       \n\t"   // save stack pointer
28      "   mov  (%[new_ksp]), %%rsp       \n\t"   // load new stack pointer
29      // in new context now (cli'd)
30      "   call  switchin_context_label   \n\t"   // switch pagetable
31      "   pop   %%rax                    \n\t"   // don't do ret here -- we want
32      "   jmp   *%%rax                   \n\t"   // to preserve the return stack
33      // restart code
34      "  .p2align 4                      \n\t"   // start code at new cache line
35      "1: pop %%rbp                      \n\t"   // restore base ptr
36
37      : "=c" (dummy1), "=a" (dummy2), "=D" (dummy3), "=S" (dummy4)
38      : [old_ksp]    "c" (&_kernel_sp),
39        [new_ksp]    "a" (&t->_kernel_sp),
40        [new_thread] "D" (t),
41        [old_thread] "S" (this)
42      : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rbx", "rdx", "memory");
43 }
44
45 PROTECTED inline
46 void
47 Context::arch_setup_utcb_ptr()
48 {
49   _utcb.access()->utcb_addr = (Mword)_utcb.usr().get();
50   _gs_base = (Address)&_utcb.usr()->utcb_addr;
51 }
52
53 PROTECTED inline
54 void
55 Context::load_segments()
56 {
57   Cpu::set_fs(0);
58   Cpu::wrmsr(_fs_base, MSR_FS_BASE);
59   Cpu::set_gs(0);
60   Cpu::wrmsr(_gs_base, MSR_GS_BASE);
61 }
62
63 PROTECTED inline
64 void
65 Context::store_segments()
66 {}
67
68 PROTECTED inline
69 void
70 Context::load_gdt_user_entries(Context * /*old*/ = 0)
71 {}