summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/lib/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/lib/object.c')
-rw-r--r--arch/x86_64/lib/object.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/arch/x86_64/lib/object.c b/arch/x86_64/lib/object.c
new file mode 100644
index 0000000..4ab8f06
--- /dev/null
+++ b/arch/x86_64/lib/object.c
@@ -0,0 +1,59 @@
+#include "object.h"
+#include "error.h"
+#include "device/processor.h"
+#include "arch/x86_64/page.h"
+#include "arch/x86_64/page-mapping.h"
+
+void*
+ko_entry_data(objdir_entry_t *entry)
+{
+ if((intmax_t)entry->data < 0) return (void*)entry->data;
+ return pptr_tovirt_ident(entry->data);
+}
+
+uintptr_t
+ko_data_toentry(uintptr_t vptr)
+{
+ return vptr_tophys((void*)vptr);
+}
+
+int
+ko_message_unmap(objdir_entry_t *message, uintptr_t *saveptr)
+{
+ /* message data should point to the virtual address. */
+ /* If it doesn't, fail*/
+ if(!(message->extra & KODE_EX_MESSAGE_MAPPED)) return KE_BADCALL;
+ uintptr_t vptr = message->data;
+
+ processor_t *cproc = processor_current();
+ pmle_t *pml4 = pptr_tovirt_ident(cproc->pdir);
+
+ pmle_t *message_pmle = pml4_get_mapping(pml4, 4, vptr);
+ *saveptr = (uintptr_t)pptr_tovirt_ident(message_pmle->paddr << 12);
+
+ message_pmle->p = 0;
+ __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+
+ message->extra &= ~KODE_EX_MESSAGE_MAPPED;
+ return 0;
+}
+
+int
+ko_message_remap(objdir_entry_t *message)
+{
+ if(message->extra & KODE_EX_MESSAGE_MAPPED) return KE_BADCALL;
+ uintptr_t vptr = message->data;
+
+ processor_t *cproc = processor_current();
+ pmle_t *pml4 = pptr_tovirt_ident(cproc->pdir);
+
+ pmle_t *message_pmle = pml4_get_mapping(pml4, 4, vptr);
+
+ message_pmle->p = 1;
+ __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+
+ message->extra |= KODE_EX_MESSAGE_MAPPED;
+ return 0;
+}
+
+void ko_message_move(objdir_entry_t *message, uintptr_t vptr);