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 zcmeHM4RBS(72dt?1^0#gyyPW>n2_A?_Yw^u4+telLMqx)i;zGhP@==52_!%Wc}WBu z>kAX821zAeV3}(D?O5AkDmASS6__|iz*Z4#rqVGW5oDw?2xG^g)*=1Q{du`Wf{Z^i z*2&J?yZ4;4=j`6S`<;8vZc|5LQ%B*hC@0^pMLW}7)1uy5L|0~eo^uB0&uPBgiGOmJ zDi4b&zP&wKd=|@tZG4Kex49!7b^E=;ql6=mz19Apx-KrZV;EzbZaSn}fECR%;X-Vu zhp~p&-n4k_o{4ozerW<@H=hnST*UOkS(Nd>IO?gmZo)MUR{^d0xpL)nb#mUsyvR1LYN_2%$#c~rSG&~hmO0CXTh7K!%Q-eu zu3j!wt@v0DPu7CR9vT|Y%Jl&-mZv2j&*O30oa5=-t<@g?WroUFDul`i#zs+{&e)Bp zIYypKbejD29I-5U48!2Tj%RGF&Sp$dJt`DgEaDYMpmL?$TPr4OZ}$8oK2TfXZ}8^? zD*Y8X^$h`Ej!zz$B5sj~M~FHR6LNkbXSgnF9x%KNpha!}M)n%p~2q-zUKX1X?q zS<$6nJ$v$r7hql`+Co@HiMQTt&F3bVA9Enw02USW17y zGkv}xxTp-djunrRwQKJp?aJPM+FLPe zmUfa&+tW`w3bRUcW)Ile8NN?r_if0l z0tR)#kMcihJojP~M6KJ1*>X{5x4gQsqajII_jYKJ*C1uZWfei^?ku#fJYzQf_^H1Jb?Eog$Y8! zmwAtpfxX9~D|?UXu=gnF?>#DPO0zpip1QviuIPX2}|2MagYcEth+#+KE-?_`l zFtvDoSyiLeu=U4$ljni01@u1qH$>>Kg@4kFmIEzETU*I;*1`P!!98bg#Xo3n>)sD% zgH=|w1^UK+X>QB5!(izhJg7gm9M%a~DQa{V7nfD-usQ?FoH@OPuj8W~p*enWV91bw ze^o_ojZCW&d1Vx{sbd<|CF>e0>mwPFnOSP>-IW2f(xcENjZ2qS2GnYGng8xewYniA zlC7**I~7XV>MCkakLu5>P%VjMx5VN2baH^Cx*!mh?VRZ`F5Qc zs~mF5iy1;PG< z{-cmZ3+NSGa_$1W!lNWBiKHPG} zV%G~!p%x7$c7uuCU}DDx6FUTTjD3Z~?uBxpI+dA5u8=%nt{^up7AZjmp`Z~7e`#7U z9>cN1>fL%;@ESPbwBTl&*q#*>QdUr66B=1T3pla+f<{`f$%WJ4x0fqr>F|0Lkh znKCm8&~pF^n6Ehpu%|6n4j^d5*-8SO*A;)Iz~7ASS^aANnpNsjfAz{r3jdKfun_jW zl6dI8YB5z&7JgH4ztfE8Dc+|ze-zb-^L-|NGSP_hZ>1VvY9^+M_N*iD%oAAX2Q}h| zLz!a6{R{izeyIk8lkYGB|Bw;*ciIAfeqJ7-WMGdy?pMvYzuOk~pEBb9vwd+tVrA?~ zd6i-_+>b>(ZV&gpePO#E?)yO7!~N-??cx3cGu*$kPfri`ml@%H4cKkAaG#ms{$exS zFE_*e;byqM+X(j$+QNPP*~<-<9_}AB!u=iLaGxIz^(+)+T=Tt?8hSZLeC&`HZxiFc zU13IJ{`^Jqk>Lpv zd-{p$Au^mo!7+&J9iO+29VeLKj?eWo(H8DF?lV(l9ql|qt|Tcj5#ywxTI?sGu~T;~ zL0Ty!!fMn@F-Bk=G7^K{mP!^H*#~zKgQHz!niU*?h6h*F&)&`f>`gQ5-NlNaOl21i zgDivCFbx|l?q^WopG2R*D%Jq+GTT}2I2`SaZRz-cDRP)P<09q0F=AN!TJSLw;d3pE zkJBD~POL7#zcgQrjn0M16PPFf2)=~QwIbYD;O4$b6-L!cYk%J0p2`2!p2;(}hy=Q@ ScVer)4;eY_EIgenqW%Yh^#s8H delta 1277 zcmds%&r1|x7{{MyoXuC;b!Qz-L%}I?)eLjX4a*W!h)%UcL}7>O5DO8Zu2E^bBWAgp zp>6coq0mDfBIw6ZTZd``^H8*O2_mQrD=J0w5@Oo+%%~9b2Lug#=ledN=XvKDc-|R3 zR;9XxeXD=6-p{}o&yyqD%6j=$dE`-$i1t7ai z0!U}6tPECW#8XyceDZF-7S-0^h-&B?^y2^XmVaLsT6I+G7b7YzrGc=>qLF}5Y%T$? zn>@vsFZl&cxNsSjH3>!Pb5O7t-O|tk)J^D1qc}sGmI9#AlnYgQ#T?7%W0NSHw=B|* zTgY?VLintzB?Yk4y zc|hcZ1{aa%NB5(>oO-A*3D0zKMIy0K?Biv7?1UWtIab*=ZuhTU+|)LtJm6u&*dgcR zB&)bn)n`%z`Q6*F(&m`Q^zVhdHC7Vj>X;|>Z2g--9wQK4T!p+#;?DO4H~ zWmM%wB{DOWPI^da(d|csKxq!5K@CfB(_wBU6#}%dqYI$bj8_6gOxFOOn_d9$n%&I5 zHDk_ygXs68;!Bd$Z>KajuEx0tj;f?I@Wf+w06!gcW4^79zX}JfSdAHU)s0T{Q+)$Z ztB9_cc7UF;k=7t&8gCG*P$yR-^A6Lp$k)hY?xBN>Y<u(m zJjvMhg2PlR%r=kSYYx+_u$n_@G?^|G@rmnk(5ZlMBho;CyZzh4dakt@SrRLWC9`a- QCDGRAG0G5`Po