3 EXTENSION class Context
6 Mword _gs_base, _fs_base;
9 // ------------------------------------------------------------------------
10 IMPLEMENTATION [amd64]:
12 IMPLEMENT inline NEEDS [Context::update_consumed_time,
13 Context::store_segments]
15 Context::switch_cpu (Context *t)
17 Mword dummy1, dummy2, dummy3, dummy4;
19 update_consumed_time();
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
34 " .p2align 4 \n\t" // start code at new cache line
35 "1: pop %%rbp \n\t" // restore base ptr
37 : "=c" (dummy1), "=a" (dummy2), "=D" (dummy3), "=S" (dummy4)
38 : [old_ksp] "c" (&_kernel_sp),
39 [new_ksp] "a" (&t->_kernel_sp),
41 [old_thread] "S" (this)
42 : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "rbx", "rdx", "memory");
47 Context::arch_setup_utcb_ptr()
49 _utcb.access()->utcb_addr = (Mword)_utcb.usr().get();
50 _gs_base = (Address)&_utcb.usr()->utcb_addr;
55 Context::load_segments()
58 Cpu::wrmsr(_fs_base, MSR_FS_BASE);
60 Cpu::wrmsr(_gs_base, MSR_GS_BASE);
65 Context::store_segments()
70 Context::load_gdt_user_entries(Context * /*old*/ = 0)