From ccd15e0590e5bf622caf907bbcb25ce8b1fd0155 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 23 Oct 2018 15:19:02 +0200 Subject: [PATCH] Various things: - putch syscall now directly calls Console::putChar(). - /proc/summary includes some info about kmalloc stats. - Syscall entry is guarded by a simple spinlock. - Unmap regions for crashed tasks. --- Kernel/Console.h | 2 +- Kernel/ProcFileSystem.cpp | 3 +- Kernel/Syscall.cpp | 81 +++++++++++++++++++++++++++++++++++--- Kernel/Task.cpp | 4 +- Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes 5 files changed, 82 insertions(+), 8 deletions(-) diff --git a/Kernel/Console.h b/Kernel/Console.h index e6406289a4..742ed68074 100644 --- a/Kernel/Console.h +++ b/Kernel/Console.h @@ -12,9 +12,9 @@ public: virtual ssize_t read(byte* buffer, size_t size) override; virtual ssize_t write(const byte* data, size_t size) override; -private: void putChar(char); +private: const byte m_rows { 25 }; const byte m_columns { 80 }; byte m_cursorRow { 0 }; diff --git a/Kernel/ProcFileSystem.cpp b/Kernel/ProcFileSystem.cpp index c28c31aed2..bc4f64d0e9 100644 --- a/Kernel/ProcFileSystem.cpp +++ b/Kernel/ProcFileSystem.cpp @@ -21,7 +21,7 @@ bool ProcFileSystem::initialize() cli(); auto tasks = Task::allTasks(); char* buffer; - auto stringImpl = StringImpl::createUninitialized(tasks.size() * 64, buffer); + auto stringImpl = StringImpl::createUninitialized(tasks.size() * 128, buffer); memset(buffer, 0, stringImpl->length()); char* ptr = buffer; ptr += ksprintf(ptr, "PID OWNER STATE NAME\n"); @@ -33,6 +33,7 @@ bool ProcFileSystem::initialize() task->state(), task->name().characters()); } + ptr += ksprintf(ptr, "kmalloc: alloc: %u / free: %u\n", sum_alloc, sum_free); *ptr = '\0'; sti(); return ByteBuffer::copy((byte*)buffer, ptr - buffer); diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index 4ba373daca..74cb4f5ae7 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -1,7 +1,7 @@ #include "i386.h" -#include "VGA.h" #include "Task.h" #include "Syscall.h" +#include "Console.h" extern "C" void syscall_entry(); extern "C" void syscall_ISR(); @@ -38,23 +38,92 @@ asm( " iret\n" ); +static inline dword CAS(dword* mem, dword newval, dword oldval) +{ + dword ret; + asm volatile( + "cmpxchgl %2, %1" + :"=a"(ret), "=m"(*mem) + :"r"(newval), "m"(*mem), "0"(oldval)); + return ret; +} + +class SpinLock { +public: + SpinLock() + { + } + + ~SpinLock() + { + unlock(); + } + + void lock() + { + volatile dword count = 0; + for (;;) { + if (CAS(&m_lock, 1, 0) == 1) + return; + ++count; + + } + if (count) + kprintf("waited %u in %s\n",count, current->name().characters()); + } + + void unlock() + { + // barrier(); + m_lock = 0; + } + +private: + dword m_lock { 0 }; +}; + +class Locker { +public: + explicit Locker(SpinLock& l) + : m_lock(l) + { + m_lock.lock(); + } + + ~Locker() + { + unlock(); + } + + void unlock() + { + m_lock.unlock(); + } + +private: + SpinLock& m_lock; +}; + namespace Syscall { +static SpinLock* s_lock; + void initialize() { + s_lock = new SpinLock; registerUserCallableInterruptHandler(0x80, syscall_ISR); - kprintf("syscall: int 0x80 handler installed\n"); } DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) { + Locker locker(*s_lock); switch (function) { case Syscall::Yield: yield(); break; case Syscall::PutCharacter: - kprintf("%c", arg1 & 0xff); + Console::the().putChar(arg1 & 0xff); break; case Syscall::Sleep: //kprintf("syscall: sleep(%d)\n", arg1); @@ -73,8 +142,8 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) return current->sys$read((int)arg1, (void*)arg2, (size_t)arg3); case Syscall::PosixSeek: // FIXME: This has the wrong signature, should be like lseek() - kprintf("syscall: seek(%d, %p, %u)\n", arg1, arg2, arg3); - return current->sys$read((int)arg1, (void*)arg2, (size_t)arg3); + kprintf("syscall: seek(%d, %d)\n", arg1, arg2); + return current->sys$seek((int)arg1, (int)arg2); case Syscall::PosixKill: kprintf("syscall: kill(%d, %d)\n", arg1, arg2); return current->sys$kill((pid_t)arg1, (int)arg2); @@ -85,6 +154,8 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) case Syscall::PosixGetpid: return current->sys$getpid(); case Syscall::PosixExit: + cli(); + locker.unlock(); current->sys$exit((int)arg1); ASSERT_NOT_REACHED(); return 0; diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index c4c1f13ad7..be8a57d08e 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -366,6 +366,8 @@ void Task::sys$exit(int status) setState(Exiting); + MemoryManager::the().unmapRegionsForTask(*this); + s_tasks->remove(this); if (!scheduleNewTask()) { @@ -382,7 +384,7 @@ void Task::taskDidCrash(Task* crashedTask) { // NOTE: This is called from an excepton handler, so interrupts are disabled. crashedTask->setState(Crashing); -// crashedTask->dumpRegions(); + crashedTask->dumpRegions(); s_tasks->remove(crashedTask); diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index 3aaa2fc34ea7bf0a231bd408d99f254cdb331cd0..e74551456e35e00dd6d24e4cef5777a3c55b7928 100644 GIT binary patch delta 8568 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 DlgYv|