Boot framework rework (#45)
[lunaix-os.git] / lunaix-os / arch / x86 / hart64.c
1 #ifdef CONFIG_ARCH_X86_64
2
3 #include <lunaix/process.h>
4 #include <lunaix/hart_state.h>
5 #include <lunaix/mm/vmm.h>
6 #include <klibc/string.h>
7
8 #include <sys/mm/mempart.h>
9 #include <sys/abi.h>
10
11 volatile struct x86_tss _tss = { };
12
13 void
14 hart_prepare_transition(struct hart_transition* ht, 
15                       ptr_t kstack_tp, ptr_t ustack_pt, 
16                       ptr_t entry, bool to_user) 
17 {
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));
21
22     ht->transfer.state = (struct hart_state){ 
23                             .registers = { },
24                             .execp = (struct exec_param*)(ht->inject + offset)
25                         };
26     
27     int code_seg = KCODE_SEG, data_seg = KDATA_SEG;
28     int mstate = cpu_ldstate();
29     if (to_user) {
30         code_seg = UCODE_SEG, data_seg = UDATA_SEG;
31         mstate |= 0x200;   // enable interrupt
32     }
33     else {
34         stack = kstack_tp;
35     }
36
37     ht->transfer.eret = (struct exec_param) {
38                             .cs = code_seg, .rip = entry, 
39                             .ss = data_seg, .rsp = align_stack(stack),
40                             .rflags = mstate
41                         };
42 }
43
44 #endif