diff --git a/kernel/include/sys/UserMemory.h b/kernel/include/sys/UserMemory.h index 9948b4b0..0da06379 100644 --- a/kernel/include/sys/UserMemory.h +++ b/kernel/include/sys/UserMemory.h @@ -1,21 +1,35 @@ #pragma once + +#ifndef MODULE +#define MODULE "mem" +#endif + +#include "log/Log.h" #include "memory/MemoryManager.h" #include "memory/VMM.h" #include "misc/utils.h" char* strdup_from_user(const char* user_string); +// FIXME: Map the physical addresses into kernel address space. Right now, something overwrites KernelHeap and crashes +// it, so that's not really possible. But it should be done in the future. + template T* user_address_to_typed_pointer(V address) { uint64_t phys = VMM::get_physical((uint64_t)address); - if (phys == (uint64_t)-1) return nullptr; - return (T*)MemoryManager::get_unaligned_mappings((void*)phys, Utilities::get_blocks_from_size(PAGE_SIZE, S), - MAP_READ_WRITE); + if (phys == (uint64_t)-1) + { + kinfoln("warning: user pointer is not mapped in its address space"); + return nullptr; + } + // return (T*)MemoryManager::get_unaligned_mappings((void*)phys, Utilities::get_blocks_from_size(PAGE_SIZE, S), + // MAP_READ_WRITE); + return (T*)phys; } -template void free_user_typed_pointer(T* ptr) +template void free_user_typed_pointer(T*) { - MemoryManager::release_unaligned_mappings(ptr, Utilities::get_blocks_from_size(PAGE_SIZE, S)); + // MemoryManager::release_unaligned_mappings(ptr, Utilities::get_blocks_from_size(PAGE_SIZE, S)); } template T* obtain_user_ref(T* user_ptr) diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index 5433353e..097d9483 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -482,8 +482,6 @@ void sys_waitpid(Context* context, long pid, int* wstatus, } if (wstatus) { - VMM::switch_to_user_address_space(sched_current_task->address_space); - VMM::enter_syscall_context(); int* kwstatus = obtain_user_ref(wstatus); if (kwstatus) {