Architectural Support: x86_64 (#37)
[lunaix-os.git] / lunaix-os / arch / x86 / hart.c
diff --git a/lunaix-os/arch/x86/hart.c b/lunaix-os/arch/x86/hart.c
new file mode 100644 (file)
index 0000000..124ea6e
--- /dev/null
@@ -0,0 +1,22 @@
+#include <lunaix/hart_state.h>
+#include <lunaix/mm/vmm.h>
+#include <klibc/string.h>
+
+#include <sys/mm/mempart.h>
+
+bool
+install_hart_transition(ptr_t vm_mnt, struct hart_transition* ht)
+{
+    pte_t pte;
+    if (!vmm_lookupat(vm_mnt, ht->inject, &pte)) {
+        return false;
+    }
+
+    mount_page(PG_MOUNT_4, pte_paddr(pte));
+
+    ptr_t mount_inject = PG_MOUNT_4 + va_offset(ht->inject);
+    memcpy((void*)mount_inject, &ht->transfer, sizeof(ht->transfer));
+    
+    unmount_page(PG_MOUNT_4);
+    return true;
+}
\ No newline at end of file