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 // ---------------------------------------------------------------------
16 #include "utcb_init.h"
20 Context::switch_fpu (Context *)
26 { return _is_native; }
28 PROTECTED inline NEEDS["utcb_init.h"]
30 Context::arch_setup_utcb_ptr()
32 _gs = _fs = Utcb_init::utcb_segment();
37 Context::switch_gdt_user_entries(Context *to)
39 Mword *trampoline_page = (Mword *) Kmem::phys_to_virt(Mem_layout::Trampoline_frame);
40 Space *tos = to->vcpu_aware_space();
42 if (EXPECT_FALSE(!tos))
45 for (int i = 0; i < 3; i++)
47 || _gdt_user_entries[i].v[0] != to->_gdt_user_entries[i].v[0]
48 || _gdt_user_entries[i].v[1] != to->_gdt_user_entries[i].v[1])
50 memcpy(trampoline_page + 1, &to->_gdt_user_entries[i],
51 sizeof(_gdt_user_entries[0]));
52 Trampoline::syscall(tos->pid(), 243,
53 Mem_layout::Trampoline_page + sizeof(Mword));
56 // update the global UTCB pointer to make the thread find its UTCB
58 Mem_layout::user_utcb_ptr(current_cpu()) = to->utcb().usr();