From: John Hodge Date: Fri, 2 Oct 2009 15:45:43 +0000 (+0800) Subject: Fixed bug where system would lock if a user task segfaulted (forgot to sti) X-Git-Tag: rel0.06~392 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=d1f16adf5f2e94e836ea6658186a6ff6d94f54d8;p=tpg%2Facess2.git Fixed bug where system would lock if a user task segfaulted (forgot to sti) Cosmetic fix to login shell Ignored tabs in CLI Shell --- diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 3663d603..c930947d 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -128,7 +128,8 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs) // If it was a user, tell the thread handler if(ErrorCode & 4) { - Warning("User Pagefault: Instruction at %p accessed %p\n", Regs->eip, Addr); + Warning("User Pagefault: Instruction at %p accessed %p", Regs->eip, Addr); + __asm__ __volatile__ ("sti"); // Restart IRQs Threads_SegFault(Addr); return ; } diff --git a/Kernel/drv/vterm.c b/Kernel/drv/vterm.c index b1d5181a..1e7138d3 100644 --- a/Kernel/drv/vterm.c +++ b/Kernel/drv/vterm.c @@ -505,6 +505,8 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch) Term->Text[ Term->WritePos ].Colour = Term->CurColour; Term->WritePos --; } while(Term->WritePos && i-- && Term->Text[ Term->WritePos ].Ch == '\0'); + if(Term->Text[ Term->WritePos ].Ch != '\0') + Term->WritePos ++; break; default: diff --git a/Kernel/threads.c b/Kernel/threads.c index e244139e..dd7cfcd2 100644 --- a/Kernel/threads.c +++ b/Kernel/threads.c @@ -265,7 +265,12 @@ int Threads_WaitTID(int TID, int *status) tThread *t = Threads_GetThread(TID); int initStatus = t->Status; int ret; - while(t->Status == initStatus) Threads_Yield(); + + if(initStatus != THREAD_STAT_ZOMBIE) + while(t->Status == initStatus) { + Threads_Yield(); + } + ret = t->RetStatus; switch(t->Status) { @@ -362,6 +367,7 @@ void Threads_Exit(int TID, int Status) Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF ); else Threads_Kill( Threads_GetThread(TID), (Uint)Status & 0xFF ); + for(;;) HALT(); // Just in case } /** @@ -433,6 +439,9 @@ void Threads_Kill(tThread *Thread, int Status) // Release spinlocks RELEASE( &Thread->IsLocked ); // Released first so that it IS released RELEASE( &giThreadListLock ); + + //Log("Thread %i went *hurk*", Thread->TID); + if(Status != -1) HALT(); } @@ -689,6 +698,6 @@ tThread *Threads_GetNextToRun(int CPU) void Threads_SegFault(tVAddr Addr) { //Threads_SendSignal( Proc_GetCurThread()->TID, SIGSEGV ); - Log("Thread #%i committed a segfault at address %p\n", Proc_GetCurThread()->TID, Addr); - Threads_Exit( 0, 0 ); + Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr); + Threads_Exit( 0, -1 ); } diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index a8db5ad6..914557a5 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -144,7 +144,7 @@ char *ReadCommandLine(int *Length) // Read In Command Line do { read(_stdin, 1, &ch); // Read Character from stdin (read is a blocking call) - // Ignore control characters + // Control characters if(ch == '\x1B') { read(_stdin, 1, &ch); // Read control character switch(ch) @@ -174,6 +174,13 @@ char *ReadCommandLine(int *Length) write(_stdout, 1, &ch); continue; } + // Tab + if(ch == '\t') { + //TODO: Implement Tab-Completion + //Currently just ignore tabs + continue; + } + // Expand Buffer if(len > space) { space += 256; diff --git a/Usermode/Applications/login_src/main.c b/Usermode/Applications/login_src/main.c index 2e4906d1..248e13b9 100644 --- a/Usermode/Applications/login_src/main.c +++ b/Usermode/Applications/login_src/main.c @@ -26,7 +26,6 @@ int main(int argc, char *argv[]) if(uid == -1) printf("\n"); sUsername = GetUsername(); sPassword = GetPassword(); - printf("\n"); } while( (uid = ValidateUser(sUsername, sPassword)) == -1 ); printf("\n");