3 EXTENSION class Context
6 enum { Gdt_user_entries = 3 };
7 struct { Unsigned64 v[2]; } _gdt_user_entries[Gdt_user_entries]; // type struct Ldt_user_desc
9 bool _is_native; // thread can call Linux host system calls
10 Unsigned32 _es, _fs, _gs;
13 // ---------------------------------------------------------------------
18 Context::switch_fpu (Context *)
24 { return _is_native; }
28 Context::switch_gdt_user_entries(Context *to)
30 Mword *trampoline_page = (Mword *) Kmem::phys_to_virt(Mem_layout::Trampoline_frame);
31 Space *tos = to->vcpu_aware_space();
33 if (EXPECT_FALSE(!tos))
36 for (int i = 0; i < 3; i++)
38 || _gdt_user_entries[i].v[0] != to->_gdt_user_entries[i].v[0]
39 || _gdt_user_entries[i].v[1] != to->_gdt_user_entries[i].v[1])
41 memcpy(trampoline_page + 1, &to->_gdt_user_entries[i],
42 sizeof(_gdt_user_entries[0]));
43 Trampoline::syscall(tos->pid(), 243,
44 Mem_layout::Trampoline_page + sizeof(Mword));