1 #ifdef CONFIG_ARCH_X86_64
3 #include <lunaix/process.h>
4 #include <lunaix/hart_state.h>
5 #include <lunaix/mm/vmm.h>
6 #include <klibc/string.h>
8 #include <sys/mm/mempart.h>
11 volatile struct x86_tss _tss = { };
14 hart_prepare_transition(struct hart_transition* ht,
15 ptr_t kstack_tp, ptr_t ustack_pt,
16 ptr_t entry, bool to_user)
18 ptr_t stack = ustack_pt;
19 ptr_t offset = (ptr_t)&ht->transfer.eret - (ptr_t)&ht->transfer;
20 ht->inject = align_stack(kstack_tp - sizeof(ht->transfer));
22 ht->transfer.state = (struct hart_state){
24 .execp = (struct exec_param*)(ht->inject + offset)
27 int code_seg = KCODE_SEG, data_seg = KDATA_SEG;
28 int mstate = cpu_ldstate();
30 code_seg = UCODE_SEG, data_seg = UDATA_SEG;
31 mstate |= 0x200; // enable interrupt
37 ht->transfer.eret = (struct exec_param) {
38 .cs = code_seg, .rip = entry,
39 .ss = data_seg, .rsp = align_stack(stack),