fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / arch / x86 / boot / x86_64 / kremap64.c
1 #define __BOOT_CODE__
2
3 #include <asm/boot_stage.h>
4 #include <asm/mm_defs.h>
5 #include <asm-generic/init_pagetable.h>
6
7 #define RSVD_PAGES 32
8
9 struct kernel_map 
10 {
11     struct {
12         pte_t _lft[_PAGE_LEVEL_SIZE];
13     } krsvd[RSVD_PAGES];
14 } align(8);
15
16 static struct kernel_map kpt __section(".kpg");
17 export_symbol(debug, boot, kpt);
18
19 static ptr_t boot_text
20 do_remap()
21 {
22     struct pt_alloc alloc;
23     struct ptw_state ptw;
24     pte_t pte;
25
26     init_pt_alloc(&alloc, to_kphysical(&kpt), sizeof(kpt));
27     init_ptw_state(&ptw, &alloc, kpt_alloc_table(&alloc));
28
29     pte = pte_mkhuge(mkpte_prot(KERNEL_PGTAB));
30     kpt_set_ptes(&ptw, 0, pte, L1T_SIZE, 4);
31
32     kpt_mktable_at(&ptw, VMAP, L0T_SIZE);
33
34 #if LnT_ENABLED(3)
35     size_t gran  = L3T_SIZE;
36 #else
37     size_t gran  = L2T_SIZE;
38 #endif
39
40     kpt_mktable_at(&ptw, KMAP, gran);
41     kpt_mktable_at(&ptw, PMAP, gran);
42
43     kpt_migrate_highmem(&ptw);
44
45     pte = mkpte(__ptr(ptw.root), KERNEL_PGTAB);
46     kpt_set_ptes(&ptw, VMS_SELF, pte, L0T_SIZE, 1);
47
48     return __ptr(ptw.root);
49 }
50
51 ptr_t boot_text
52 remap_kernel()
53 {    
54     asm volatile("movq %1, %%rdi\n"
55                  "rep stosb\n" ::"c"(sizeof(kpt)),
56                  "r"(to_kphysical(&kpt)),
57                  "a"(0)
58                  : "rdi", "memory");
59
60     return do_remap();
61 }