X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/22d06cbaaf660067bfea03f73bee9c8630c05d50..3d33d9c0d1894c447324d8327200c212ddad3716:/lunaix-os/arch/aarch64/boot/kremap.c diff --git a/lunaix-os/arch/aarch64/boot/kremap.c b/lunaix-os/arch/aarch64/boot/kremap.c index e69de29..b91d1d5 100644 --- a/lunaix-os/arch/aarch64/boot/kremap.c +++ b/lunaix-os/arch/aarch64/boot/kremap.c @@ -0,0 +1,37 @@ +#include + +#include +#include +#include + +#include "init.h" + +static pte_t kpt[LEVEL_SIZE][32]; + +ptr_t +kremap() +{ + struct pt_alloc alloc; + struct ptw_state ptw; + pte_t pte; + unsigned long nr; + + init_pt_alloc(&alloc, to_kphysical(&kpt), sizeof(kpt)); + init_ptw_state(&ptw, &alloc, kpt_alloc_table(&alloc)); + + pte = mkpte(bootsec_start, KERNEL_DATA); + pte = pte_mkexec(pte); + nr = leaf_count(bootsec_end - bootsec_start); + kpt_set_ptes(&ptw, bootsec_start, pte, LFT_SIZE, nr); + + kpt_mktable_at(&ptw, VMAP, L0T_SIZE); + kpt_mktable_at(&ptw, PMAP, L2T_SIZE); + kpt_mktable_at(&ptw, KMAP, LFT_SIZE); + + kpt_migrate_highmem(&ptw); + + pte = mkpte(__ptr(ptw.root), KERNEL_PGTAB); + kpt_set_ptes(&ptw, VMS_SELF, pte, L0T_SIZE, 1); + + return __ptr(ptw.root); +} \ No newline at end of file