From 1317dc53fa5aed7b3c03abc553974ad0759a9f01 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 8 Dec 2022 10:35:05 +0200 Subject: [PATCH] Updated argv and envp in tasking --- KThread.cpp | 2 ++ Tasking/Task.cpp | 77 ++++++++++++++++++++++++++---------------------- include/task.hpp | 22 ++++++++++++-- 3 files changed, 62 insertions(+), 39 deletions(-) diff --git a/KThread.cpp b/KThread.cpp index 658bddf..b62a922 100644 --- a/KThread.cpp +++ b/KThread.cpp @@ -62,6 +62,8 @@ void KernelMainThread() CPU::Interrupts(CPU::Enable); goto Exit; } + ret.Thread->SetDebugMode(true); + ret.Thread->SetKernelDebugMode(true); ret.Thread->SetCritical(true); KPrint("Waiting for \e22AAFF%s\eCCCCCC to start...", Config.InitPath); CPU::Interrupts(CPU::Enable); diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index 328aae0..9f40aef 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -535,6 +535,23 @@ namespace Tasking UpdateUsage(&CurrentCPU->CurrentThread->Info, CurrentCPU->ID); OneShot(CurrentCPU->CurrentThread->Info.Priority); } + { + if (CurrentCPU->CurrentThread->Security.IsDebugEnabled && CurrentCPU->CurrentThread->Security.IsKernelDebugEnabled) + { + schedbg("================================================================"); + schedbg("%s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); + schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx", + Frame->r8, Frame->r9, Frame->r10, Frame->r11); + schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx", + Frame->r12, Frame->r13, Frame->r14, Frame->r15); + schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx", + Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); + schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", + Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); + schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx", + Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode); + } + } { schedbg("================================================================"); schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); @@ -749,7 +766,7 @@ namespace Tasking Thread->Registers.rflags.ID = 1; Thread->Registers.rsp = ((uint64_t)Thread->Stack->GetStackTop()); - if (Compatibility == TaskCompatibility::Linux) + if (Compatibility == TaskCompatibility::Linux) // Not tested and probably not working { // https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf#figure.3.9 // What is a "eightbyte"? unsigned long? 1 eightbyte = 8 bytes? 2 eightbyte each = 16 bytes? @@ -827,61 +844,49 @@ namespace Tasking else // Native { uint64_t ArgvSize = 0; - uint64_t ArgvStrSize = 0; if (argv) - { while (argv[ArgvSize] != nullptr) - { - debug("> ArgvSize: %d, ArgvStrSize: %d", ArgvSize, ArgvStrSize); ArgvSize++; - ArgvStrSize += strlen(argv[ArgvSize]) + 1; - debug("< ArgvSize: %d, ArgvStrSize: %d", ArgvSize, ArgvStrSize); - } - } uint64_t EnvpSize = 0; - uint64_t EnvpStrSize = 0; if (envp) - { while (envp[EnvpSize] != nullptr) - { - debug("> EnvpSize: %d, EnvpStrSize: %d", EnvpSize, EnvpStrSize); EnvpSize++; - EnvpStrSize += strlen(envp[EnvpSize]) + 1; - debug("< EnvpSize: %d, EnvpStrSize: %d", EnvpSize, EnvpStrSize); - } - } - uint8_t *_argv = 0; - uint8_t *_envp = 0; + Memory::Virtual ArgMap = Memory::Virtual(Parent->PageTable); + + char **_argv = (char **)KernelAllocator.RequestPages(TO_PAGES(ArgvSize * sizeof(char *))); + char **_envp = (char **)KernelAllocator.RequestPages(TO_PAGES(EnvpSize * sizeof(char *))); + + for (uint64_t i = 0; i < TO_PAGES(ArgvSize * sizeof(char *)); i++) + ArgMap.Map((void *)_argv[i], (void *)_argv[i], Memory::PTFlag::RW | Memory::PTFlag::US); + + for (uint64_t i = 0; i < TO_PAGES(EnvpSize * sizeof(char *)); i++) + ArgMap.Map((void *)_envp[i], (void *)_envp[i], Memory::PTFlag::RW | Memory::PTFlag::US); for (uint64_t i = 0; i < ArgvSize; i++) { - void *Tmp = KernelAllocator.RequestPages(TO_PAGES(strlen(argv[i]) + 1)); - debug("argv[%d] ptr %#lx", i, (uint64_t)Tmp); - Memory::Virtual().Map(Tmp, Tmp, Memory::PTFlag::RW | Memory::PTFlag::US); - _argv = (uint8_t *)Tmp; - strcpy((char *)_argv, argv[i]); - argv[i] = (char *)_argv; + _argv[i] = (char *)KernelAllocator.RequestPages(TO_PAGES(strlen(argv[i]) + 1)); + strcpy(_argv[i], argv[i]); + for (uint64_t j = 0; j < TO_PAGES(strlen(argv[i]) + 1); j++) + ArgMap.Map((void *)_argv[i], (void *)_argv[i], Memory::PTFlag::RW | Memory::PTFlag::US); } - debug("argv done"); - for (uint64_t i = 0; i < EnvpSize; i++) { - void *Tmp = KernelAllocator.RequestPages(TO_PAGES(strlen(envp[i]) + 1)); - debug("envp[%d] ptr %#lx", i, (uint64_t)Tmp); - Memory::Virtual().Map(Tmp, Tmp, Memory::PTFlag::RW | Memory::PTFlag::US); - _envp = (uint8_t *)Tmp; - strcpy((char *)_envp, envp[i]); - envp[i] = (char *)_envp; + _envp[i] = (char *)KernelAllocator.RequestPages(TO_PAGES(strlen(envp[i]) + 1)); + strcpy(_envp[i], envp[i]); + for (uint64_t j = 0; j < TO_PAGES(strlen(envp[i]) + 1); j++) + ArgMap.Map((void *)_envp[i], (void *)_envp[i], Memory::PTFlag::RW | Memory::PTFlag::US); } - debug("envp done"); + _argv[ArgvSize] = nullptr; + _envp[EnvpSize] = nullptr; - Thread->Registers.rdi = ArgvSize; + Thread->Registers.rdi = (uint64_t)ArgvSize; Thread->Registers.rsi = (uint64_t)_argv; - Thread->Registers.rdx = (uint64_t)_envp; + Thread->Registers.rdx = (uint64_t)EnvpSize; + Thread->Registers.rcx = (uint64_t)_envp; for (uint64_t i = 0; i < ArgvSize; i++) debug("argv[%d]: %s", i, _argv[i]); diff --git a/include/task.hpp b/include/task.hpp index 670373c..7a0b699 100644 --- a/include/task.hpp +++ b/include/task.hpp @@ -61,6 +61,8 @@ namespace Tasking TaskTrustLevel TrustLevel; Token UniqueToken; bool IsCritical; + bool IsDebugEnabled; + bool IsKernelDebugEnabled; }; struct TaskInfo @@ -125,11 +127,25 @@ namespace Tasking int GetExitCode() { return ExitCode; } - void SetCritical(bool critical) + void SetCritical(bool Critical) { CriticalSection cs; - trace("Setting criticality of thread %s to %s", Name, critical ? "true" : "false"); - Security.IsCritical = critical; + trace("Setting criticality of thread %s to %s", Name, Critical ? "true" : "false"); + Security.IsCritical = Critical; + } + + void SetDebugMode(bool Enable) + { + CriticalSection cs; + trace("Setting debug mode of thread %s to %s", Name, Enable ? "true" : "false"); + Security.IsDebugEnabled = Enable; + } + + void SetKernelDebugMode(bool Enable) + { + CriticalSection cs; + trace("Setting kernel debug mode of thread %s to %s", Name, Enable ? "true" : "false"); + Security.IsKernelDebugEnabled = Enable; } };